MantisBT MCP Server
Summary: A MantisBT MCP integration for reading and managing bugs, project metadata, and related artifacts from an MCP-capable client.
Retrieve single or multiple issues, and list/filter issues by project, status, assignee, reporter, saved filter, sort, pagination, and date ranges.
Create, update (including custom fields and inline notes), and delete issues.
List, add, and delete issue notes.
List and upload issue file attachments.
Add/remove issue relationships and add/remove issue monitors.
List, attach, and detach tags.
List projects, project users, versions, and categories; find project members.
Create, update, release, and delete project versions.
Read current user, saved filters, config options, issue enums, languages, cached metadata, and MCP/MantisBT versions.
Sync the local metadata cache for projects, users, versions, categories, and tags.
README mentions optional semantic issue search when enabled, but the provided tool schema does not include the search tools.
MantisBT MCP Server
English · Deutsch
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 ≥ 22
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 |
| – | auto | Set to |
| – |
| Directory for the metadata cache |
| – |
| Cache lifetime in seconds |
| – |
| Transport mode: |
| – |
| Port for HTTP mode |
| – |
| Bind address for HTTP mode. Changed from |
| ✅ (HTTP mode) | – | Bearer token for 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 |
| – | – (all) | Comma-separated list of tool groups to offer: |
| – |
| Set to |
Limit the offered tools
Two env vars reduce the tool surface offered to the model — useful to keep the model's context shorter and to prevent accidental destructive operations:
MANTIS_TOOLSETS— include only the listed groups (comma-separated, case-insensitive)MANTIS_DISABLE_DESTRUCTIVE=true— additionally hidedelete_issue,delete_note,delete_version,remove_relationship, andremove_monitorregardless of the active groups
Hidden tools are not listed and return "Tool … not found" when called.
Group | Tools |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
¹ hidden by MANTIS_DISABLE_DESTRUCTIVE=true · † deprecated, removed in 2.0.0 · ² additionally requires MANTIS_SEARCH_ENABLED=true; without the search group the search module is not started at all
Deprecated tools always belong to the same group as their replacement — disabling a group hides old and new name together.
Example A — triage setup (issues, notes, and metadata; no destructive operations):
{
"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",
"MANTIS_TOOLSETS": "issues,notes,meta",
"MANTIS_DISABLE_DESTRUCTIVE": "true"
}
}
}
}Example B — all groups, delete-protection only (36 of the 41 default tools):
{
"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",
"MANTIS_DISABLE_DESTRUCTIVE": "true"
}
}
}
}Available tools
Issues
Tool | Description |
| Retrieve an issue by |
| Deprecated: use |
| 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 |
| Deprecated: use |
| Add a note to an issue |
| Delete a note |
Attachments
Tool | Description |
| Deprecated: use |
| Upload a file to an issue — preferred: local |
Relationships
Tool | Description |
| Create a relationship between two issues; optional |
| Remove a relationship from an issue (use the |
Monitors
Tool | Description |
| Deprecated: use |
| Deprecated: use |
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 the metadata cache) |
| Get one project's master data (id, name, status, enabled, subprojects) plus, on request, its categories, users and/or versions in one call; |
| Deprecated: use |
| Create a new version in a project; returns the created version object (id, name, description, released, obsolete, timestamp); requires |
| Update an existing version; only the fields you pass are changed (at least one required); renaming rewrites version/target_version/fixed_in_version on all referencing issues; optional |
| Deprecated: use |
| Permanently delete a version — irreversible, MantisBT clears version/target_version/fixed_in_version on all referencing issues; prefer |
| Deprecated: use |
| Deprecated: use |
| Deprecated: use |
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). When several client sessions start a server at the same time, only one of them syncs the shared index. The model is loaded on first use and unloaded again after 10 minutes without embedding, so idle sessions do not hold on to its memory (~0.9 GB per server process).
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; |
| Deprecated: use |
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 |
| Retrieve cached metadata: |
| Version of this MCP server and of the connected MantisBT installation in one response; |
| Valid |
| Deprecated: use |
| Deprecated: use |
| Deprecated: use |
| Deprecated: use |
| List saved filters |
| Retrieve your own user profile — includes |
| Deprecated: use |
| Show server configuration (base URL, cache TTL) |
| Deprecated: use |
| Deprecated: use |
Token usage
The server handles counting and field projection itself — the model receives a compact summary instead of reading raw issue lists. Measured on 2026-10-31 against a MantisBT 2.28 installation (604 issues, five issues with long descriptions/notes):
Task | Before | Tokens | After | Tokens | Saved |
Status overview of a project (604 issues) |
| 1,274,398 |
| 165 | 99.9 % |
Open issues per handler |
| 2,686 |
| 108 | 95.9 % |
5 issues with selected fields |
| 16,272 |
| 623 | 96.1 % |
¹ list_issues scans at most 500 issues when client-side filters are active, so this "before" value is understated.
Tokens estimated as characters / 4. To reproduce against your own instance (requires a git checkout, not available via npx):
MANTIS_BASE_URL=… MANTIS_API_KEY=… \
BENCHMARK_PROJECT_ID=12 BENCHMARK_ISSUE_IDS=101,102,103,104,105 \
npm run benchmarkCredentials may also come from .env.local.
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). MCP_HTTP_TOKEN is required in HTTP mode — the server refuses to start without it:
MCP_HTTP_TOKEN=secret MANTIS_BASE_URL=... MANTIS_API_KEY=... \
TRANSPORT=http PORT=3456 node dist/index.js
# With 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.jsEvery /mcp request must send Authorization: Bearer <token>. Over HTTP, upload_file's file_path is disabled unless MANTIS_UPLOAD_DIR is set — use the content (Base64) parameter instead.
Health 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 report
npm run benchmark # Token benchmark against a live MantisBT (see Token usage above)License
MIT – see LICENSE
Contributing
Contributions welcome! Please read CONTRIBUTING.md. Repository: codeberg.org/dpesch/mantisbt-mcp-server
Available Tools
41 toolsadd_monitorAdd Issue MonitorA
Deprecated: use update_issue with add_monitors instead — add_monitor will be removed in 2.0.0.
Add a user as a monitor (watcher) of a MantisBT issue. Monitors receive email notifications whenever the issue is updated. Returns { success, monitors } — "monitors" lists the login names now monitoring the issue.
Use it to subscribe team members to issue updates without assigning them as the handler.
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 get_project with member_query 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 get_project with member_query to discover valid login names for a project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly says re-adding an existing monitor is a no-op that creates no duplicates, which contradicts the annotation idempotentHint=false. Although it usefully discloses email notifications and return shape, the contradiction triggers the score-1 rule.
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 deprecation notice and purpose are front-loaded, and the description is generally efficient. It loses some concision by repeating parameter-discovery guidance already present in the schema.
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 supplies the return shape, notification behavior, and prerequisite lookups. The main gap is the contradictory idempotency statement and the lack of permission/auth context.
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 username are already documented in the schema. The description repeats the same discovery guidance (list_issues/get_issue, get_project/member_query) without adding format or constraint details, 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 gives a specific verb and resource: add a user as a monitor/watcher of a MantisBT issue. It distinguishes this from assigning a handler and explicitly names the replacement sibling, update_issue with add_monitors.
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 when to use the tool: subscribing team members to issue updates without making them the handler. It also front-loads the deprecation path to update_issue with add_monitors and lists the prerequisite lookup tools.
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 with include: ["categories"] to obtain a valid category name
Optionally add "versions" to include to obtain version names
Optionally call get_project with member_query 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_schema 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 get_project with member_query or include: ["users"] to look up valid login names. | |
| summary | Yes | Issue summary/title (required) | |
| version | No | Affected product version name. Use get_project with include: ["versions"] to list available version names for the project. | |
| category | Yes | Category name (required). Use get_project with include: ["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_schema 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_schema 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_schema 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 with include: ["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_schema to see localized labels. | |
| fixed_in_version | No | Version in which the issue was fixed. Use get_project with include: ["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 already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered; the description adds real value on top by enumerating the returned fields (id, status, view_url) and the default values applied to omitted fields. It stops short of mentioning duplicate-issue behavior or that creation is not idempotent, which is the main residual gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then required fields, then a scannable numbered workflow. Every section is useful, though the sentence about priority/severity accepting localized labels repeats the schema verbatim and could be trimmed.
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 mutation tool with no output schema, the description supplies the missing return-value contract, the required/optional split, valid-value pointers for the enum-ish fields, and the lookup calls needed to source category, version, and assignee. Nothing an agent needs to invoke it correctly is absent.
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 goes further: it restates the four required fields explicitly, gives the 'sensible defaults' for priority and severity, and resolves the handler/handler_id ambiguity that the schema alone only hints at. The priority/severity enum explanation largely duplicates the schema text, so it is not a full 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?
Opens with a specific verb+resource ('Create a new MantisBT issue') and immediately names the return payload, which separates it cleanly from update_issue, delete_issue, and the get_* siblings. An agent can pick this 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?
Provides an explicit numbered prerequisite workflow (get_project with include:["categories"] before calling, versions, member_query for assignee) and states the handler-vs-handler_id preference for interactive use. This is exactly the when/how guidance the dimension rewards, including the dependency chain that would otherwise cause a failed call.
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 get_issue (notes[].id).
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | Numeric note ID to delete — obtain from get_issue (notes[].id) | |
| issue_id | Yes | Numeric issue ID that owns the note |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds material context beyond them: irreversibility ('cannot be recovered'), the plain-text confirmation return, and the specific failure conditions (missing note, insufficient permission, manager-level access requirement). That is exactly the extra behavioral burden a destructive tool needs met.
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 verb and the irreversibility warning, then return behavior, then errors, then prerequisites as a labeled line. Every sentence carries distinct information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description explicitly states the success return (plain-text confirmation) and error cases. For a two-parameter destructive tool with full schema coverage, nothing an agent needs to call it safely 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 documented in the schema, so the baseline is 3. The description restates the note_id provenance ('obtain from get_issue') which the schema already says, and adds no new semantics for issue_id or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Permanently delete a note from a MantisBT issue' — with no ambiguity. The resource ('note' on an issue) is intrinsically separable from the sibling delete_issue and from note-related siblings like add_note/list_notes, so an agent can select it 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?
Explicitly routes the agent to get_issue to source note_id (notes[].id) and explains the permission model governing who may delete. It stops short of naming a when-not-to-use alternative (e.g., there is no 'use delete_issue instead' style exclusion), but the prerequisite chain is clearly spelled out.
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 with include: ["versions"] and without inherit 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 with include: ["versions"] to discover version IDs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive and idempotent, but the description goes well beyond them: it discloses the exact cascade (version, target_version and fixed_in_version fields cleared on all referencing issues, including subprojects when versions are inherited), irreversibility, and the access level required (manage_project_threshold, default manager).
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 destructive warning, and every paragraph covers a distinct concern (effect, alternative, ownership constraint, permissions). Slight redundancy with the schema's discovery hints 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?
No output schema exists, but the description covers everything an agent needs before calling a destructive mutation: side effects, irreversibility, an escape-hatch alternative, the inheritance trap, and permission requirements.
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 parameters are already documented. The description still adds real meaning by constraining project_id to the version's owning project and explaining that inherited versions will fail, though its discovery hint for get_project largely repeats the schema's own hint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a version of a MantisBT project') and immediately marks it as irreversible. It is clearly distinguishable from its nearest sibling update_version, which it names as the non-destructive alternative.
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 when-not: to retire a version without touching issues, use update_version with obsolete=true. It also states the precondition that the version must belong to project_id itself and that inherited versions must be changed via the parent project, with the exact error MantisBT returns.
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
Deprecated: use get_project with member_query instead — find_project_member will be removed in 2.0.0.
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 adds useful behavioral context about cache freshness and live API fallback, though it does not discuss auth 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?
The deprecation warning is front-loaded, followed by purpose, matching behavior, and cache behavior. The description is appropriately sized with no wasted 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?
Given the high schema coverage and read-only annotations, the description is nearly complete for a simple search tool. It could say more about the returned user object fields, but no output schema exists and the core behavior is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents project_id, query, and limit. The description mostly repeats the schema details, adding only the omit-query listing 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 and resource: search for users with access to a MantisBT project by name, display name, or email. It also names the replacement sibling get_project with member_query, making its deprecated role clear.
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 marks the tool as deprecated, names the alternative (get_project with member_query), and gives the removal version. It also explains the omit-query behavior for listing users.
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: id, name (login name), real_name, email, language, timezone, access_level, created_at and the accessible projects.
"language" is the MantisBT language of this user (e.g. "german", "english") — use it as the hint for which language to write issue texts and notes in, and expect localized enum labels in that language.
| 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 safety is covered. The description adds value beyond them by disclosing the exact response payload (no output schema exists) and by explaining the semantic meaning of 'language' and its downstream effects on localization — a non-obvious behavioral trait.
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 first sentence front-loads the purpose and payload; the second is a focused, non-redundant note on the one field whose semantics an agent could easily misread. 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 takes on the job of enumerating return fields and does so fully, including the localization caveat. Nothing an agent needs in order to call or interpret this zero-parameter tool 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 the baseline is 4. The description correctly conveys that no input is needed by framing the result as scoped to 'the current API key'.
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 associated with the current API key') and enumerates the fields returned. This clearly separates it from siblings like get_project_users, find_project_member, and get_project, which operate on other users or projects.
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 paragraph gives concrete usage guidance for the 'language' field: use it as the hint for which language to write issue texts and notes in, and expect localized enum labels. There is no explicit when-not or named alternative, but the implicit context (identify the authenticated caller) is clear.
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 one MantisBT issue by "id", or several by "ids" (1–50). Pass exactly one of the two.
With "id": returns the issue with all fields including notes (each with view_url), attachments and relationships, unless "select" is given. With "ids": returns { issues, requested, found, failed } — requests run in parallel (max 5 concurrent); missing or inaccessible IDs give null at their position instead of failing the call.
Use "select" to fetch only some fields, e.g. select: "notes" for just the notes or select: "attachments" for just the file attachments of an issue.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Numeric issue ID (use either id or ids) | |
| ids | No | Several issue IDs (1–50) to fetch in one call (use either id or ids) | |
| 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 establish read-only, idempotent, non-destructive semantics, yet the description still adds substantial value: the batch response envelope { issues, requested, found, failed }, max 5 concurrency, and the key non-obvious behavior that missing/inaccessible IDs yield null in place rather than failing the whole 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 core purpose, then one paragraph per argument mode, then the projection tip. No filler sentences; the batch failure semantics are stated compactly in a single clause.
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 return-shape disclosure falls to the description, and it delivers both variants including view_url on notes and the null-on-failure rule. Nothing needed 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 coverage is 100%, so the 3 baseline already holds for the id/ids descriptions and the 1–50 bound. The description goes beyond it by stating the exclusive-or constraint operationally and by showing concrete select usage (select: "notes", select: "attachments") that clarifies the projection's granularity.
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 a MantisBT issue) and explicitly covers both the single-ID and batch modes. It does not, however, distinguish itself from the near-identically named sibling get_issues or from list_issues, which an agent must disambiguate on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Pass exactly one of the two" gives a clear, explicit calling rule, and the select paragraph explains when to use projection. It stops short of naming an alternative tool or stating when to prefer get_issues/list_issues over this one.
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
Deprecated: use get_issue_schema instead — get_issue_enums will be removed in 2.0.0.
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?
Goes well beyond the readOnly/idempotent annotations: discloses the deprecation lifecycle and removal version, shows concrete return shapes for both English and localized installs, and explains the non-obvious installation-level customization case where 'name' itself is localized and no 'label' is present. It also states how each field is consumed downstream (create_issue vs update_issue).
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 deprecation notice, which is exactly right. The two full example responses overlap heavily — the localized example could have been reduced to just the 'status' fragment it already is — so a little length is spent on illustration that a one-line explanation would cover.
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, so the description carries return-value explanation entirely, and it does: sample payloads, per-field meaning, localization caveat, and downstream consumption guidance. Nothing an agent needs to call or interpret this zero-arg tool 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?
Zero parameters, so the baseline is 4; the schema is empty and needs no compensation. The description's value-format notes ('pass the canonical English name, the localized name, or the label') apply to sibling tools rather than this one's inputs, but they usefully document the output fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Return valid ID, name, and (if available) localized label for all issue enum fields' — and immediately names the sibling that supersedes it (get_issue_schema). An agent can distinguish it from get_issue_schema, get_issue_fields, and get_metadata without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing ('use this tool before creating or updating issues') and names lookup targets (severity, status, priority, resolution, reproducibility), plus a deprecation redirect to get_issue_schema. The one gap is the mild tension between 'Deprecated: use get_issue_schema instead' and 'Use this tool before creating or updating issues' — the agent isn't told which wins when both are available.
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
Deprecated: use get_issue_schema instead — get_issue_fields will be removed in 2.0.0.
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, it discloses how results are produced (sample issue fetch reflecting server configuration such as eta/projection/profile toggles), that empty-by-default fields are merged in, and that output is cached with the metadata TTL. These are exactly the operational details annotations cannot carry.
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?
Deprecation and replacement are correctly front-loaded, and each following sentence carries distinct information (scope, discovery mechanism, caching). The discovery paragraph is somewhat dense but not redundant.
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 does explain the content of the return value (field names valid for select) and the caching behavior. It stops short of describing the concrete response shape (list vs. object with metadata), which is the one thing an agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional project_id already documents its purpose (scoping the sample issue fetch). The description adds only indirect meaning via the mention of server configuration, 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?
States a specific verb+resource (return all valid field names) and scopes it precisely to the "select" parameter of list_issues and get_issue. It also names its replacement (get_issue_schema) up front, so an agent can tell it apart from the sibling schema tool immediately.
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 before constructing a 'select' string" gives an explicit trigger, and the deprecation line explicitly routes new callers to get_issue_schema. Both when-to-use and the alternative are stated, not implied.
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
Deprecated: use get_issue with ids instead — get_issues will be removed in 2.0.0.
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 already cover the safety profile, and the description adds genuinely new behavior: max 5 concurrent parallel requests, per-ID null on 404/403/error, and a guaranteed non-failing call. It also discloses the response shape ('requested', 'found', 'failed' counters) which is not derivable from annotations or schema.
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 plus a deprecation line, with the most important information (deprecation, then semantics) front-loaded. No filler and every sentence carries distinct content.
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, yet the description explains the array-with-nulls return shape and the counter fields, which is exactly what an agent needs to interpret results. Combined with the behavioral details, nothing essential is missing for a one-parameter read 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% and the single `ids` parameter is already fully documented, including the 1–50 bound and null-per-ID semantics. The description largely restates those facts rather than adding new parameter meaning, 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?
States a specific verb and resource (retrieve multiple MantisBT issues by numeric IDs in a single call) and explicitly distinguishes itself from the singular sibling get_issue. The deprecation banner is front-loaded so the agent immediately knows the status of this tool.
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 migration path — 'use get_issue with ids instead — get_issues will be removed in 2.0.0' — which tells the agent both when to use and when to avoid it. It doesn't discuss the batch-vs-single tradeoff or when batching 2–50 IDs is still preferable today, but the alternatives guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issue_schemaGet Issue SchemaARead-onlyIdempotent
Return what is valid for issues on this MantisBT server, in one response:
fields: all field names valid for the "select" parameter of get_issue, list_issues and search_issues. Discovered from a sample issue (reflects the server's active configuration) plus fields MantisBT omits when empty (notes, attachments, relationships, …); cached with the metadata TTL. fields_source tells where they came from: "cache", "live" or "static".
enums: ID, name and (if available) localized label for severity, status, priority, resolution and reproducibility. "name" or "id" is what create_issue / update_issue accept; "canonical_name" appears on localized installations.
Call it before building a "select" string or before setting enum fields.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Optional project ID to scope the sample issue used for field discovery |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses provenance (discovered from a sample issue, reflecting active server configuration), freshness behavior (cached with the metadata TTL), the fields_source values "cache"/"live"/"static", and the quirk that MantisBT omits empty notes/attachments/relationships fields. This is exactly the behavioral context annotations cannot carry.
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 summary sentence followed by two clearly labeled bullets, each sentence carrying distinct information (valid fields, provenance, enum shapes, canonical_name caveat, and the usage trigger). 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 takes on the burden of describing the return shape: field lists plus per-enum id/name/label/canonical_name. Combined with freshness and provenance details, an agent has everything needed to call it 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?
Only one parameter (project_id) and schema description coverage is 100%, so the schema already explains its purpose. The description mentions sample-issue discovery but never states that project_id scopes which sample issue is used, adding 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?
A specific verb ('Return') and resource (valid fields/enums for issues on this MantisBT server) are stated, with the two payloads (fields, enums) enumerated. It falls short of a 5 because near-duplicate siblings get_issue_enums and get_issue_fields exist and the description never explains how this tool differs from them, even though 'in one response' hints at the combined 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?
'Call it before building a "select" string or before setting enum fields' gives an explicit trigger condition tied to concrete downstream tools (get_issue, list_issues, search_issues, create_issue, update_issue). There are no exclusions or named alternatives, so an agent must infer that get_issue_enums/get_issue_fields are partial substitutes.
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
Deprecated: use get_version instead — get_mantis_version will be removed in 2.0.0.
Returns the version of the connected MantisBT installation and optionally compares it against the latest official release on GitHub.
| Name | Required | Description | Default |
|---|---|---|---|
| check_latest | No | Whether to fetch the latest MantisBT release from GitHub and compare (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description adds meaningful context beyond them: the tool may reach out to GitHub for the latest official release when comparing, which is a side effect an agent should know about. It does not describe the shape of the returned version data, but no output schema exists to cover that gap either.
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, deprecation warning front-loaded before any functional detail, zero filler. The most decision-relevant fact appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with full annotation coverage, the definition supplies everything needed: deprecation status, migration target, purpose, and the optional network-dependent comparison behavior.
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 boolean parameter check_latest is fully documented there. The description's phrase 'optionally compares' mirrors that but adds no format or default detail, 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?
States a specific verb (returns) and resource (version of the connected MantisBT installation), plus the optional GitHub comparison. It also names the sibling get_version as its replacement, so an agent can distinguish it from get_version and get_mcp_version without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly marks the tool deprecated, names the alternative (get_version) and gives the removal timeline (2.0.0). This is a textbook when-not-to-use-this / use-that-instead instruction.
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 VersionARead-onlyIdempotent
Deprecated: use get_version instead — get_mcp_version will be removed in 2.0.0.
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=false, so the safety profile is covered. The description adds lifecycle context the annotations cannot: the tool is deprecated and will disappear in 2.0.0. It doesn't describe the return shape, but that is minor for a zero-param getter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, with the deprecation warning front-loaded ahead of the functional description — the right ordering for a tool an agent should avoid. 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 no-parameter, no-output-schema version getter, the description covers purpose, migration path and lifetime. The only gap is the concrete return type/format (string vs object), which nothing else in the definition supplies.
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 there is nothing to disambiguate and the baseline is 4. The description correctly avoids wasting words on a schema that is an empty object.
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, which scopes it away from get_mantis_version (the MantisBT application version). It does not fully explain how it differs from its named successor get_version, but the deprecation framing makes the relationship clear enough.
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 NOT to use it ("Deprecated: use get_version instead"), names the alternative, and gives a removal timeline (2.0.0). This is exactly the when/when-not/alternative guidance the dimension rewards.
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 the cached MantisBT metadata (projects with their users, versions and categories, plus all tags).
detail: "summary" (default) — compact counts: project count, tag count, per-project counts of users, versions and categories, cached_at, ttl_seconds.
detail: "full" — the complete raw cache with all lists (large; minified JSON).
refresh: true — re-fetch everything from MantisBT before answering (otherwise the cache is used and only synced when missing or expired; default TTL 24 hours).
When semantic search is enabled, the response also contains "search_index": how many issues are indexed vs. the total, and the time of the last sync.
For lists of a single project use get_project with include; for tags use list_tags.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | "summary" (default): counts only; "full": the complete raw cache | summary |
| refresh | No | Re-fetch all metadata from MantisBT first (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavioral context beyond them: cache-vs-live behavior, the default 24-hour TTL, that the full view is large minified JSON, and that a search_index block appears when semantic search is enabled. Since there is no output schema, this return-shape disclosure carries the load well.
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 one-line purpose followed by compact bullets for detail and refresh, then the conditional search_index note and the hand-offs to siblings. Every sentence carries information an agent needs; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param, read-only cache reader with no output schema, the description covers return shape, size trade-off, staleness rules, and alternatives — enough to call it correctly. Completeness only suffers from the unaddressed overlap with get_metadata_full and sync_metadata.
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 genuinely adds meaning: 'summary' yields concrete fields (cached_at, ttl_seconds, per-project counts) while 'full' is flagged as large minified JSON, and 'refresh' is tied to cache invalidation rather than just 're-fetch'. Slight redundancy with the schema keeps it below 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?
States a specific verb and resource — return the cached MantisBT metadata — and enumerates its contents (projects with users, versions, categories, plus tags). It clearly routes away from get_project and list_tags, but says nothing about the identically-purposed sibling get_metadata_full, so an agent cannot fully resolve which one to call from the purpose statement alone.
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 tells the agent which alternative to use for two cases: single-project lists via get_project with include, and tags via list_tags. It also explains when to set refresh vs. rely on the cache (synced only when missing or expired, 24h TTL). The gap is that it never explains when to prefer this tool over get_metadata_full or sync_metadata, both of which overlap the 'detail: full' option and the 'refresh: true' behavior.
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
Deprecated: use get_metadata with detail: "full" instead — get_metadata_full will be removed in 2.0.0.
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 get_metadata with refresh: true to force a refresh.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly, idempotent, and non-destructive annotations, the description discloses cache expiration behavior via a default 24-hour TTL and automatic sync when the cache is missing or expired. It also gives the deprecation lifecycle and removal version, which materially affects agent behavior.
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 deprecation warning is front-loaded, followed by a concise description of returned data, cache behavior, and refresh guidance. Every sentence supplies actionable information for selecting or avoiding the 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?
There is no output schema, but the description adequately explains the returned content as the full metadata cache with all projects and per-project users, versions, categories, plus tags. Combined with the annotations and the zero-parameter schema, the definition is complete for correct invocation or avoidance.
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?
This tool has zero parameters, so there is no tool-specific parameter semantics to explain. The description references detail: "full" and refresh: true only for the replacement get_metadata tool, which is useful but not a parameter of this 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?
The description uses a specific verb and resource: it returns the complete raw MantisBT metadata cache, including projects, users, versions, categories, and tags. It also explicitly names the replacement tool and parameter combination, which distinguishes it from get_metadata and sync_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?
Usage is explicit: the tool is deprecated, should be replaced by get_metadata with detail: "full", and will be removed in 2.0.0. It also states when automatic syncing happens and how to force a refresh with get_metadata refresh: true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectGet ProjectARead-onlyIdempotent
Get one MantisBT project: its master data (id, name, description, status, enabled, view_state, access_level, subprojects) and, on request, its categories, users and versions in the same call.
include: any of "categories", "users", "versions" (default: none — master data only).
categories: names come without the "[All Projects] " prefix, ready for create_issue / update_issue.
users: id, name (login name), real_name, email, access_level. access_level returns only users at or above that level (10=viewer, 25=reporter, 40=updater, 55=developer, 70=manager, 90=administrator) and implies include "users".
member_query: case-insensitive substring search in login name, real name and email; returns all matching users. Implies include "users".
versions: id, name, released, obsolete, timestamp. obsolete=true adds obsolete versions, inherit=true adds versions of parent projects; either implies include "versions".
Users come from the local metadata cache when it is fresh and no access_level is given. Prerequisites: obtain project_id from list_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Related data to add: "categories", "users", "versions" | |
| inherit | No | Also return versions inherited from parent projects; implies include "versions" | |
| obsolete | No | Also return obsolete versions; implies include "versions" | |
| project_id | Yes | Numeric project ID — use list_projects to discover project IDs | |
| access_level | No | Only users at or above this access level; implies include "users" | |
| member_query | No | Case-insensitive substring to find users by login name, real name or email; implies include "users" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds real behavioral context beyond them: categories names are stripped of the '[All Projects] ' prefix, users come from the local metadata cache when fresh and no access_level is given, and the access_level filter semantics. These are non-obvious traits an agent could not get 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-loaded with the core purpose, then a tight bulleted list where each line carries distinct information. Slightly redundant with schema descriptions in the implies-include notes, keeping it from a 5.
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, and the description compensates by naming the returned fields for master data, categories, users (id, name, real_name, email, access_level) and versions (id, name, released, obsolete, timestamp). Combined with the cache and filtering notes, 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?
Schema coverage is 100%, so the baseline is 3; the description earns above that by adding meaning the schema lacks — the access_level numeric mapping (10=viewer ... 90=administrator), the 'default: none' behavior of include, and the fact that member_query searches three fields. It still repeats the 'implies include' notes already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one MantisBT project') and enumerates exactly what is returned (master data plus optionally categories/users/versions). This clearly distinguishes it from list_projects and from the narrower get_project_users / get_project_versions / get_project_categories 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 notes the prerequisite 'obtain project_id from list_projects' and explains how the optional sub-resources are triggered via include. It does not, however, explicitly say when to prefer this aggregated call over the dedicated get_project_users/get_project_categories siblings, leaving that routing 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
Deprecated: use get_project with include: ["categories"] instead — get_project_categories will be removed in 2.0.0.
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 cover read-only, idempotent, non-destructive safety, and the description adds genuinely non-obvious behavior: the MantisBT API prefixes global categories with "[All Projects] " and this tool strips it so names are usable in create_issue. That transformation is not derivable from schema or annotations, though return shape/pagination is not described.
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 deprecation and alternative in the first line, then a one-line purpose, then a short behavioral note. Every sentence earns its place with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers deprecation, purpose, alternative, and the prefix-stripping behavior — enough to invoke correctly for a simple single-param read tool. The only minor gap is the exact return structure, which is implied but not stated since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single documented project_id parameter, so the schema carries parameter meaning fully. The description adds nothing about the parameter (e.g., that only the given project's categories plus global ones are returned), 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?
States a specific verb and resource ("List all categories available for a MantisBT project") and immediately distinguishes itself by flagging deprecation in favor of get_project with include: ["categories"]. An agent can tell exactly what it returns and whether to call it at all.
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 this tool is deprecated and names the exact alternative invocation (get_project with include: ["categories"]), including the removal version 2.0.0. This is the strongest possible 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.
get_project_usersGet Project UsersARead-onlyIdempotent
Deprecated: use get_project with include: ["users"] instead — get_project_users will be removed in 2.0.0.
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.
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 readOnly/idempotent/non-destructive, so the bar is lower; the description adds genuine value beyond them by disclosing the return shape (id, name, real_name, email, access_level) despite there being no output schema, plus the deprecation lifecycle and required prerequisite. Minor redundancy in restating the access-level ID table, which the schema already carries for the access_level param.
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?
Deprecation warning leads, followed by purpose, return shape, and prerequisites — a sensible front-loaded order with no filler. The access-level ID enumeration is repeated from the schema and could be dropped without loss, costing it the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description covers everything an agent needs: what it returns field-by-field, how to obtain the required ID, what the access_level values mean, and that the tool is being retired in favor of a specific alternative.
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 project_id and access_level are already fully documented, including the ID-to-role mapping and 'omit to return all users' semantics. The description adds essentially no parameter meaning beyond the schema — 'obtain project_id from list_projects' repeats the schema text verbatim. 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 users with access to a specific MantisBT project") and immediately names the replacement call (get_project with include: ["users"]), so an agent can distinguish it from get_project and get_project_versions without inspecting a schema. The deprecated status and removal timeline are front-loaded.
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 to the alternative tool and the exact argument to use instead, and flags removal in 2.0.0 — a real when-not-to-use instruction. It also states a prerequisite chain (obtain project_id from list_projects), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_versionsGet Project VersionsARead-onlyIdempotent
Deprecated: use get_project with include: ["versions"] instead — get_project_versions will be removed in 2.0.0.
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?
Although annotations already declare this as read-only, idempotent, and non-destructive, the description adds substantial behavioral context: default exclusion of obsolete and inherited parent-project versions, the obsolete and inherit flags' effects, and the prerequisites for obtaining project_id. It also lists the returned version fields even though no output schema is provided.
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 deprecation notice is front-loaded, followed by purpose, return fields, related mutation tools, parameter behavior, and prerequisites. The structure is efficient and every paragraph contributes actionable 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?
Given that there is no output schema, the description compensates by listing the returned version object fields. It also covers prerequisites, default filtering behavior, and how the returned names map to issue creation and update 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 input schema already documents project_id, obsolete, and inherit fully. The description reinforces the default filtering behavior, but it largely repeats the schema's parameter documentation rather than adding new syntax or semantic detail beyond it.
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: listing all versions defined for a MantisBT project, and it names the replacement tool get_project with include: ["versions"]. It also distinguishes this read/list operation from version mutation siblings such as create_version and update_version.
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 explicitly says the tool is deprecated and should be replaced by get_project with include: ["versions"], while still explaining when to use the returned version names for create_issue and update_issue. It also gives clear alternatives for version mutation operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_versionGet VersionsARead-onlyIdempotent
Return the version of this mantisbt-mcp-server and of the connected MantisBT installation in one response: { mcp_server: { version }, mantis: { installed_version, latest_version?, status?, github_note? } }
The MantisBT version is read from the X-Mantis-Version response header. With check_latest (default: true) it is compared against the latest MantisBT release on GitHub (outbound HTTPS request, up to 5 seconds); status is "up-to-date", "update-available", "newer-than-release" or "unknown". If MantisBT cannot be reached, mantis contains "error" instead and mcp_server is still returned.
| Name | Required | Description | Default |
|---|---|---|---|
| check_latest | No | Whether to fetch the latest MantisBT release from GitHub and compare (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: discloses the X-Mantis-Version header source, the outbound HTTPS call with up to 5 seconds latency, the enumerated status values, and the graceful degradation when MantisBT is unreachable (error field while mcp_server is still returned). This is exactly the behavioral context an agent needs before invoking.
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 and the response shape, then explains the check_latest behavior and failure mode. The inline JSON sketch is slightly bulky but earns its place by documenting an otherwise unstated return 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?
There is no output schema, so the description carries the burden of describing the return value, which it does in detail including the specific keys and the error fallback. Combined with its explanation of the only parameter, 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?
Schema coverage is 100% and the parameter is already documented, but the description adds real meaning: the default of true is restated along with the consequence (GitHub fetch + comparison) and the cost (up to 5 seconds), so the agent understands the tradeoff of setting it false.
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 the version of both the mcp-server and the connected MantisBT installation, plus a clear response shape. However, sibling tools get_mcp_version and get_mantis_version exist and the description never explains how this combined tool relates to them, leaving differentiation to inference.
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 response description (use it to get both versions at once) and check_latest explains the GitHub comparison behavior. But there is no explicit when-to-use guidance or exclusion versus get_mcp_version / get_mantis_version, which an agent would need to choose correctly between near-identical siblings.
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
Deprecated: use get_issue with select: "attachments" instead — list_issue_files will be removed in 2.0.0.
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.
| 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 readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds useful behavior beyond them: the exact shape of returned objects (id, filename, size, content_type, download_url) and the empty-array case. It doesn't discuss pagination or permissions, but neither is really applicable here.
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?
Deprecation and replacement are front-loaded in the first sentence, followed by exactly the return-value detail 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?
For a one-parameter read with no output schema, the description supplies the return structure and empty-result behavior, plus the migration path. Nothing needed to call or interpret it 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 issue_id is documented there as 'Numeric issue ID', so the schema carries the parameter burden. The description adds no extra meaning about the identifier format or scoping, which is the expected 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 and resource (list file attachments of an issue) and immediately names the replacement tool and migration path. An agent can distinguish it from upload_file or get_issue without opening anything else.
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 to use get_issue with select: "attachments" instead and gives a removal version (2.0.0), which is a precise when-not-to-use and alternative directive.
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); if that limit ends the search before the page is full, the response contains "truncated": true. 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.
For overviews use "group_by" ("status", "handler", "priority" or "category"): the server counts all matching issues itself and returns { group_by, total, groups: [{ id, name, label?, count }] } instead of an issue list — far fewer tokens than listing issues and counting them. All filters still apply. If the scan stops at its limit (50,000 issues), the response contains "truncated": true.
| 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. | |
| group_by | No | Return counts per group instead of issues: "status", "handler", "priority" or "category". All matching issues are counted (page, page_size and select are ignored). | |
| 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?
Discloses behavior the annotations do not: assigned_to, reporter_id, status and date filters run client-side, so the tool auto-scans up to 500 issues internally and may set "truncated": true; page/page_size apply to the post-filter list; group_by ignores page/page_size/select and counts up to a 50,000-issue scan cap. This is exactly the operational context annotations cannot carry.
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 purpose, then organized into Note and Tip blocks covering distinct concerns. It runs long across three paragraphs, but each block addresses a real pitfall (client-side filtering, truncation, group_by output), so little is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 15-parameter tool with no output schema needs the response shape explained, and the description supplies it for both modes: a paginated issue list and the { group_by, total, groups } structure. Truncation signaling is covered for both paths, leaving nothing an agent must guess before calling.
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; the description goes further by clarifying that page/page_size index the filtered result set (a subtle and easy-to-miss semantic), and by documenting the group_by return shape and its interaction with select and pagination.
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 optional filtering, returning a paginated list. It is clear on its own, but it never distinguishes itself from the sibling get_issues, which an agent would have to open both schemas to resolve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing guidance for sub-modes: use group_by for overviews instead of listing and counting, use select for compact date queries. However, it offers no guidance on when to pick this tool over the sibling get_issues or get_issue, which is the main selection ambiguity an agent faces.
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
Deprecated: use get_current_user (field "language") instead — list_languages will be removed in 2.0.0.
Despite its name, MantisBT's GET /lang returns only the language of the current user ({ strings, language }), not a list of all languages.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnly/idempotent/non-destructive, the description adds real value: the deprecation lifecycle and, critically, the actual response shape ({ strings, language }), which contradicts what the tool name implies. That prevents an agent from assuming it returns an enumerable list. No output schema exists, so this disclosure matters, though a note on error behavior or whether strings is a map would make it complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences: the deprecation and replacement come first, followed by the name-accuracy caveat. Every clause carries actionable 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?
For a parameterless, non-destructive read with no output schema, the description supplies the two things an agent needs: a migration path and the true return shape. Nothing required to call or interpret 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?
Zero parameters, so the baseline of 4 applies. There is nothing the description could add about arguments, and it correctly signals the tool is a no-input call by describing the response rather than 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?
Explicitly states what the tool actually does — calls GET /lang and returns the current user's language payload ({ strings, language }) — and warns that the name is misleading. It also names the sibling that supersedes it, so an agent can distinguish it from get_current_user 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?
Front-loads 'Deprecated: use get_current_user (field "language") instead' with a concrete removal version (2.0.0). Both when-not-to-use and the exact alternative are stated, 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.
list_notesList Issue NotesARead-onlyIdempotent
Deprecated: use get_issue with select: "notes" instead — list_notes will be removed in 2.0.0.
List all notes (comments) attached to a MantisBT 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?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so safety is covered. The description adds lifecycle behavior (deprecation and removal version) that annotations cannot express, but says nothing about result shape, ordering, or pagination for issues with many notes. Minor gap, hence 4 rather than 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 short sentences with zero filler, and the most decision-relevant information (deprecation + replacement) is front-loaded before the functional description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only listing tool with a fully documented schema and no output schema, the description covers purpose, safety implications (via annotations), and migration path. The only missing piece is what the returned note objects look like, which matters somewhat since no output schema exists.
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?
Only one parameter (`issue_id`), and the schema documents it at 100% coverage with a 'Numeric issue ID' description and numeric bounds. The description adds nothing about the parameter, so the schema does all the work — 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 and resource ('List all notes (comments) attached to a MantisBT issue') and parenthetically disambiguates 'notes' as comments. It also declares the tool's deprecation status up front, so an agent immediately knows what it does and that it is legacy.
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 when-not-to-use rule and a named replacement with exact invocation syntax (`get_issue` with `select: "notes"`), plus a removal timeline (2.0.0). This is about as actionable a routing instruction as a deprecated tool can carry.
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 get_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 readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. Beyond that, the description adds genuinely useful behavioral context: the data source may be a live REST endpoint or a stale local cache, which affects trustworthiness of results. It doesn't disclose pagination behavior or the shape of a tag object, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, purpose front-loaded, then the fallback caveat. No filler, and the conditional behavior is stated compactly before the agent would need it.
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, so the description should at least hint at what a tag record contains or how pagination results are ordered/totaled; it does neither. The source-fallback behavior is covered well, but an agent cannot predict the return payload from the definition alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with page and page_size fully documented including defaults and bounds. The description adds nothing about pagination semantics, so the baseline 3 applies — the schema is doing all the work here.
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' — which is unambiguous and distinct from siblings like attach_tags or detach_tag. It doesn't explicitly name a sibling alternative, but no other sibling lists tags, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives the operational condition under which the tool behaves differently: it uses GET /tags if available and falls back to the local metadata cache populated by get_metadata otherwise. That tells an agent the dependency on prior get_metadata/sync_metadata calls, though it stops short of explicit when-to-use-vs-alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_versionRelease VersionA
Deprecated: use update_version with released=true, timestamp and (optionally) next_version instead — release_version will be removed in 2.0.0.
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 with include: ["versions"] and without inherit 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 with include: ["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?
Annotations describe it as a non-readonly, non-idempotent operation, and the description adds substantial behavioral context: default timestamp, follow-up version naming behavior, non-atomic two-call behavior, partial-failure semantics, inherited-version restrictions, and required access level.
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 deprecation notice and replacement path are front-loaded, followed by the core behavior and then caveats. Despite its length, each paragraph contributes necessary operational detail and there is no 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?
No output schema exists, and the description still documents the return shape, including next_version_error on partial failure. It also covers permission requirements, inherited-version handling, and how to discover relevant IDs.
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 still adds meaning beyond the schema by explaining that next_version is used as-is without automatic numbering and that it is created as a separate API call whose failure does not roll back the release.
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 action and resource: mark a version as released and set its date, with an optional follow-up version. It also explicitly identifies itself as deprecated and points to update_version, which clearly distinguishes it from the sibling tool.
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 alternatives (use update_version with released=true, timestamp, and optionally next_version), explains when next_version is created, and states that inherited versions must be changed via the parent project. Access requirements and discovery paths are also provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_monitorRemove Issue MonitorADestructiveIdempotent
Deprecated: use update_issue with remove_monitors instead — remove_monitor will be removed in 2.0.0.
Remove a user from the monitor list of a MantisBT issue. The user will no longer receive email notifications for updates to this issue.
Returns { success, removed, monitors } — "monitors" lists the login names still monitoring the issue. If the user was not a monitor, the call succeeds with removed=false and nothing is changed.
Removing another user requires the monitor_delete_others_bug_threshold access level; without it the call returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | Numeric issue ID | |
| username | Yes | MantisBT login name (not the display name) of the monitor to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=true), the description discloses the return shape ({ success, removed, monitors }), the idempotent behavior when the user is not a monitor (removed=false, no change), and the authorization requirement with error behavior, adding substantial 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?
The description is front-loaded with the deprecation warning (most critical for current use), followed by a clear explanation, return details, and prerequisites. Every sentence is purposeful and no information is redundant.
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?
Given the tool's simplicity (two parameters, no output schema), the annotations and schema together with the description provide complete context: what the tool does, how to use it or not, return values, edge cases, and authorization needs. Nothing essential 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 the schema already documents both parameters fully. The description does not add meaning beyond what the schema provides; it reinforces the action but does not clarify parameter formats or constraints further.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action (remove a user) and resource (monitor list of a MantisBT issue), and it distinguishes itself from the sibling add_monitor by focusing on removal and deprecation in favor of update_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?
Explicitly marks the tool as deprecated and directs to update_issue with remove_monitors instead, providing a clear when-not-to-use and alternative. Additionally, it specifies the access level required for removing other users, giving a prerequisite condition.
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
Deprecated: use get_metadata with refresh: true instead — sync_metadata will be removed in 2.0.0.
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 say readOnlyHint=false, idempotent=false and destructiveHint=false; the description explains that it writes to a local cache valid for 24h, consistent with that profile. It additionally discloses a cost/failure mode an agent could not infer: on MantisBT < 2.26 the tag endpoint is absent and tags are collected by scanning all issues across all 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 the deprecation warning, which is the most important information. Slightly redundant tail: "This is useful for getting a complete overview…" and "Use this tool to refresh stale data" restate what the preceding sentences already cover.
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, side-effecting cache-population tool with annotations covering the safety profile, the description covers scope, staleness policy and the legacy-installation fallback. The one gap is that it never says what the call returns (counts, confirmation, errors) and no output schema exists to cover that.
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 semantics to add. The description's mention of MANTIS_CACHE_TTL is useful context but is an environment variable, not a tool argument.
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: fetch projects plus their users, versions, categories and tags from MantisBT into a local metadata cache. The deprecation notice names the replacement (get_metadata with refresh: true), so an agent can route away from it immediately.
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 ("Use this tool to refresh stale data") and when not to (deprecated, superseded by get_metadata with refresh: true). It also gives the cache validity window and the MANTIS_CACHE_TTL override, which determines whether a refresh is needed at all.
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: <user_id> } or { name: "" }
priority: { name: "<priority_name>" }
severity: { name: "<severity_name>" }
reproducibility: { name: "<reproducibility_name>" }
category: { name: "<category_name>" }
version: { name: "<version_name>" } (affected version)
target_version: { name: "<version_name>" }
fixed_in_version: { name: "<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_schema to discover fields)
notes: [{ id: <note_id>, text?: "", view_state?: "public"|"private" }] (edits existing notes; note IDs come from get_issue. An omitted view_state keeps the note's current visibility. To add a new note use the "note" parameter or add_note.)
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.
Use "add_monitors" / "remove_monitors" (lists of MantisBT login names) to change who watches the issue — "fields" may be omitted then. The response contains "monitors" with added/removed/not_monitoring and the current monitor list. Adding or removing other users requires the monitor_add_others_bug_threshold / monitor_delete_others_bug_threshold access level.
Steps run in order: fields, monitors, note. Once one step succeeded, a later failure is reported inline ("notes_error" when a note edit was not applied, "monitors_error", "note_error") instead of failing the call — do not retry the steps that went through. Only if every requested step failed is the call an error.
| 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 | No | Fields to update (partial update — only provided fields are changed; unknown keys are rejected). May be omitted when only add_monitors, remove_monitors or note are given. | |
| 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. | |
| add_monitors | No | MantisBT login names to add as monitors (watchers) of the issue | |
| note_view_state | No | Visibility of the appended note: "public" (default) or "private". Only used when "note" is set. | public |
| remove_monitors | No | MantisBT login names to remove from the monitors of the issue; names that are not monitoring are ignored |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the write/non-idempotent/non-destructive profile; the description goes far beyond that by disclosing execution order (fields, monitors, note), non-atomic failure semantics (inline notes_error / monitors_error / note_error rather than call failure), and the "do not retry the steps that went through" rule. It also names the access-level thresholds required to add or remove other users as monitors, which annotations cannot express.
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 field list is a scannable bulleted block preceded by the key scope sentence, so it is front-loaded and structured rather than rambling. A little redundancy remains — e.g. "no separate add_note call needed" repeats what the schema's note description already says — but nearly every sentence carries operational 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 7-parameter nested-object mutation with no output schema, the description covers the critical unknowns: step ordering, partial-failure reporting keys, and monitor permissions. It does mention the "monitors" response shape but says nothing about the primary return payload after a successful field update, and dry_run behavior is only documented in the 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 coverage is already 100%, so the baseline is 3, but the description adds genuine meaning: the allowed status name ladder, a concrete resolution example (id 20 = fixed/resolved), the partial-change semantics of custom_fields, and the rule that an omitted note view_state preserves current visibility. Minor gap: dry_run and note_view_state are never mentioned in the description text, leaving those entirely to 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?
Opens with a specific verb and resource ("Update one or more fields of an existing MantisBT issue using a partial PATCH") and immediately scopes the operation as partial rather than a full replace. It then enumerates the accepted field set, so an agent can tell it apart from create_issue, add_note, or add_monitor 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?
Explicitly routes between siblings: use the "note" parameter for a note alongside field changes versus add_note for a note alone, use add_monitors/remove_monitors for watchers, and get_issue_schema to discover custom fields. It also states a conditional rule (always set BOTH status and resolution when resolving) and that "fields" may be omitted for monitor-only calls.
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 (e.g. the release date).
To release a version: released=true, timestamp=, and optionally next_version= to create the follow-up version in the same call. With next_version the response is { version: , next_version: } — or next_version_error: if creating the follow-up failed (the update itself stays in effect). Without next_version the response is the updated version object.
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 with include: ["versions"] and without inherit 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 with include: ["versions"] to discover version IDs | |
| description | No | New version description | |
| next_version | No | Only with released=true: name of a follow-up version to create as unreleased placeholder, e.g. "1.2.1". Used as-is — no automatic numbering. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: renaming rewrites issue version fields including subprojects, released=true does not update the version date, next_version has distinct response and error behavior, and inherited versions are rejected with 'Version not found'. It also discloses the required access threshold. No contradiction with readOnlyHint=false, idempotentHint=true, or destructiveHint=false is apparent.
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 front-loaded with the core action and then organized around side effects, release workflow, response shapes, project scoping, and permissions. It is appropriately detailed for a mutation tool with side effects, but it is somewhat dense and repeats the normal return shape after already stating it in the opening sentence.
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?
Given the eight parameters, side effects, access requirement, and absence of an output schema, the description is complete enough to call the tool correctly. It covers discovery, inheritance restrictions, release behavior, follow-up version creation, error behavior for next_version, and return object shapes.
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?
Although schema coverage is already 100%, the description adds meaningful cross-parameter semantics: timestamp must be passed with released=true to set the release date, next_version is only valid with released=true, and next_version changes the response shape. It also explains that project_id must be the owning project rather than a parent whose inherited version is being referenced.
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 MantisBT project version, with partial-update semantics and return shape. It is clear overall, but it overlaps with the sibling release_version tool by explaining release behavior without naming release_version or disambiguating when to use it instead.
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 strong operational guidance: only passed fields change, releasing requires released=true plus timestamp, next_version creates a follow-up, inherited versions must be changed via the parent project, and manage_project_threshold access is required. It also points to get_project for discovering a project's own versions. The main gap is that it does not explicitly compare with sibling tools such as release_version, create_version, or delete_version.
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 get_issue with select: "attachments".
| 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 declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the safety profile is already covered; the description adds that issue fields/status are untouched and that metadata is returned on success. The server-side filesystem read and its HTTP-transport restriction plus the MANTIS_UPLOAD_DIR configuration requirement are genuinely valuable context not in the annotations. Minor gap: it doesn't warn about duplicate uploads on retry (consistent with idempotentHint=false) or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, side-effect scope, and return value, then a clean two-mode block followed by the alternative tool. It is somewhat verbose — the file_path bullet packs transport, config, and naming concerns into one dense sentence — but nearly every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with no output schema, the description covers the required issue_id context, both input modes and their exclusivity, filename handling, MIME defaults, and what 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 baseline is 3; the description earns an extra point by explaining filename derivation from file_path and the override behavior, the content_type default, and the mutual exclusivity of the two input modes. Some of this duplicates schema text ('Preferred', 'Fallback', 'mutually exclusive'), so it is additive rather than transformative.
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 ('Upload a file as an attachment to a MantisBT issue') and immediately scopes the side effect ('without modifying any issue fields or status'). It also distinguishes itself from sibling read/list tools by naming get_issue with select: "attachments" as the way to enumerate attachments.
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 decision rules: file_path is preferred whenever the file exists on disk, content is the fallback for in-memory data, and exactly one must be supplied. It also names the alternative tool for listing attachments and flags that file_path is unavailable over HTTP transport unless MANTIS_UPLOAD_DIR is configured.
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.
15 tool updates
v1.15.0- Changed
add_monitor1 field changed- changed
Input schema / properties / username / descriptionPrevious 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."New value: +"MantisBT login name (not the display name) of the user to add as monitor. Use get_project with member_query to discover valid login names for a project."
- Changed
create_issue9 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Category name (required). Use get_project_categories to list available categories for the project."New value: +"Category name (required). Use get_project with include: [\"categories\"] to list available categories for the project." - changed
Input schema / properties / custom_fields / descriptionPrevious value: -"Custom field values: [{field: {id|name}, value: \"<string>\"}]. Use get_issue_fields or get_metadata to discover available custom fields per project."New value: +"Custom field values: [{field: {id|name}, value: \"<string>\"}]. Use get_issue_schema or get_metadata to discover available custom fields per project." - changed
Input schema / properties / fixed_in_version / descriptionPrevious value: -"Version in which the issue was fixed. Use get_project_versions to list available version names."New value: +"Version in which the issue was fixed. Use get_project with include: [\"versions\"] to list available version names." - changed
Input schema / properties / handler / descriptionPrevious 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."New value: +"MantisBT login name of the assignee. The server resolves the name to a user ID from the project member list. Use get_project with member_query or include: [\"users\"] to look up valid login names." - changed
Input schema / properties / priority / descriptionPrevious value: -"Priority level. Canonical English names: none, low, normal, high, urgent, immediate. Default: \"normal\". Use get_issue_enums to see localized labels."New value: +"Priority level. Canonical English names: none, low, normal, high, urgent, immediate. Default: \"normal\". Use get_issue_schema to see localized labels." - changed
Input schema / properties / reproducibility / descriptionPrevious 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."New value: +"How reliably the issue reproduces. Canonical English names: always, sometimes, random, have not tried, unable to reproduce, N/A. Use get_issue_schema to see localized labels." - changed
Input schema / properties / severity / descriptionPrevious value: -"Severity level. Canonical English names: feature, trivial, text, tweak, minor, major, crash, block. Default: \"minor\". Use get_issue_enums to see localized labels."New value: +"Severity level. Canonical English names: feature, trivial, text, tweak, minor, major, crash, block. Default: \"minor\". Use get_issue_schema to see localized labels." - changed
Input schema / properties / target_version / descriptionPrevious value: -"Target fix version — version in which the issue is planned to be resolved. Use get_project_versions to list available version names."New value: +"Target fix version — version in which the issue is planned to be resolved. Use get_project with include: [\"versions\"] to list available version names." - changed
Input schema / properties / version / descriptionPrevious value: -"Affected product version name. Use get_project_versions to list available version names for the project."New value: +"Affected product version name. Use get_project with include: [\"versions\"] to list available version names for the project."
- Changed
delete_note2 fields changed- changed
Input schema / properties / issue_id / descriptionPrevious value: -"Numeric issue ID that owns the note — use get_issue or list_notes to identify this value"New value: +"Numeric issue ID that owns the note" - changed
Input schema / properties / note_id / descriptionPrevious value: -"Numeric note ID to delete — obtain from get_issue (notes[].id) or list_notes"New value: +"Numeric note ID to delete — obtain from get_issue (notes[].id)"
- Changed
delete_version1 field changed- changed
Input schema / properties / version_id / descriptionPrevious value: -"Numeric version ID — use get_project_versions to discover version IDs"New value: +"Numeric version ID — use get_project with include: [\"versions\"] to discover version IDs"
- Changed
get_issue3 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Numeric issue ID"New value: +"Numeric issue ID (use either id or ids)" - added
Input schema / properties / idsAdded value: +{ + "description": "Several issue IDs (1–50) to fetch in one call (use either id or ids)", + "items": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" +} - removed
Input schema / requiredRemoved value: -[ - "id" -]
- Added
get_issue_schema - Changed
get_mantis_version1 field changed- changed
Input schema / properties / check_latest / descriptionPrevious value: -"Whether to fetch the latest release from GitHub and compare (default: true)"New value: +"Whether to fetch the latest MantisBT release from GitHub and compare (default: true)"
- Changed
get_metadata2 fields changed- added
Input schema / properties / detailAdded value: +{ + "default": "summary", + "description": "\"summary\" (default): counts only; \"full\": the complete raw cache", + "enum": [ + "summary", + "full" + ], + "type": "string" +} - added
Input schema / properties / refreshAdded value: +{ + "default": false, + "description": "Re-fetch all metadata from MantisBT first (default: false)", + "type": "boolean" +}
- Added
get_project - Added
get_version - Changed
list_issues1 field changed- added
Input schema / properties / group_byAdded value: +{ + "description": "Return counts per group instead of issues: \"status\", \"handler\", \"priority\" or \"category\". All matching issues are counted (page, page_size and select are ignored).", + "enum": [ + "status", + "handler", + "priority", + "category" + ], + "type": "string" +}
- Changed
release_version1 field changed- changed
Input schema / properties / version_id / descriptionPrevious value: -"Numeric version ID — use get_project_versions to discover version IDs"New value: +"Numeric version ID — use get_project with include: [\"versions\"] to discover version IDs"
- Changed
remove_monitor1 field changed- changed
Input schema / properties / username / descriptionPrevious value: -"Username of the monitor to remove"New value: +"MantisBT login name (not the display name) of the monitor to remove"
- Changed
update_issue5 fields changed- added
Input schema / properties / add_monitorsAdded value: +{ + "description": "MantisBT login names to add as monitors (watchers) of the issue", + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Fields to update (partial update — only provided fields are changed; unknown keys are rejected)"New value: +"Fields to update (partial update — only provided fields are changed; unknown keys are rejected). May be omitted when only add_monitors, remove_monitors or note are given." - added
Input schema / properties / fields / properties / notesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "id": { + "description": "ID of the note to edit (from get_issue)", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "text": { + "description": "New note text", + "minLength": 1, + "type": "string" + }, + "view_state": { + "description": "New visibility; omitted = keep the current one", + "enum": [ + "public", + "private" + ], + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / remove_monitorsAdded value: +{ + "description": "MantisBT login names to remove from the monitors of the issue; names that are not monitoring are ignored", + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "id", - "fields" -]New value: +[ + "id" +]
- Changed
update_version2 fields changed- added
Input schema / properties / next_versionAdded value: +{ + "description": "Only with released=true: name of a follow-up version to create as unreleased placeholder, e.g. \"1.2.1\". Used as-is — no automatic numbering.", + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / version_id / descriptionPrevious value: -"Numeric version ID — use get_project_versions to discover version IDs"New value: +"Numeric version ID — use get_project with include: [\"versions\"] to discover version IDs"
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" +}
TDQS
Scored across 41 tools
A large fraction of the surface is deprecated aliases whose functionality is already covered by newer tools: get_issues vs get_issue, list_notes/list_issue_files vs get_issue select, add_monitor/remove_monitor vs update_issue, get_project_users/versions/categories/find_project_member vs get_project, get_issue_enums/get_issue_fields vs get_issue_schema, and get_mcp_version/get_mantis_version vs get_version. The deprecation notes prevent outright confusion, but an agent must still choose between multiple tools that do the same thing, which is exactly the overlap this dimension penalizes.
Nearly all tools follow a predictable snake_case verb_noun pattern (get_issue, create_issue, list_projects, add_note, delete_version). Minor deviations exist in the version tools (get_version alongside get_mcp_version/get_mantis_version) and a few noun-first resource names like list_issue_files, but the convention remains readable throughout.
41 tools is well above the 25-tool threshold for a heavy surface, and a significant portion (roughly a dozen) are deprecated shims that duplicate newer tools. The effective useful surface is much smaller than 41, making the count poorly scoped for the server's purpose.
Core issue lifecycle is well covered: list/get/create/update/delete issues, notes, attachments, monitors, relationships, tags, versions CRUD, projects, schema, config, and metadata. Remaining gaps are minor—no attachment deletion, no project/category/tag create-update-delete tools—but agents can work around these, and the deprecated aliases still provide coverage for older clients.
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.814 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
- AlicenseAqualityDmaintenanceProvides AI assistants with direct access to MantisBT issue trackers via the REST API, enabling reading, updating, resolving, and semantically searching issues.2013 npmMIT