Skip to main content
Glama

MantisBT MCP Server

npm version license MCP compatible MCP Badge 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

MANTIS_BASE_URL

✅

–

Base URL of your MantisBT installation. Both https://your-mantis.example.com and https://your-mantis.example.com/api/rest are accepted — the /api/rest suffix is normalized automatically.

MANTIS_API_KEY

✅

–

API token for authentication

MANTIS_USE_INDEX_PHP

–

auto

Set to true when URL rewriting is unavailable — REST requests then use /api/rest/index.php/ instead of /api/rest/. Detected automatically when MANTIS_BASE_URL ends with /api/rest/index.php; an explicit value always wins. See the cookbook.

MANTIS_CACHE_DIR

–

~/.cache/mantisbt-mcp

Directory for the metadata cache

MANTIS_CACHE_TTL

–

3600

Cache lifetime in seconds

TRANSPORT

–

stdio

Transport mode: stdio or http

PORT

–

3000

Port for HTTP mode

MCP_HTTP_HOST

–

127.0.0.1

Bind address for HTTP mode. Changed from 0.0.0.0 to 127.0.0.1 — the server now listens on localhost only by default. Set to 0.0.0.0 for Docker or remote access.

MCP_HTTP_TOKEN

✅ (HTTP mode)

–

Bearer token for the /mcp endpoint (Authorization: Bearer <token>). Required when TRANSPORT=http — the server refuses to start in HTTP mode without it, so tools are never exposed unauthenticated. Ignored in stdio mode. The /health endpoint is always public.

MANTIS_SEARCH_ENABLED

–

false

Set to true to enable semantic search

MANTIS_SEARCH_BACKEND

–

vectra

Vector store backend: vectra (pure JS) or sqlite-vec (requires manual install)

MANTIS_SEARCH_DIR

–

{MANTIS_CACHE_DIR}/search

Directory for the search index

MANTIS_SEARCH_MODEL

–

Xenova/paraphrase-multilingual-MiniLM-L12-v2

Embedding model name (downloaded once on first use, ~80 MB)

MANTIS_SEARCH_THREADS

–

1

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.

MANTIS_UPLOAD_DIR

–

–

Restrict upload_file's file_path to files within this directory (path traversal via ../ is blocked). In stdio mode file_path is unrestricted unless this is set. In HTTP mode file_path reads from the server's filesystem, so it is disabled unless this variable is set — HTTP clients should upload via the content (Base64) parameter instead.

MANTIS_TOOLSETS

–

– (all)

Comma-separated list of tool groups to offer: issues, notes, links, files, projects, versions, meta, search (case-insensitive). Unset or empty means all groups. The search group additionally requires MANTIS_SEARCH_ENABLED=true; without the group the search module is not started at all. An unknown group name stops the server at startup with a message listing the valid names. See Limit the offered tools and the cookbook.

MANTIS_DISABLE_DESTRUCTIVE

–

false

Set to true to hide every destructive tool — delete_issue, delete_note, delete_version, remove_relationship, remove_monitor — regardless of the active groups. Hidden tools are not listed and return "Tool … not found" when called.

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 hide delete_issue, delete_note, delete_version, remove_relationship, and remove_monitor regardless of the active groups

Hidden tools are not listed and return "Tool … not found" when called.

Group

Tools

issues

get_issue, list_issues, create_issue, update_issue, delete_issue¹, get_issues†, list_notes†, list_issue_files†, add_monitor†, remove_monitor†¹

notes

add_note, delete_note¹

links

add_relationship, remove_relationship¹, attach_tags, detach_tag, list_tags

files

upload_file

projects

list_projects, get_project, list_filters, get_project_categories†, get_project_users†, get_project_versions†, find_project_member†

versions

create_version, update_version, delete_version¹, release_version†

meta

get_metadata, get_issue_schema, get_config, get_version, get_current_user, get_metadata_full†, sync_metadata†, get_search_index_status†, get_issue_fields†, get_issue_enums†, get_mcp_version†, get_mantis_version†, list_languages†

search

search_issues, rebuild_search_index ²

¹ 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

get_issue

Retrieve an issue by id, or several by ids (1–50) in one call — pass exactly one; with ids returns { issues, requested, found, failed }, missing or inaccessible IDs give null at their position; optional select for field projection

get_issues

Deprecated: use get_issue with ids instead — will be removed in 2.0.0

list_issues

Filter issues by project, status, author, and more; optional select for field projection and status for client-side status filtering — canonical English status names (e.g. "new", "resolved") are matched by ID, making the filter language-independent on localized installations; group_by ("status", "handler", "priority", "category") returns counts per group instead of an issue list — all filters still apply, page, page_size, and select are ignored

create_issue

Create a new issue; severity and priority must be canonical English names (e.g. minor, major, normal, high) — call get_issue_schema to see all valid values and their localized labels; optional handler parameter accepts a username as alternative to handler_id (resolved against project members); optional custom_fields to set custom field values

update_issue

Update an existing issue; enum fields (status, priority, severity, resolution, reproducibility) accept canonical English names, localized names, or numeric IDs — the server resolves names to IDs automatically; supports custom_fields and an optional note parameter that appends a note in the same call; fields may be omitted when only add_monitors, remove_monitors, or note are given; use add_monitors / remove_monitors (arrays of login names) to add or remove watchers — the response includes a monitors key with the current and changed monitor lists; use fields.notes to edit existing notes by ID (note ID from get_issue)

delete_issue

Delete an issue

Notes

Tool

Description

list_notes

Deprecated: use get_issue with select: "notes" instead — will be removed in 2.0.0

add_note

Add a note to an issue

delete_note

Delete a note

Attachments

Tool

Description

list_issue_files

Deprecated: use get_issue with select: "attachments" instead — will be removed in 2.0.0

upload_file

Upload a file to an issue — preferred: local file_path (server reads and encodes automatically); fallback: Base64-encoded content + filename (use only when file_path is not available)

Relationships

Tool

Description

add_relationship

Create a relationship between two issues; optional type_name parameter accepts a string name (e.g. "related_to", "duplicate_of") as alternative to numeric type_id

remove_relationship

Remove a relationship from an issue (use the id from the relationship object, not the type)

Monitors

Tool

Description

add_monitor

Deprecated: use update_issue with add_monitors instead — will be removed in 2.0.0

remove_monitor

Deprecated: use update_issue with remove_monitors instead — will be removed in 2.0.0

Tags

Tool

Description

list_tags

List all available tags; falls back to the metadata cache when GET /tags returns 404 (run get_metadata with refresh: true first to populate)

attach_tags

Attach tags to an issue

detach_tag

Remove a tag from an issue

Projects

Tool

Description

list_projects

List all accessible projects; returns normalized project data (consistent with the metadata cache)

get_project

Get one project's master data (id, name, status, enabled, subprojects) plus, on request, its categories, users and/or versions in one call; access_level and member_query imply users; obsolete/inherit imply versions

get_project_versions

Deprecated: use get_project with include: ["versions"] instead — will be removed in 2.0.0

create_version

Create a new version in a project; returns the created version object (id, name, description, released, obsolete, timestamp); requires manage_project_threshold (default: manager)

update_version

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 next_version (only with released: true) creates a follow-up version in the same call; requires manage_project_threshold (default: manager)

release_version

Deprecated: use update_version with released: true, timestamp, and optionally next_version instead — will be removed in 2.0.0

delete_version

Permanently delete a version — irreversible, MantisBT clears version/target_version/fixed_in_version on all referencing issues; prefer update_version with obsolete=true as the non-destructive alternative; requires manage_project_threshold (default: manager)

get_project_categories

Deprecated: use get_project with include: ["categories"] instead — will be removed in 2.0.0

get_project_users

Deprecated: use get_project with include: ["users"] instead — will be removed in 2.0.0

find_project_member

Deprecated: use get_project with member_query instead (no limit, returns all matches) — will be removed in 2.0.0

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

search_issues

Natural language search over all indexed issues — returns top-N results with cosine similarity score; optional select (comma-separated field names) enriches each result with the requested issue fields; optional highlight (boolean, default false) adds a highlights field per result with keyword-matched excerpts from summary and description (matched terms shown in **bold**)

rebuild_search_index

Build or update the search index; full: true clears and rebuilds from scratch

get_search_index_status

Deprecated: use get_metadata (field search_index) instead — will be removed in 2.0.0

Which backend to choose?

vectra (default)

sqlite-vec

Dependencies

None (pure JS)

Requires native build tools

Install

Included

npm install sqlite-vec better-sqlite3

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-vec

Metadata & system

Tool

Description

get_metadata

Retrieve cached metadata: detail: "summary" (default) returns project/tag counts and per-project user/version/category counts; detail: "full" returns the complete raw cache; refresh: true re-fetches from MantisBT first; with semantic search enabled the response also contains a search_index block

get_version

Version of this MCP server and of the connected MantisBT installation in one response; check_latest (default true) compares MantisBT with the latest GitHub release; mantis holds error when MantisBT cannot be reached

get_issue_schema

Valid select fields (fields, fields_source) and enum values (enums: severity, status, priority, resolution, reproducibility) for this MantisBT server in one response; optional project_id scopes the field discovery — use before create_issue / update_issue or when building a select string

get_issue_fields

Deprecated: use get_issue_schema instead — will be removed in 2.0.0

get_issue_enums

Deprecated: use get_issue_schema instead; the resource mantis://enums stays — will be removed in 2.0.0

get_metadata_full

Deprecated: use get_metadata with detail: "full" instead — will be removed in 2.0.0

sync_metadata

Deprecated: use get_metadata with refresh: true instead — will be removed in 2.0.0

list_filters

List saved filters

get_current_user

Retrieve your own user profile — includes language (the user's MantisBT language, a hint for which language to use in issue texts and notes)

list_languages

Deprecated: use get_current_user (field language) instead — will be removed in 2.0.0

get_config

Show server configuration (base URL, cache TTL)

get_mantis_version

Deprecated: use get_version instead — will be removed in 2.0.0

get_mcp_version

Deprecated: use get_version instead — will be removed in 2.0.0

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)

list_issues, all pages

1,274,398

list_issues + group_by: "status"

165

99.9 %

Open issues per handler

list_issues status "open" + select, all pages ¹

2,686

list_issues + group_by: "handler"

108

95.9 %

5 issues with selected fields

get_issue ids, no select

16,272

get_issue ids + select

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 benchmark

Credentials 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

mantis://me

Profile of the authenticated API user (live fetch)

mantis://projects

All accessible MantisBT projects as a compact list (cache-backed, refreshed via get_metadata with refresh: true)

mantis://projects/{id}

Combined project view: project fields + users + versions + categories in one call; cache-first, list-support for enumerating all available project URIs

mantis://enums

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

create-bug-report

project_id, category, summary, description

steps_to_reproduce, expected, actual, environment

Guides through a structured bug report and calls create_issue

create-feature-request

project_id, category, summary, description

use_case

Guides through a feature request and calls create_issue

summarize-issue

issue_id

–

Fetches an issue via get_issue and returns a concise summary

project-status

project_id

–

Lists issues via list_issues and generates a status report grouped by severity

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.js

Every /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 tools
add_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.

NameRequiredDescriptionDefault
issue_idYesNumeric issue ID — use list_issues or get_issue to obtain issue IDs
usernameYesMantisBT 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

A3.7/5.0
Behavior1/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so both issue_id and 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.

Purpose5/5

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

The description gives a specific verb and resource: 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.

Usage Guidelines5/5

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

It states when to use the tool: 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.

NameRequiredDescriptionDefault
textYesNote text (minimum 1 character). Full UTF-8 including emoji is supported. Markdown is stored as-is.
issue_idYesNumeric issue ID — use list_issues or get_issue to obtain issue IDs
view_stateNoVisibility of the note: "public" (visible to all, default) or "private" (visible only to users with sufficient access level).public

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
type_idNoRelationship 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_idYesThe source issue ID (the one the relationship is added to)
target_idYesThe target issue ID
type_nameNoRelationship 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

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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).

NameRequiredDescriptionDefault
tagsYesTags to attach — each entry needs at least id or name
issue_idYesNumeric issue ID

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. 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.

Purpose5/5

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.

Usage Guidelines4/5

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:

  1. Call get_project with include: ["categories"] to obtain a valid category name

  2. Optionally add "versions" to include to obtain version names

  3. 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.

NameRequiredDescriptionDefault
handlerNoMantisBT 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.
summaryYesIssue summary/title (required)
versionNoAffected product version name. Use get_project with include: ["versions"] to list available version names for the project.
categoryYesCategory name (required). Use get_project with include: ["categories"] to list available categories for the project.
priorityNoPriority level. Canonical English names: none, low, normal, high, urgent, immediate. Default: "normal". Use get_issue_schema to see localized labels.normal
severityNoSeverity level. Canonical English names: feature, trivial, text, tweak, minor, major, crash, block. Default: "minor". Use get_issue_schema to see localized labels.minor
handler_idNoNumeric user ID of the assignee. Alternative to the handler field — use one or the other, not both.
project_idYesProject ID the issue belongs to — use list_projects to discover project IDs
view_stateNoVisibility of the issue: "public" (visible to all, default) or "private" (restricted to higher-access users).
descriptionYesDetailed issue description (required). Do not create issues without a description. Plain text or Markdown.
custom_fieldsNoCustom field values: [{field: {id|name}, value: "<string>"}]. Use get_issue_schema or get_metadata to discover available custom fields per project.
target_versionNoTarget fix version — version in which the issue is planned to be resolved. Use get_project with include: ["versions"] to list available version names.
reproducibilityNoHow 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_versionNoVersion in which the issue was fixed. Use get_project with include: ["versions"] to list available version names.
steps_to_reproduceNoStep-by-step instructions to reproduce the issue. Plain text or Markdown.
additional_informationNoAdditional context or notes about the issue. Plain text or Markdown.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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).

NameRequiredDescriptionDefault
nameYesVersion name, e.g. "1.2.0"
obsoleteNoMark the version as obsolete. MantisBT default: false
releasedNoMark the version as released. MantisBT default: false
timestampNoVersion 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_idYesNumeric ID of the project the version belongs to — use list_projects to discover project IDs
descriptionNoOptional version description

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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

States a specific verb+resource ('Create a new 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.

Usage Guidelines3/5

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 IssueB
DestructiveIdempotent

Permanently delete a MantisBT issue. This action is irreversible.

NameRequiredDescriptionDefault
idYesNumeric issue ID to delete

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance is given, 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 NoteA
DestructiveIdempotent

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).

NameRequiredDescriptionDefault
note_idYesNumeric note ID to delete — obtain from get_issue (notes[].id)
issue_idYesNumeric issue ID that owns the note

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb and resource — 'Permanently delete a 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.

Usage Guidelines4/5

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 VersionA
DestructiveIdempotent

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).

NameRequiredDescriptionDefault
project_idYesNumeric ID of the project the version belongs to — use list_projects to discover project IDs
version_idYesNumeric version ID — use get_project with include: ["versions"] to discover version IDs

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

States a specific verb and resource ('Permanently delete a 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.

Usage Guidelines5/5

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 IssueA
Idempotent

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.

NameRequiredDescriptionDefault
tag_idYesNumeric tag ID to remove
issue_idYesNumeric issue ID

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

For a simple two-parameter 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.

Parameters3/5

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

Schema description coverage is 100%, so both issue_id and 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.

Purpose5/5

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

The description states a specific verb and resource: 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.

Usage Guidelines4/5

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 MemberA
Read-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.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default: 10, max: 100)
queryNoCase-insensitive substring to match against name, real_name, or email
project_idYesNumeric project ID

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines5/5

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 ConfigurationA
Read-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

NameRequiredDescriptionDefault
optionsYesArray of configuration option names to retrieve

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 UserA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The description correctly 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.

Purpose5/5

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.

Usage Guidelines4/5

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 IssueA
Read-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.

NameRequiredDescriptionDefault
idNoNumeric issue ID (use either id or ids)
idsNoSeveral issue IDs (1–50) to fetch in one call (use either id or ids)
selectNoComma-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

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 ValuesA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 FieldsA
Read-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.

NameRequiredDescriptionDefault
project_idNoOptional project ID to scope the sample issue fetch

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 IssuesA
Read-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.

NameRequiredDescriptionDefault
idsYesArray of numeric issue IDs to fetch (1–50). null is returned per ID on 404/403/error instead of failing the whole call.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SchemaA
Read-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.

NameRequiredDescriptionDefault
project_idNoOptional project ID to scope the sample issue used for field discovery

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 VersionA
Read-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.

NameRequiredDescriptionDefault
check_latestNoWhether to fetch the latest MantisBT release from GitHub and compare (default: true)

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 VersionA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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 MetadataA
Read-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.

NameRequiredDescriptionDefault
detailNo"summary" (default): counts only; "full": the complete raw cachesummary
refreshNoRe-fetch all metadata from MantisBT first (default: false)

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description 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.

Purpose4/5

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.

Usage Guidelines4/5

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 MetadataA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ProjectA
Read-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.

NameRequiredDescriptionDefault
includeNoRelated data to add: "categories", "users", "versions"
inheritNoAlso return versions inherited from parent projects; implies include "versions"
obsoleteNoAlso return obsolete versions; implies include "versions"
project_idYesNumeric project ID — use list_projects to discover project IDs
access_levelNoOnly users at or above this access level; implies include "users"
member_queryNoCase-insensitive substring to find users by login name, real name or email; implies include "users"

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; 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.

Purpose5/5

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.

Usage Guidelines4/5

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 CategoriesA
Read-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.

NameRequiredDescriptionDefault
project_idYesNumeric project ID

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb and resource ("List all 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.

Usage Guidelines5/5

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 UsersA
Read-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.

NameRequiredDescriptionDefault
project_idYesNumeric project ID — use list_projects to discover project IDs
access_levelNoReturn 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

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb and resource ("List all 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.

Usage Guidelines5/5

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 VersionsA
Read-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.

NameRequiredDescriptionDefault
inheritNoInclude versions inherited from parent projects. Default: false. Set to true for sub-projects that share versions with a parent project.
obsoleteNoInclude obsolete (deprecated) versions in the response. Default: false. Set to true to see all versions including those no longer actively used.
project_idYesNumeric project ID — use list_projects to discover project IDs

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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

The description states a specific verb and resource: 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.

Usage Guidelines5/5

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 VersionsA
Read-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.

NameRequiredDescriptionDefault
check_latestNoWhether to fetch the latest MantisBT release from GitHub and compare (default: true)

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 FiltersA
Read-onlyIdempotent

List all saved MantisBT issue filters accessible to the current user. Filter IDs can be used with list_issues.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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

States a specific verb and resource ('List all 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.

Usage Guidelines4/5

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 AttachmentsA
Read-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.

NameRequiredDescriptionDefault
issue_idYesNumeric issue ID

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 IssuesA
Read-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.

NameRequiredDescriptionDefault
pageNoPage number (default: 1)
sortNoSort field (e.g. "last_updated", "id")
selectNoComma-separated list of fields to include in the response (server-side projection). Significantly reduces response size. Example: "id,summary,status,priority,handler,updated_at"
statusNoFilter 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_byNoReturn counts per group instead of issues: "status", "handler", "priority" or "category". All matching issues are counted (page, page_size and select are ignored).
directionNoSort direction
filter_idNoUse a saved MantisBT filter ID
page_sizeNoIssues per page (default: 50, max: 50)
project_idNoFilter by project ID
assigned_toNoFilter by handler/assignee user ID
reporter_idNoFilter by reporter user ID
created_afterNoISO-8601 timestamp — only return issues created after this date (exclusive). Example: "2026-03-01T00:00:00Z"
updated_afterNoISO-8601 timestamp — only return issues updated after this date (exclusive). Example: "2026-03-25T00:00:00Z"
created_beforeNoISO-8601 timestamp — only return issues created before this date (exclusive). Example: "2026-03-15T00:00:00Z"
updated_beforeNoISO-8601 timestamp — only return issues updated before this date (exclusive). Example: "2026-03-28T00:00:00Z"

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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

States a specific verb and resource: list 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.

Usage Guidelines4/5

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 LanguagesA
Read-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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 NotesA
Read-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.

NameRequiredDescriptionDefault
issue_idYesNumeric issue ID

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb and resource ('List all 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.

Usage Guidelines5/5

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 ProjectsA
Read-onlyIdempotent

List all MantisBT projects accessible to the current API user.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

For a zero-parameter, read-only 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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 TagsA
Read-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.

NameRequiredDescriptionDefault
pageNoPage number (default: 1)
page_sizeNoTags per page (default: 50)

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. 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.

Conciseness5/5

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.

Completeness3/5

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

There is no output schema, 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.

Parameters3/5

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.

Purpose4/5

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

States a specific verb and resource — 'List all 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.

Usage Guidelines4/5

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).

NameRequiredDescriptionDefault
timestampNoRelease date as ISO 8601 string. Default: now.
project_idYesNumeric ID of the project the version belongs to — use list_projects to discover project IDs
version_idYesNumeric version ID — use get_project with include: ["versions"] to discover version IDs
next_versionNoName of a follow-up version to create as unreleased placeholder, e.g. "1.2.1". Omit to only release.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. 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.

Purpose5/5

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.

Usage Guidelines5/5

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 MonitorA
DestructiveIdempotent

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.

NameRequiredDescriptionDefault
issue_idYesNumeric issue ID
usernameYesMantisBT login name (not the display name) of the monitor to remove

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines5/5

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 RelationshipA
Destructive

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).

NameRequiredDescriptionDefault
issue_idYesThe issue ID the relationship belongs to
relationship_idYesThe numeric ID of the relationship to remove (from the relationships array in get_issue)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
idYesNumeric issue ID to update
noteNoOptional note text appended after a successful update (e.g. reason for a status change). Replaces a separate add_note call.
fieldsNoFields 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_runNoIf true, return the patch payload that would be sent without actually updating the issue. Useful for previewing changes before committing them.
add_monitorsNoMantisBT login names to add as monitors (watchers) of the issue
note_view_stateNoVisibility of the appended note: "public" (default) or "private". Only used when "note" is set.public
remove_monitorsNoMantisBT login names to remove from the monitors of the issue; names that are not monitoring are ignored

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 VersionA
Idempotent

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).

NameRequiredDescriptionDefault
nameNoNew version name (must be unique within the project)
obsoleteNoObsolete flag
releasedNoReleased flag
timestampNoVersion 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_idYesNumeric ID of the project the version belongs to — use list_projects to discover project IDs
version_idYesNumeric version ID — use get_project with include: ["versions"] to discover version IDs
descriptionNoNew version description
next_versionNoOnly 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

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose4/5

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

States a specific verb and resource: update an existing 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.

Usage Guidelines4/5

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".

NameRequiredDescriptionDefault
contentNoFallback: Base64-encoded file content — only use when file_path is not available (mutually exclusive with file_path)
filenameNoFile name for the attachment (required when using content; overrides the derived name when using file_path)
issue_idYesNumeric issue ID
file_pathNoPreferred: absolute path to the local file to upload — use this whenever the file exists on disk (mutually exclusive with content)
descriptionNoOptional description for the attachment
content_typeNoMIME type of the file, e.g. "image/png" (default: "application/octet-stream")

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

For a six-parameter mutation tool with no 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 15 tool updatesv1.15.0
    • Changedadd_monitor1 field changed
      • changedInput schema / properties / username / description
        Previous 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."
    • Changedcreate_issue9 fields changed
      • changedInput schema / properties / category / description
        Previous 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."
      • changedInput schema / properties / custom_fields / description
        Previous 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."
      • changedInput schema / properties / fixed_in_version / description
        Previous 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."
      • changedInput schema / properties / handler / description
        Previous 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."
      • changedInput schema / properties / priority / description
        Previous 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."
      • changedInput schema / properties / reproducibility / description
        Previous 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."
      • changedInput schema / properties / severity / description
        Previous 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."
      • changedInput schema / properties / target_version / description
        Previous 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."
      • changedInput schema / properties / version / description
        Previous 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."
    • Changeddelete_note2 fields changed
      • changedInput schema / properties / issue_id / description
        Previous 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"
      • changedInput schema / properties / note_id / description
        Previous 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)"
    • Changeddelete_version1 field changed
      • changedInput schema / properties / version_id / description
        Previous 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"
    • Changedget_issue3 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"Numeric issue ID"New value: +"Numeric issue ID (use either id or ids)"
      • addedInput schema / properties / ids
        Added 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"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "id"
        -]
    • Addedget_issue_schema
    • Changedget_mantis_version1 field changed
      • changedInput schema / properties / check_latest / description
        Previous 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)"
    • Changedget_metadata2 fields changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": "summary",
        +  "description": "\"summary\" (default): counts only; \"full\": the complete raw cache",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / refresh
        Added value: +{
        +  "default": false,
        +  "description": "Re-fetch all metadata from MantisBT first (default: false)",
        +  "type": "boolean"
        +}
    • Addedget_project
    • Addedget_version
    • Changedlist_issues1 field changed
      • addedInput schema / properties / group_by
        Added 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"
        +}
    • Changedrelease_version1 field changed
      • changedInput schema / properties / version_id / description
        Previous 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"
    • Changedremove_monitor1 field changed
      • changedInput schema / properties / username / description
        Previous value: -"Username of the monitor to remove"New value: +"MantisBT login name (not the display name) of the monitor to remove"
    • Changedupdate_issue5 fields changed
      • addedInput schema / properties / add_monitors
        Added value: +{
        +  "description": "MantisBT login names to add as monitors (watchers) of the issue",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / fields / description
        Previous 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."
      • addedInput schema / properties / fields / properties / notes
        Added 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"
        +}
      • addedInput schema / properties / remove_monitors
        Added 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"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "id",
        -  "fields"
        -]New value: +[
        +  "id"
        +]
    • Changedupdate_version2 fields changed
      • addedInput schema / properties / next_version
        Added 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"
        +}
      • changedInput schema / properties / version_id / description
        Previous 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"
  2. 38 tool updatesv1.14.0
    • Changedadd_monitor2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
    • Changedadd_note2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
    • Changedadd_relationship3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / target_id / maximum
        Added value: +9007199254740991
    • Changedattach_tags4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
      • removedInput schema / properties / tags / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / tags / items / properties / id / maximum
        Added value: +9007199254740991
    • Changedcreate_issue6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / custom_fields / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / custom_fields / items / properties / field / additionalProperties
        Removed value: -false
      • changedInput schema / properties / custom_fields / items / required
        Previous value: -[
        -  "field"
        -]New value: +[
        +  "field",
        +  "value"
        +]
      • addedInput schema / properties / handler_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / project_id / maximum
        Added value: +9007199254740991
    • Addedcreate_version
    • Changeddelete_issue2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / id / maximum
        Added value: +9007199254740991
    • Changeddelete_note3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / note_id / maximum
        Added value: +9007199254740991
    • Addeddelete_version
    • Changeddetach_tag3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / tag_id / maximum
        Added value: +9007199254740991
    • Changedfind_project_member2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / project_id / maximum
        Added value: +9007199254740991
    • Changedget_config1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_current_user1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_issue2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / id / maximum
        Added value: +9007199254740991
    • Changedget_issue_enums1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_issue_fields2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / project_id / maximum
        Added value: +9007199254740991
    • Changedget_issues2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / ids / items / maximum
        Added value: +9007199254740991
    • Changedget_mantis_version1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_mcp_version1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_metadata1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_metadata_full1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_project_categories2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / project_id / maximum
        Added value: +9007199254740991
    • Changedget_project_users4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / access_level / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / access_level / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / project_id / maximum
        Added value: +9007199254740991
    • Changedget_project_versions2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / project_id / maximum
        Added value: +9007199254740991
    • Changedlist_filters1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_issue_files2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
    • Changedlist_issues6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / assigned_to / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / filter_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / page / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / project_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / reporter_id / maximum
        Added value: +9007199254740991
    • Changedlist_languages1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_notes2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
    • Changedlist_projects1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_tags2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / page / maximum
        Added value: +9007199254740991
    • Addedrelease_version
    • Changedremove_monitor2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
    • Changedremove_relationship3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / relationship_id / maximum
        Added value: +9007199254740991
    • Changedsync_metadata1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedupdate_issue38 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / fields / properties / category / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / category / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / category / type
        Added value: +"object"
      • removedInput schema / properties / fields / properties / custom_fields / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / fields / properties / custom_fields / items / properties / field / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / custom_fields / items / properties / field / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / custom_fields / items / properties / field / type
        Added value: +"object"
      • changedInput schema / properties / fields / properties / custom_fields / items / required
        Previous value: -[
        -  "field"
        -]New value: +[
        +  "field",
        +  "value"
        +]
      • removedInput schema / properties / fields / properties / fixed_in_version / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / fixed_in_version / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / fixed_in_version / type
        Added value: +"object"
      • removedInput schema / properties / fields / properties / handler / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / handler / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / handler / type
        Added value: +"object"
      • removedInput schema / properties / fields / properties / priority / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / priority / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / priority / type
        Added value: +"object"
      • removedInput schema / properties / fields / properties / reproducibility / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / reproducibility / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / reproducibility / type
        Added value: +"object"
      • removedInput schema / properties / fields / properties / resolution / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / resolution / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / resolution / type
        Added value: +"object"
      • removedInput schema / properties / fields / properties / severity / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / severity / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / severity / type
        Added value: +"object"
      • removedInput schema / properties / fields / properties / status / additionalProperties
        Removed value: -false
      • removedInput schema / properties / fields / properties / target_version / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / target_version / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / target_version / type
        Added value: +"object"
      • removedInput schema / properties / fields / properties / version / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / version / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / version / type
        Added value: +"object"
      • removedInput schema / properties / fields / properties / view_state / $ref
        Removed value: -"#/properties/fields/properties/status"
      • addedInput schema / properties / fields / properties / view_state / properties
        Added value: +{
        +  "id": {
        +    "type": "number"
        +  },
        +  "name": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / fields / properties / view_state / type
        Added value: +"object"
      • addedInput schema / properties / id / maximum
        Added value: +9007199254740991
    • Addedupdate_version
    • Changedupload_file2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / issue_id / maximum
        Added value: +9007199254740991
  3. 3 tool updatesv1.10.5
    • Changedcreate_issue1 field changed
      • addedInput schema / properties / custom_fields
        Added 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"
        +}
    • Changedget_issue1 field changed
      • addedInput schema / properties / select
        Added 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"
        +}
    • Changedupdate_issue3 fields changed
      • addedInput schema / properties / fields / properties / custom_fields
        Added 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"
        +}
      • addedInput schema / properties / note
        Added 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"
        +}
      • addedInput schema / properties / note_view_state
        Added value: +{
        +  "default": "public",
        +  "description": "Visibility of the appended note: \"public\" (default) or \"private\". Only used when \"note\" is set.",
        +  "enum": [
        +    "public",
        +    "private"
        +  ],
        +  "type": "string"
        +}
  4. 34 tool updatesv1.10.4
    • Addedadd_monitor
    • Addedadd_note
    • Addedadd_relationship
    • Addedattach_tags
    • Addedcreate_issue
    • Addeddelete_issue
    • Addeddelete_note
    • Addeddetach_tag
    • Addedfind_project_member
    • Addedget_config
    • Addedget_current_user
    • Addedget_issue
    • Addedget_issue_enums
    • Addedget_issue_fields
    • Addedget_issues
    • Addedget_mantis_version
    • Addedget_mcp_version
    • Addedget_metadata
    • Addedget_metadata_full
    • Addedget_project_categories
    • Addedget_project_users
    • Addedget_project_versions
    • Addedlist_filters
    • Addedlist_issue_files
    • Addedlist_issues
    • Addedlist_languages
    • Addedlist_notes
    • Addedlist_projects
    • Addedlist_tags
    • Addedremove_monitor
    • Addedremove_relationship
    • Addedsync_metadata
    • Addedupdate_issue
    • Addedupload_file
  5. 34 tool updates
    • Removedadd_monitor
    • Removedadd_note
    • Removedadd_relationship
    • Removedattach_tags
    • Removedcreate_issue
    • Removeddelete_issue
    • Removeddelete_note
    • Removeddetach_tag
    • Removedfind_project_member
    • Removedget_config
    • Removedget_current_user
    • Removedget_issue
    • Removedget_issue_enums
    • Removedget_issue_fields
    • Removedget_issues
    • Removedget_mantis_version
    • Removedget_mcp_version
    • Removedget_metadata
    • Removedget_metadata_full
    • Removedget_project_categories
    • Removedget_project_users
    • Removedget_project_versions
    • Removedlist_filters
    • Removedlist_issue_files
    • Removedlist_issues
    • Removedlist_languages
    • Removedlist_notes
    • Removedlist_projects
    • Removedlist_tags
    • Removedremove_monitor
    • Removedremove_relationship
    • Removedsync_metadata
    • Removedupdate_issue
    • Removedupload_file
  6. 6 tool updatesv1.10.3
    • Changedadd_monitor2 fields changed
      • changedInput schema / properties / issue_id / description
        Previous value: -"Numeric issue ID"New value: +"Numeric issue ID — use list_issues or get_issue to obtain issue IDs"
      • changedInput schema / properties / username / description
        Previous 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."
    • Changedadd_note3 fields changed
      • changedInput schema / properties / issue_id / description
        Previous value: -"Numeric issue ID"New value: +"Numeric issue ID — use list_issues or get_issue to obtain issue IDs"
      • changedInput schema / properties / text / description
        Previous 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."
      • changedInput schema / properties / view_state / description
        Previous 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)."
    • Changedcreate_issue15 fields changed
      • changedInput schema / properties / additional_information / description
        Previous value: -"Additional information about the issue. Plain text or Markdown."New value: +"Additional context or notes about the issue. Plain text or Markdown."
      • changedInput schema / properties / category / description
        Previous 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."
      • changedInput schema / properties / description / description
        Previous 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."
      • changedInput schema / properties / fixed_in_version / description
        Previous 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."
      • changedInput schema / properties / handler / description
        Previous 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."
      • changedInput schema / properties / handler_id / description
        Previous 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."
      • changedInput schema / properties / priority / description
        Previous 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."
      • changedInput schema / properties / project_id / description
        Previous value: -"Project ID the issue belongs to"New value: +"Project ID the issue belongs to — use list_projects to discover project IDs"
      • changedInput schema / properties / reproducibility / description
        Previous 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."
      • changedInput schema / properties / severity / description
        Previous 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."
      • changedInput schema / properties / steps_to_reproduce / description
        Previous value: -"Steps to reproduce the issue. Plain text or Markdown."New value: +"Step-by-step instructions to reproduce the issue. Plain text or Markdown."
      • changedInput schema / properties / summary / description
        Previous value: -"Issue summary/title"New value: +"Issue summary/title (required)"
      • changedInput schema / properties / target_version / description
        Previous 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."
      • changedInput schema / properties / version / description
        Previous 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."
      • changedInput schema / properties / view_state / description
        Previous 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)."
    • Changeddelete_note2 fields changed
      • changedInput schema / properties / issue_id / description
        Previous 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"
      • changedInput schema / properties / note_id / description
        Previous value: -"Numeric note ID to delete"New value: +"Numeric note ID to delete — obtain from get_issue (notes[].id) or list_notes"
    • Changedget_project_users2 fields changed
      • changedInput schema / properties / access_level / description
        Previous 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."
      • changedInput schema / properties / project_id / description
        Previous value: -"Numeric project ID"New value: +"Numeric project ID — use list_projects to discover project IDs"
    • Changedget_project_versions3 fields changed
      • changedInput schema / properties / inherit / description
        Previous 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."
      • changedInput schema / properties / obsolete / description
        Previous 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."
      • changedInput schema / properties / project_id / description
        Previous value: -"Numeric project ID"New value: +"Numeric project ID — use list_projects to discover project IDs"
  7. 1 tool updatev1.8.1
    • Changedupload_file9 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / content
        Added value: +{
        +  "description": "Base64-encoded file content (mutually exclusive with file_path)",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / content_type
        Added value: +{
        +  "description": "MIME type of the file, e.g. \"image/png\" (default: \"application/octet-stream\")",
        +  "type": "string"
        +}
      • addedInput schema / properties / description
        Added value: +{
        +  "description": "Optional description for the attachment",
        +  "type": "string"
        +}
      • addedInput schema / properties / file_path
        Added value: +{
        +  "description": "Absolute path to the local file to upload (mutually exclusive with content)",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / filename
        Added value: +{
        +  "description": "File name for the attachment (required when using content; overrides the derived name when using file_path)",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / issue_id
        Added value: +{
        +  "description": "Numeric issue ID",
        +  "exclusiveMinimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / required
        Added value: +[
        +  "issue_id"
        +]
  8. 6 tool updatesv1.5.15
    • Changedcreate_issue3 fields changed
      • changedInput schema / properties / priority / description
        Previous 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."
      • changedInput schema / properties / reproducibility / description
        Previous 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."
      • changedInput schema / properties / severity / description
        Previous 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."
    • Addedfind_project_member
    • Addedget_issues
    • Addedget_metadata_full
    • Changedlist_issues4 fields changed
      • addedInput schema / properties / created_after
        Added value: +{
        +  "description": "ISO-8601 timestamp — only return issues created after this date (exclusive). Example: \"2026-03-01T00:00:00Z\"",
        +  "type": "string"
        +}
      • addedInput schema / properties / created_before
        Added value: +{
        +  "description": "ISO-8601 timestamp — only return issues created before this date (exclusive). Example: \"2026-03-15T00:00:00Z\"",
        +  "type": "string"
        +}
      • addedInput schema / properties / updated_after
        Added value: +{
        +  "description": "ISO-8601 timestamp — only return issues updated after this date (exclusive). Example: \"2026-03-25T00:00:00Z\"",
        +  "type": "string"
        +}
      • addedInput schema / properties / updated_before
        Added value: +{
        +  "description": "ISO-8601 timestamp — only return issues updated before this date (exclusive). Example: \"2026-03-28T00:00:00Z\"",
        +  "type": "string"
        +}
    • Changedupdate_issue1 field changed
      • addedInput schema / properties / dry_run
        Added 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"
        +}
  9. 1 tool updatev1.5.14
    • Changedcreate_issue7 fields changed
      • addedInput schema / properties / additional_information
        Added value: +{
        +  "description": "Additional information about the issue. Plain text or Markdown.",
        +  "type": "string"
        +}
      • addedInput schema / properties / fixed_in_version
        Added value: +{
        +  "description": "Version name in which the issue was fixed (use get_project_versions to list available versions)",
        +  "type": "string"
        +}
      • addedInput schema / properties / reproducibility
        Added 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"
        +}
      • addedInput schema / properties / steps_to_reproduce
        Added value: +{
        +  "description": "Steps to reproduce the issue. Plain text or Markdown.",
        +  "type": "string"
        +}
      • addedInput schema / properties / target_version
        Added 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"
        +}
      • addedInput schema / properties / version
        Added value: +{
        +  "description": "Affected product version name (use get_project_versions to list available versions)",
        +  "type": "string"
        +}
      • addedInput schema / properties / view_state
        Added value: +{
        +  "description": "Visibility of the issue: \"public\" (default) or \"private\"",
        +  "enum": [
        +    "public",
        +    "private"
        +  ],
        +  "type": "string"
        +}

TDQS

A3.7/5.0

Scored across 41 tools

Disambiguation2/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers