MantisBT MCP服务器
英语 · 多伊奇
一、 模型上下文协议(MCP) 集成了 MantisBT REST API Claude Code和其他mcp客户端直接从编辑器读取、创建和更新问题。
要求
- Node.js≥22
- 启用REST API的MantisBT安装(2.23+版本)
- MantisBT API令牌(创建下 我的帐户→API令牌)
安装
通过npx(推荐):
将......添加到...... ~/.claude/claude_desktop_config.json (Claude Desktop)或你当地的
claude_desktop_config.json (Claude代码):
{
"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"
}
}
}
}
当地的构建:
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"
}
}
}
}
配置
环境变量
| 变量 | 要求 | 默认的 | 描述 |
|---|---|---|---|
MANTIS_BASE_URL | ✅ | – | 您的MantisBT安装的基础URL。两个 https://your-mantis.example.com 和 https://your-mantis.example.com/api/rest 被接受- /api/rest 后缀是自动规范化的。 |
MANTIS_API_KEY | ✅ | – | 身份验证的API令牌 |
MANTIS_USE_INDEX_PHP | – | 汽车 | 设置为 true 当URL重写不可用时- REST请求然后使用 /api/rest/index.php/ 而不是 /api/rest/。自动检测 MANTIS_BASE_URL 结尾 /api/rest/index.php;显式值总是占上风。看到 食谱. |
MANTIS_CACHE_DIR | – | ~/.cache/mantisbt-mcp | 元数据缓存的目录 |
MANTIS_CACHE_TTL | – | 3600 | 缓存生存期(以秒为单位) |
TRANSPORT | – | stdio | 传输模式: stdio 或者 http |
PORT | – | 3000 | HTTP模式端口 |
MCP_HTTP_HOST | – | 127.0.0.1 | HTTP模式绑定地址。 从 0.0.0.0 来 127.0.0.1 -服务器现在只监听本地主机默认情况下。设置为 0.0.0.0 用于Docker或远程访问。 |
MCP_HTTP_TOKEN | ✅(HTTP模式) | – | 不记名令牌 /mcp 端点(Authorization: Bearer <token>)。 时需要 TRANSPORT=http -服务器拒绝在HTTP模式下启动没有它,所以工具永远不会暴露未经身份验证。在演播室模式下忽略。这个 /health 端点始终是公共的。 |
MANTIS_SEARCH_ENABLED | – | false | 设置为 true 启用语义搜索 |
MANTIS_SEARCH_BACKEND | – | vectra | Vector存储后端: vectra (纯JS)或 sqlite-vec (需要手动安装) |
MANTIS_SEARCH_DIR | – | {MANTIS_CACHE_DIR}/search | 搜索索引的目录 |
MANTIS_SEARCH_MODEL | – | Xenova/paraphrase-multilingual-MiniLM-L12-v2 | 嵌入模型名称(第一次使用时下载一次,~ 80mb) |
MANTIS_SEARCH_THREADS | – | 1 | 嵌入模型的ONNX op内线程数。默认值为1,以防止多核机器和WSL上的CPU饱和。仅当索引重建速度很重要并且主机专门用于此工作负载时才增加。 |
MANTIS_UPLOAD_DIR | – | – | 限制 upload_file的 file_path 到这个目录中的文件(路径遍历通过 ../ 被阻塞)。在 它的模式 file_path 是不受限制的,除非设置了这个。在 HTTP方式 file_path 从服务器的文件系统中读取,就是这样 禁用,除非设置了此变量 - HTTP客户端应该通过 content (Base64)参数。 |
MANTIS_TOOLSETS | – | (所有) | 以逗号分隔的工具组列表: issues, notes, links, files, projects, versions, meta, search (不区分大小写)。Unset或empty表示所有组。这个 search 团体额外要求 MANTIS_SEARCH_ENABLED=true;如果没有组,则根本不会启动搜索模块。未知的组名在启动时用一条列出有效名称的消息停止服务器。看到 限制提供的工具 和 食谱. |
MANTIS_DISABLE_DESTRUCTIVE | – | false | 设置为 true 隐藏每一个破坏性的工具 delete_issue, delete_note, delete_version, remove_relationship, remove_monitor -不管活跃的群体是什么。隐藏工具不列出,调用时返回“Tool…not found”。 |
限制提供的工具
两个envars减少了提供给模型的工具表面-有助于保持模型上下文更短,并防止意外的破坏性操作:
MANTIS_TOOLSETS-只包含列出的组(逗号分隔,不区分大小写)MANTIS_DISABLE_DESTRUCTIVE=true-额外隐藏delete_issue,delete_note,delete_version,remove_relationship,remove_monitor不管活跃的群体是什么
隐藏工具不列出,调用时返回“Tool…not found”。
| 集团 | 工具 |
|---|---|
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 ² |
¹隐藏于 MANTIS_DISABLE_DESTRUCTIVE=true ·†已弃用,在2.0.0·²中移除 MANTIS_SEARCH_ENABLED=true;没有 search 组搜索模块根本没有启动
弃用的工具总是和它们的替换工具属于同一个组——禁用一个组会同时隐藏旧的和新的名称。
A -分诊设置 (问题、注释和元数据;无破坏性操作):
{
"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"
}
}
}
}
使用实例B - all组,delete-protection only (41个默认工具中的36个):
{
"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"
}
}
}
}
可用的工具
问题
| 工具 | 描述 |
|---|---|
get_issue | 通过以下方式检索问题 id,或几个 ids (1-50)在一次呼叫中-只通过一次;与 ids 返回 { issues, requested, found, failed },丢失或无法访问的id给出 null 在他们的位置上;可选 select 用于现场投影 |
get_issues | 弃用: 使用 get_issue 与 ids 相反-将在2.0.0中删除 |
list_issues | 按项目、状态、作者等筛选问题;可选 select 用于现场投影和 status 用于客户端状态过滤-规范的英文状态名称(例如: "new", "resolved")由ID匹配,使过滤器在本地化安装上与语言无关; group_by ("status", "handler", "priority", "category")返回每个组的计数而不是问题列表-所有过滤器仍然适用, page, page_size, select 被忽略 |
create_issue | 创造一个新问题; severity 和 priority 必须是规范的英文名称(例如: minor, major, normal, high) -呼叫 get_issue_schema 查看所有有效值及其本地化标签;可选 handler 参数接受用户名作为选项 handler_id (针对项目成员解决);可选 custom_fields 设置自定义字段值 |
update_issue | 更新现有的问题;枚举字段(status, priority, severity, resolution, reproducibility)接受规范的英文名称、本地化名称或数字id——服务器自动将名称解析为id;支持 custom_fields 还有一个可选的 note 参数,在同一调用中追加注释; fields 可以省略,当只有 add_monitors, remove_monitors,或者 note 给出了;使用 add_monitors / remove_monitors (登录名数组)来添加或删除观察者——响应包括一个 monitors 键与当前和更改的监控列表;使用 fields.notes 按ID编辑已有的注释(注释ID from) get_issue) |
delete_issue | 删除issue |
笔记
| 工具 | 描述 |
|---|---|
list_notes | 弃用: 使用 get_issue 与 select: "notes" 相反-将在2.0.0中删除 |
add_note | 给问题添加注释 |
delete_note | 删除笔记 |
附件
| 工具 | 描述 |
|---|---|
list_issue_files | 弃用: 使用 get_issue 与 select: "attachments" 相反-将在2.0.0中删除 |
upload_file | 上传文件到issue -首选:本地 file_path (服务器自动读取和编码);回退:base64编码 content + filename (仅用于 file_path 不可用) |
的关系
| 工具 | 描述 |
|---|---|
add_relationship | 在两个问题之间建立关系;可选 type_name 参数接受字符串名称(例如: "related_to", "duplicate_of")作为数字的替代 type_id |
remove_relationship | 从问题中删除关系(使用 id 来自关系对象,而不是类型) |
监控
| 工具 | 描述 |
|---|---|
add_monitor | 弃用: 使用 update_issue 与 add_monitors 相反-将在2.0.0中删除 |
remove_monitor | 弃用: 使用 update_issue 与 remove_monitors 相反-将在2.0.0中删除 |
标签
| 工具 | 描述 |
|---|---|
list_tags | 列出所有可用的标签;时回退到元数据缓存 GET /tags 返回404(运行) get_metadata 与 refresh: true 首先填充) |
attach_tags | 给问题附加标签 |
detach_tag | 从问题中移除标签 |
项目
| 工具 | 描述 |
|---|---|
list_projects | 列出所有可访问的项目;返回规范化的项目数据(与元数据缓存一致) |
get_project | 在一次调用中获取一个项目的主数据(id,名称,状态,启用,子项目)以及它的类别,用户和/或版本。 access_level 和 member_query 暗示 users; obsolete/inherit 暗示 versions |
get_project_versions | 弃用: 使用 get_project 与 include: ["versions"] 相反-将在2.0.0中删除 |
create_version | 在项目中创建一个新版本;返回已创建的版本对象(id,名称,描述,已发布,废弃,时间戳);需要 manage_project_threshold (默认值:经理) |
update_version | 更新现有版本;只有您传递的字段被更改(至少需要一个);重命名重写所有引用问题上的version/target_version/fixed_in_version;可选 next_version (只有 released: true)在同一个调用中创建一个后续版本;需要 manage_project_threshold (默认值:经理) |
release_version | 弃用: 使用 update_version 与 released: true, timestamp,可选 next_version 相反-将在2.0.0中删除 |
delete_version | 永久删除一个版本-不可逆,MantisBT清除所有引用问题的version/target_version/fixed_in_version;更喜欢 update_version 与 obsolete=true 作为非破坏性的替代品;需要 manage_project_threshold (默认值:经理) |
get_project_categories | 弃用: 使用 get_project 与 include: ["categories"] 相反-将在2.0.0中删除 |
get_project_users | 弃用: 使用 get_project 与 include: ["users"] 相反-将在2.0.0中删除 |
find_project_member | 弃用: 使用 get_project 与 member_query (没有 limit(返回所有匹配项)-将在2.0.0中删除 |
语义搜索 (可选)
而不是精确的关键字匹配,语义搜索理解 意义 在查询后面。用通俗易懂的语言提问——即使措辞不匹配,搜索引擎也能找到概念上相关的问题。
- “重置密码后登录失败” -查找有关认证边缘情况的问题
- “结帐页面的性能问题” -表面相关的报告,而不管使用的确切术语
- 发票清单上的重复条目 -捕获被描述为“显示两次”、“重复记录”等问题。
嵌入模型(~ 80mb)完全运行 离线 -没有OpenAI密钥,没有外部API。它在第一次启动时下载一次,并在本地缓存。问题在每次服务器启动时都被增量索引(只有新的和更新的问题被重新索引)。当多个客户端会话同时启动服务器时,只有其中一个会话同步共享索引。该模型在第一次使用时加载,并在10分钟后再次卸载,没有嵌入,因此空闲会话不会占用其内存(每个服务器进程约0.9 GB)。
激活与 MANTIS_SEARCH_ENABLED=true.
| 工具 | 描述 |
|---|---|
search_issues | 自然语言搜索在所有索引的问题-返回前n的结果与余弦相似度得分;可选 select (逗号分隔字段名)用请求的问题字段丰富每个结果;可选 highlight (布尔,默认 false)加a highlights 字段,其中包含与关键字匹配的摘录 summary 和 description (与 **bold**) |
rebuild_search_index | 建立或更新搜索索引; full: true 从头开始清理和重建 |
get_search_index_status | 弃用: 使用 get_metadata (字段 search_index) -将在2.0.0中删除 |
选择哪个后端?
vectra (默认) | sqlite-vec | |
|---|---|---|
| 依赖关系 | 无(纯JS) | 需要本地构建工具 |
| 安装 | 包括 | npm install sqlite-vec better-sqlite3 |
| 最适合 | 多达10,000个问题 | 10000 +的问题 |
| 表演 | 对于大多数设置来说足够快 | 对于大型语料库更快 |
从……开始 vectra. 切换到 sqlite-vec 如果索引或查询时间明显变慢。
npm install sqlite-vec better-sqlite3
# then set MANTIS_SEARCH_BACKEND=sqlite-vec
元数据与系统
| 工具 | 描述 |
|---|---|
get_metadata | 检索缓存的元数据: detail: "summary" (默认)返回项目/标签计数和每个项目的用户/版本/类别计数; detail: "full" 返回完整的原始缓存; refresh: true 首先从MantisBT重新获取;启用语义搜索后,响应还包含一个 search_index 块 |
get_version | 此MCP服务器和连接的MantisBT安装的版本在一个响应中; check_latest (默认 true)比较MantisBT和最新的GitHub版本; mantis 持有 error 当无法联系到MantisBT时 |
get_issue_schema | 有效的 select 字段(fields, fields_source)和枚举值(enums(严重性、状态、优先级、解决方案、可再现性)在一个响应中显示此MantisBT服务器;可选 project_id 范围字段发现-以前使用过 create_issue / update_issue 或者在构建 select 字符串 |
get_issue_fields | 弃用: 使用 get_issue_schema 相反-将在2.0.0中删除 |
get_issue_enums | 弃用: 使用 get_issue_schema 相反;资源 mantis://enums 停留-将在2.0.0中移除 |
get_metadata_full | 弃用: 使用 get_metadata 与 detail: "full" 相反-将在2.0.0中删除 |
sync_metadata | 弃用: 使用 get_metadata 与 refresh: true 相反-将在2.0.0中删除 |
list_filters | 保存的过滤器列表 |
get_current_user | 检索您自己的用户配置文件-包括 language (用户的MantisBT语言,在发布文本和注释中使用哪种语言的提示) |
list_languages | 弃用: 使用 get_current_user (字段 language) -将在2.0.0中删除 |
get_config | 显示服务器配置(基本URL,缓存TTL) |
get_mantis_version | 弃用: 使用 get_version 相反-将在2.0.0中删除 |
get_mcp_version | 弃用: 使用 get_version 相反-将在2.0.0中删除 |
使用令牌
服务器自己处理计数和字段投影——模型接收一个紧凑的摘要,而不是读取原始问题列表。在2026-10-31对MantisBT 2.28安装进行测试(604个问题,5个问题有很长的描述/注释):
| 任务 | 之前 | 令牌 | 后 | 令牌 | 保存 |
|---|---|---|---|---|---|
| 项目状态概述(604期) | list_issues,所有页面 | 1274398年 | list_issues + group_by: "status" | 165 | 99.9% |
| 每个处理程序的开放问题 | list_issues 状态 "open" + select,所有页面¹ | 2686年 | list_issues + group_by: "handler" | 108 | 95.9% |
| 选定字段的5个问题 | get_issue ids,没有 select | 16272年 | get_issue id + select | 623 | 96.1% |
¹ list_issues 当客户端过滤器处于活动状态时,最多扫描500个问题,因此这个“before”值被低估了。
记号估计为字符/ 4。要在你自己的实例上复制(需要git签出,不能通过npx):
MANTIS_BASE_URL=… MANTIS_API_KEY=… \
BENCHMARK_PROJECT_ID=12 BENCHMARK_ISSUE_IDS=101,102,103,104,105 \
npm run benchmark
证书也可能来自 .env.local.
可用的资源
MCP资源是可uri寻址的只读数据,客户端无需调用工具即可直接获取。它们是继工具和提示符之后的第三个MCP原语。请注意,在MCP客户端中,资源支持的实现范围不如工具广泛——请查看客户端的文档。
| 资源URI | 描述 |
|---|---|
mantis://me | 通过身份验证的API用户的概要文件(实时获取) |
mantis://projects | 所有可访问的MantisBT项目作为一个紧凑的列表(缓存支持,刷新通过 get_metadata 与 refresh: true) |
mantis://projects/{id} | 组合项目视图:一次调用项目字段+用户+版本+类别;缓存优先,列表支持枚举所有可用的项目uri |
mantis://enums | 所有问题枚举字段的有效值:严重性、优先级、状态、解析、再现性(实时获取) |
可用的提示
MCP提示模板是对话启动器,它指示LLM收集结构化输入,然后调用适当的工具。它们本身并不是工具——它们启动了一个被引导的工作流。
| 提示 | 所需的参数 | 可选参数 | 描述 |
|---|---|---|---|
create-bug-report | project_id, category, summary, description | steps_to_reproduce, expected, actual, environment | 指导结构化的bug报告和调用 create_issue |
create-feature-request | project_id, category, summary, description | use_case | 指导完成一个特性请求和调用 create_issue |
summarize-issue | issue_id | – | 通过获取问题 get_issue 并返回一个简明的摘要 |
project-status | project_id | – | 通过以下方式列出问题 list_issues 并生成按严重性分组的状态报告 |
HTTP方式
作为独立服务器使用(例如在远程设置中)。 MCP_HTTP_TOKEN 是 要求 在HTTP模式下-服务器拒绝启动没有它:
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
每一个 /mcp 请求必须发送 Authorization: Bearer <token>. 通过HTTP, upload_file的 file_path 被禁用,除非 MANTIS_UPLOAD_DIR 设置-使用 content (Base64)参数。
健康检查: GET http://localhost:3456/health (总是公开的,不需要令牌)
文档
开发
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)
许可证
MIT -见 许可证
贡献
贡献欢迎!请阅读 CONTRIBUTING.md. 存储库: codeberg.org/dpesch/mantisbt-mcp-server