关于 redmine-mcp-server
redmine-mcp-server 将 Redmine 实例接入 AI 助手,适用于需要通过 MCP 管理项目与工单的团队。它提供覆盖问题、项目、工时、Wiki 和文件等领域的工具,并支持多种认证方式及只读限制。
主要功能
- 01管理问题、项目和新闻
- 02操作工时、Wiki 与文件
- 03支持 Gantt、成员及插件功能
- 04提供多种认证模式
- 05支持只读模式和工具访问限制
- 06通过 MCP Apps 显示看板
适用场景
- 01在对话中整理和分派工单
- 02查询项目工时与 Wiki 内容
- 03通过看板查看待处理问题
MCP 相关
MCP 服务将 Redmine 项目、问题、工时、Wiki 页面和文件作为工具提供给 MCP 客户端;通过 HTTP 传输,也支持 stdio 模式。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx redmine-mcp-serverREDMINE_URLURL of your Redmine server (e.g., https://your-redmine-server.com)REDMINE_USERNAMERedmine username for authentication (alternative to API key)REDMINE_PASSWORD密钥Redmine password for authentication (alternative to API key)REDMINE_API_KEY密钥Redmine API key for authentication (alternative to username/password)SERVER_HOSTHost address for the MCP server (default: 0.0.0.0)SERVER_PORTPort for the MCP server (default: 8000)PUBLIC_HOSTPublic hostname for file download URLs (default: localhost)PUBLIC_PORTPublic port for file download URLs (default: 8000)ATTACHMENTS_DIRDirectory for storing downloaded attachments (default: ./attachments)AUTO_CLEANUP_ENABLEDEnable automatic cleanup of expired files (default: true)CLEANUP_INTERVAL_MINUTESInterval between cleanup runs in minutes (default: 10)ATTACHMENT_EXPIRES_MINUTESDefault expiry time for attachments in minutes (default: 60)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Redmine MCP 服务
一个将 AI 助手连接到 Redmine 的模型上下文协议(MCP)服务。它将 Redmine 实例中的项目、问题、工时记录、Wiki 页面和文件作为 MCP 工具提供。
mcp-name: io.github.jztan/redmine-mcp-server
AI Agent 通过 redmine-mcp-server 整理 Redmine 冲刺。试用在线演示 →
工具参考 | 更新日志 | 参与贡献 | 故障排除
功能
- 在原生 Redmine 上提供 53 个 MCP 工具,安装 RedmineUP 和 DMSF 插件后可提供 68 个(另有 1 个需通过
REDMINE_MCP_EXPOSE_ADMIN_TOOLS=true启用的运维工具):问题、项目、新闻、工时记录、Wiki、甘特图、文件操作、成员管理、产品、联系人和交易(CRM)、DMSF 文档、Helpdesk 邮件回复和工单联系人等 - 交互式看板:
show_triage_board通过 MCP Apps 扩展,在聊天界面中直接呈现实时、可拖放的问题看板 - 灵活的身份验证:API 密钥、用户名/密码、每位用户单独的 OAuth2 令牌,或在不支持 OAuth 的 Redmine 上使用浏览器登录,并使用每位用户自己的 API 密钥
- 提示词注入防护:将用户控制的内容用边界标签包裹,确保大模型安全处理
- 只读模式:通过
REDMINE_MCP_READ_ONLY环境变量限制为只读操作 - HTTP 文件服务:通过基于 UUID 的 URL 安全访问附件,并自动过期
- 分页支持:通过可配置的上限处理大量结果
- 符合 MCP 规范:基于 FastMCP 构建,使用 HTTP 传输
- 支持 Docker:提供 Dockerfile、docker-compose 配置和 GHCR 上的预构建镜像
快速开始
- 安装软件包
pip install redmine-mcp-server - 创建
.env文件,填入 Redmine 凭据(模板请参阅安装) - 启动服务
redmine-mcp-server - 使用 MCP 客户端配置中的任一指南,将服务添加到 MCP 客户端。
启动后,服务会监听 http://localhost:8000,MCP 端点为 /mcp,健康检查端点为 /health,文件服务端点为 /files/{file_id}。
安装
前提条件
- Python 3.10+(用于本地安装)
- Docker(可替代部署方式,使用 Python 3.13)
- 可访问 Redmine 实例
Redmine 兼容性
集成测试套件已在 Redmine 6.1 和 7.0 上全部通过。尚未测试更早的版本。各工具会列出已知的最低版本要求(全局搜索需要 3.3.0+,问题关注者需要 2.3.0+,项目工时记录活动需要 3.4.0+),因此在较旧的服务上,这些特定工具会失败,而不会导致整个服务失效。
任意版本均支持按用户身份验证:OAuth2 需要 Redmine 6.1+ 才能使用 Doorkeeper,其他按用户身份验证模式则没有此要求。请参阅身份验证以选择模式。
从 PyPI 安装(推荐)
# Install the package
pip install redmine-mcp-server
# Create configuration file .env
cat > .env << 'EOF'
# Redmine connection (required)
REDMINE_URL=https://your-redmine-server.com
# Authentication - Use either API key (recommended) or username/password
REDMINE_API_KEY=your_api_key
# OR use username/password:
# REDMINE_USERNAME=your_username
# REDMINE_PASSWORD=your_password
# Server configuration (optional, defaults shown)
SERVER_HOST=0.0.0.0
SERVER_PORT=8000
# Public URL for file serving (optional)
PUBLIC_HOST=localhost
PUBLIC_PORT=8000
# File management (optional)
ATTACHMENTS_DIR=./attachments
AUTO_CLEANUP_ENABLED=true
CLEANUP_INTERVAL_MINUTES=10
ATTACHMENT_EXPIRES_MINUTES=60
EOF
# Edit .env with your actual Redmine settings
nano .env # or use your preferred editor
# Run the server
redmine-mcp-server
# Or alternatively:
python -m redmine_mcp_server.main
服务运行于 http://localhost:8000,MCP 端点位于 /mcp,健康检查端点位于 /health,文件服务端点位于 /files/{file_id}。
环境变量配置
环境变量
| 变量 | 必需 | 默认值 | 描述 | |----------|----------|---------|-------------| | `REDMINE_URL` | 是 | – | Redmine 实例的基本 URL | | `REDMINE_AUTH_MODE` | 否 | `legacy` | 身份验证模式:`legacy`、`legacy-per-user`、`oauth`、`oauth-proxy` 或 `api-key-login`(参见[身份验证](#authentication)) | | `REDMINE_PER_USER_TRUST_PROXY` | 是* | `false` | `legacy-per-user` 模式必需。运维人员声明:“此服务位于 TLS 后方,且我的代理不会转发客户端 `X-Forwarded-Proto`。” | | `REDMINE_PER_USER_AUDIT_IDENTITY` | 否 | `false` | 仅限 `legacy-per-user`:逐请求解析并记录 Redmine 用户 ID(会额外增加一次往返) | | `REDMINE_API_KEY_LOGIN_ALLOW_ADMIN` | 否 | `false` | 仅限 `api-key-login`:接受 Redmine 管理员的 API 密钥。无论如何,令牌都不会包含 `admin` 作用域([详情](docs/api-key-login-auth.md#administrator-accounts)) | | `REDMINE_API_KEY_LOGIN_ALLOW_HTTP` | 否 | `false` | 仅限 `api-key-login`:允许使用 `http://` `REDMINE_MCP_BASE_URL`。仅用于本地开发 | | `REDMINE_API_KEY_LOGIN_SESSION_DAYS` | 否 | `30` | 仅限 `api-key-login`:用户再次登录前,会话持续的天数。必须为正数 | | `REDMINE_API_KEY_LOGIN_RATE_LIMIT` | 否 | `300` | 仅限 `api-key-login`:每分钟登录尝试次数的全进程安全上限 | | `REDMINE_API_KEY_LOGIN_BINDING_CRYPTO` | 否 | `server-secret` | 仅限 `api-key-login`:`server-secret` 或 `token-derived`。`token-derived` 会使已存储的 API 密钥无法通过卷和签名密钥获取,但代价是无法在服务端读取([详情](docs/api-key-login-auth.md#binding-protection)) | | `REDMINE_API_KEY` | 是† | – | API 密钥(仅限旧版模式) | | `REDMINE_USERNAME` | 是† | – | 基本身份验证的用户名(仅限旧版模式) | | `REDMINE_PASSWORD` | 是† | – | 基本身份验证的密码(仅限旧版模式) | | `REDMINE_MCP_BASE_URL` | 是‡¶ | `http://localhost:3040` | 此服务的公开基本 URL,末尾不带斜杠(OAuth 模式和 `api-key-login`) | | `FASTMCP_STREAMABLE_HTTP_PATH` | 否 | `/mcp` | `REDMINE_MCP_BASE_URL` 内的 MCP 传输路径 | | `REDMINE_INTROSPECT_CLIENT_ID` | 是‡ | – | MCP 服务用于检查 Bearer 令牌的 Doorkeeper OAuth 客户端 ID(RFC 7662)。在 Redmine 中注册一个机密 OAuth 应用(参见 [`docs/oauth-setup.md`](docs/oauth-setup.md) 第 2 步)。 | | `REDMINE_INTROSPECT_CLIENT_SECRET` | 是‡ | – | 检查客户端的密钥 | | `REDMINE_MCP_JWT_SIGNING_KEY` | 是§¶ | – | FastMCP OAuthProxy 令牌与存储,以及 `api-key-login` 存储使用的稳定签名/加密密钥。更改此密钥会使所有用户退出登录 | | `REDMINE_OAUTH_CLIENT_ID` | 否 | – | `oauth-proxy` 的可选上游 Redmine OAuth 客户端 ID;默认使用 `REDMINE_INTROSPECT_CLIENT_ID` | | `REDMINE_OAUTH_CLIENT_SECRET` | 否 | – | `oauth-proxy` 的可选上游 Redmine OAuth 客户端密钥;默认使用 `REDMINE_INTROSPECT_CLIENT_SECRET` | | `FASTMCP_HOME` | 否 | 平台默认值(Docker 中为 `/app/data/fastmcp`) | FastMCP 数据目录。在 `oauth-proxy` 模式下,加密的 OAuthProxy 状态存储在 `FASTMCP_HOME/oauth-proxy/` 下;在 `api-key-login` 模式下则存储在 `FASTMCP_HOME/api-key-login/` 下。两者都必须位于持久卷上,才能在容器重建后保留 | | `REDMINE_MCP_ALLOWED_CLIENT_REDIRECT_URIS` | 否 | 仅限 loopback | `oauth-proxy` 和 `api-key-login` 客户端重定向 URI 允许列表(glob 模式,以逗号/空格分隔)。未设置时为 `http://localhost:*` 和 `http://127.0.0.1:*`;`*` = 允许所有 URI | | `REDMINE_MCP_ACCESS_TOKEN_EXPIRY_SECONDS` | 否 | Redmine 的 `expires_in`(2h) | 仅限 `oauth-proxy`。代理发给客户端的访问令牌有效期。可调高(例如 `604800`),让客户端很少需要刷新;上游 Redmine 令牌仍会在服务端刷新。未设置或设为 `0` 时沿用 Redmine 的值 | | `HEALTH_INTROSPECTION_TTL_SECONDS` | 否 | `30` | `/health` Doorkeeper 检查探测缓存的 TTL(秒)。设为 `0` 可禁用缓存。 | | `SERVER_HOST` | 否 | `0.0.0.0` | MCP 服务绑定的主机/IP | | `SERVER_PORT` | 否 | `8000` | MCP 服务监听的端口 | | `REDMINE_MCP_TRANSPORT` | 否 | `http` | `http` 在 `/mcp` 提供 MCP。`stdio` 通过 stdin/stdout 向自行启动服务的客户端提供 MCP,不使用端口或桥接;仅限 `legacy` 模式。任何其他值都会导致服务拒绝启动([详情](#stdio-transport)) | | `PUBLIC_HOST` | 否 | `localhost` | 生成下载 URL 时使用的主机名 | | `PUBLIC_PORT` | 否 | `8000` | 下载 URL 使用的公开端口 | | `PUBLIC_SCHEME` | 否 | 自动推导 | 下载 URL 使用的协议(`http` 或 `https`)。未设置时,若 `PUBLIC_PORT=443` 则推导为 `https`,否则为 `http`。非标准端口上的 TLS 请显式设置。生成的 URL 中会省略默认端口(80/443)。 | | `REDMINE_PUBLIC_URL` | 否 | – | 可公开访问的 Redmine 实例 URL。设置后,附件返回的 `content_url` 值会将来源从 `REDMINE_URL` 替换为此 URL(保留路径/查询/片段以及任何反向代理子路径)。当 `REDMINE_URL` 是 MCP 客户端无法访问的内部容器主机名时,此设置很有用。未设置时,会返回 Redmine 原样返回的 URL。 | | `ATTACHMENTS_DIR` | 否 | `./attachments` | 下载附件的目录 | | `ATTACHMENT_MAX_DOWNLOAD_BYTES` | 否 | `209715200`(200 MB) | 对每次 `get_redmine_attachment` 下载设置的上限,不受内容类型影响。超过上限会中止下载并删除部分文件。 | | `REDMINE_MCP_UPLOAD_FILE_ROOTS` | 否 | – | 允许作为 `file_path` 上传来源的额外目录(以 OS 路径分隔符分隔)。始终允许 `ATTACHMENTS_DIR`。未设置时,上传仅限于 `ATTACHMENTS_DIR`。 | | `AUTO_CLEANUP_ENABLED` | 否 | `true` | 启用/禁用过期附件的自动清理 | | `CLEANUP_INTERVAL_MINUTES` | 否 | `10` | 清理任务的间隔(也会在 `oauth-proxy` 和 `api-key-login` 模式下删除过期的 OAuth 状态) | | `ATTACHMENT_EXPIRES_MINUTES` | 否 | `60` | 生成的下载 URL 的有效期 | | `REDMINE_MCP_JOURNAL_VALUE_MAX_CHARS` | 否 | `500` | 日志字段变更文本超过此字符数时,会将变更前后的文本作为 `old_value_length` / `new_value_length` 返回,并标记 `elided: true`,而不是完整返回。Redmine 会同时记录描述编辑前后的文本,因此反复编辑的工单可能会返回多份描述副本。设为 `0` 可禁用省略;`get_redmine_issue` 和 `get_private_notes` 可在每次调用时使用 `include_journal_values=true`。 | | `REDMINE_MCP_EXPOSE_ADMIN_TOOLS` | 否 | `false` | 在 MCP 接口上公开运维/管理员工具。目前用于控制 `cleanup_attachment_files`。无论此标志为何值,后台清理任务都会运行。 | | `REDMINE_SSL_VERIFY` | 否 | `true` | 启用/禁用 SSL 证书验证 | | `REDMINE_SSL_CERT` | 否 | – | 自定义 CA 证书文件的路径 | | `REDMINE_SSL_CLIENT_CERT` | 否 | – | 双向 TLS 的客户端证书路径 | | `REDMINE_TIMEOUT` | 否 | `30` | 等待 Redmine HTTP 响应的整秒数,超时后调用失败。该值用于读取超时;连接超时最长为 10s。设为 `0` 表示无限等待,这会恢复之前的行为,并可能导致请求挂起。 | | `REDMINE_MCP_READ_ONLY` | 否 | `false` | 设为 `true` 时,阻止所有写入操作(创建/更新/删除) | | `REDMINE_MCP_ALLOW_TOOLS` | 否 | – | 仅公开这些工具(以逗号分隔的名称)。未设置时公开所有工具;已设置但未指定任何工具时,服务会拒绝启动。此设置仅缩小接口范围:已列出的工具若插件标志关闭,仍会隐藏。此设置控制完整工具,因此 `manage_X` 的单项操作仍由 `REDMINE_MCP_READ_ONLY` 控制。启动时会对未匹配任何工具的名称发出警告([详情](docs/tool-reference.md#tool-allow-list)) | | `REDMINE_MCP_ALLOW_TOOLS_FILE` | 否 | – | 文件路径;文件中每行包含一个允许的工具名称(`#` 表示注释起始)。当 `REDMINE_MCP_ALLOW_TOOLS` 未设置或为空时使用 | | `REDMINE_MCP_EXTENSIONS` | 否 | – | 启动时导入的 Python 模块,以便为内部 Redmine 插件注册工具(以逗号或空格分隔,并按顺序导入)。未设置时不导入任何模块。模块导入失败,或声明了已被占用的系列或工具名称时,服务会停止([详情](docs/extensions.md)) | | `REDMINE_OAUTH_SCOPE_ENFORCEMENT` | 否 | `on` | 仅限 OAuth 模式和 `api-key-login`:拒绝访问令牌缺少对应 Redmine 权限作用域的工具调用,并据此过滤 `tools/list`。可在旧令牌重新授权期间临时设为 `off`([详情](docs/oauth-setup.md#scope-enforcement)) | | `REDMINE_OAUTH_DISCOVERY_AS` | 否 | `redmine` | 仅限 OAuth 模式:指定授权服务器发现信息要公布的对象。`redmine` 表示你的 Redmine;`self` 表示此服务(发行者 = `REDMINE_MCP_BASE_URL`),并在自身的规范 well-known 位置提供 RFC 8414 元数据,Cursor 等会在该位置探测的客户端需要此设置([详情](docs/oauth-setup.md#cursor-and-self-as-discovery)) | | `REDMINE_MCP_SCOPES` | 否 | – | 仅限 OAuth 模式和 `api-key-login`:在发现信息中公布部分作用域,使其与 Redmine OAuth Application 实际启用的权限相符。这样可以避免客户端请求完整的已公布列表时,在授权确认阶段出现 `invalid_scope`。在 `api-key-login` 模式下,此设置仅缩小此服务提供的作用域范围 | | `REDMINE_AGILE_ENABLED` | 否 | `false` | 启用 RedmineUP Agile 插件支持:`get_redmine_issue` 返回 `story_points`、`agile_sprint_id`、`agile_position`;`update_redmine_issue` 接受 `story_points` | | `REDMINE_CHECKLISTS_ENABLED` | 否 | `false` | 启用 RedmineUP Checklists 插件支持:`get_checklist`、`create_checklist_item`、`update_checklist_item`(需要 Checklists Pro 插件) | | `REDMINE_PRODUCTS_ENABLED` | 否 | `false` | 启用 RedmineUP Products 插件支持:`manage_product`(action=list/get/create/update) | | `REDMINE_CRM_ENABLED` | 否 | `false` | 启用 RedmineUP CRM 插件支持:`manage_contact`(action=list/get/create/update/delete/assign_to_project/remove_from_project)、`list_contact_tags`、`manage_crm_note`(联系人备注)和 `list_crm_queries`。需要 Redmine 服务端安装 CRM 插件并具备 `view_contacts` / `view_private_contacts` 权限;写入操作还需要 `add_contacts` / `edit_contacts` / `delete_contacts`。在 OAuth 模式下,只有设置此标志时才会公布这些作用域,因此 OAuth 应用也必须授予这些权限。 | | `REDMINE_CRM_EDITION` | 否 | `light` | 指定 Redmine 服务端运行的 CRM 插件构建版本:`light` 或 `pro`。两个版本注册的联系人查询筛选条件不同——Pro 构建注册联系人字段,Light 构建仅注册 `tags`;Redmine 会忽略未注册的筛选参数而不报错,并返回整个集合。因此,除非设置为 `pro`,否则 `manage_contact` 在 `list` 操作中会拒绝 `first_name`、`last_name`、`middle_name`、`company`、`job_title`、`email`、`phone` 和 `author_id`,而不是返回看似成功但实际未筛选的列表。无法检测构建版本:Redmine 仅通过 `admin/plugins` 暴露插件版本信息,该页面是 HTML,且仅管理员可访问。 | | `REDMINE_DEALS_ENABLED` | 否 | `false` | 启用 RedmineUP CRM **deals** 支持:`manage_deal`(action=list/get/create/update/delete)、`list_deal_statuses`、`manage_deal_category`、`manage_crm_note`(交易备注)、`list_crm_queries`,以及与 `REDMINE_PRODUCTS_ENABLED` 一同启用时的 `add_deal_product`。此设置独立于 `REDMINE_CRM_ENABLED`,因为 CRM 插件的 Light 版本不包含 deals,也未定义任何 deal 权限;若在该设置下公布这些权限,会导致授权确认失败。需要 CRM 插件的 **Pro** 版本、项目启用 `deals` 项目模块,并具备 `view_deals` 权限;写入操作还需要 `add_deals` / `edit_deals` / `delete_deals`。 | | `REDMINE_DMSF_ENABLED` | 否 | `false` | 启用 DMSF 文档管理插件支持:`manage_document`(action=list/get/create/update)。需要 Redmine 服务端安装 `redmine_dmsf` 插件。 | | `REDMINE_HELPDESK_ENABLED` | 否 | `false` | 启用 RedmineUP Helpdesk 插件支持:`send_helpdesk_email_reply`(向工单客户发送回复邮件)。需要 Redmine 服务端安装 Helpdesk 插件。 | | `REDMINE_HELPDESK_TICKETS_ENABLED` | 否 | `false` | 启用 RedmineUP Helpdesk 工单支持:`manage_helpdesk_ticket`(action=get/set_contact)可读取工单的 Helpdesk 数据,并将其移至另一个现有联系人。需要同时安装 Helpdesk 和 CRM 插件。此设置独立于 `REDMINE_HELPDESK_ENABLED`,因为在 OAuth 模式下,它会公布 `view_helpdesk_tickets`、`view_contacts`、`view_private_contacts` 和 `edit_helpdesk_tickets`,必须先由 Redmine OAuth 应用授予这些权限,才能启用此标志。 | | `REDMINE_TAGS_ENABLED` | 否 | `false` | 启用 AlphaNodes additional_tags 插件支持:`get_redmine_issue` 返回 `tags` 数组,`create_redmine_issue`/`update_redmine_issue` 接受 `tag_list`。需要安装 `additional_tags` 插件,并在 Redmine 服务端具备 `view_issue_tags` / `create_issue_tags` / `edit_issue_tags` 权限。 | | `REDMINE_AUTOFILL_REQUIRED_CUSTOM_FIELDS` | 否 | `false` | 启用工单创建失败后的单次重试,通过填充缺失的必填自定义字段完成创建 | | `REDMINE_REQUIRED_CUSTOM_FIELD_DEFAULTS` | 否 | `{}` | JSON 对象,将必填自定义字段名称映射到创建工单时使用的回退值 | | `REDMINE_ALLOW_PRIVATE_FETCH_URLS` | 否 | `false` | **警告:**禁用所有用于获取附件的 SSRF 防护。切勿在生产环境中设为 `true`。 | *\* `REDMINE_AUTH_MODE=legacy-per-user` 时必需。* *† `REDMINE_AUTH_MODE=legacy` 时必需。必须设置 `REDMINE_API_KEY` 或 `REDMINE_USERNAME`+`REDMINE_PASSWORD`。建议使用 API 密钥。* *‡ `REDMINE_AUTH_MODE=oauth` 或 `REDMINE_AUTH_MODE=oauth-proxy` 时必需。* *§ `REDMINE_AUTH_MODE=oauth-proxy` 时必需。* *¶ `REDMINE_AUTH_MODE=api-key-login` 时必需。* 也可以使用 Docker/Kubernetes 风格的文件变量提供密钥值:`REDMINE_INTROSPECT_CLIENT_SECRET_FILE`、`REDMINE_MCP_JWT_SIGNING_KEY_FILE` 和 `REDMINE_OAUTH_CLIENT_SECRET_FILE`。当 REDMINE_AUTOFILL_REQUIRED_CUSTOM_FIELDS=true 时,create_redmine_issue 会在遇到相关自定义字段验证错误时重试一次(例如 <Field Name> cannot be blank 或 <Field Name> is not included in the list),并且只从以下来源填充值:
- Redmine 自定义字段的
default_value,或 REDMINE_REQUIRED_CUSTOM_FIELD_DEFAULTS
实际上只有第二种来源会生效。服务会通过 GET /projects/{id}.json?include=issue_custom_fields 读取项目自定义字段,而 Redmine 返回的内容只有 id 和名称,因此服务永远无法获取 default_value——详见 list_project_issue_custom_fields。如果希望自动填充能发挥作用,请设置环境变量映射。
示例:
REDMINE_AUTOFILL_REQUIRED_CUSTOM_FIELDS=true
REDMINE_REQUIRED_CUSTOM_FIELD_DEFAULTS='{"Required Field A":"Value A","Required Field B":"Value B"}'
SSL 证书配置
为使用自签名证书或内部 CA 基础设施的 Redmine 服务配置 SSL 证书处理方式。
自签名证书
如果 Redmine 服务使用自签名证书或内部 CA:
# In .env file
REDMINE_URL=https://redmine.company.com
REDMINE_API_KEY=your_api_key
REDMINE_SSL_CERT=/path/to/ca-certificate.crt
支持的证书格式:.pem、.crt、.cer
双向 TLS(客户端证书)
对于需要客户端证书身份验证的环境:
# In .env file
REDMINE_URL=https://secure.redmine.com
REDMINE_API_KEY=your_api_key
REDMINE_SSL_CERT=/path/to/ca-bundle.pem
REDMINE_SSL_CLIENT_CERT=/path/to/cert.pem,/path/to/key.pem
注意:私钥必须未加密(Python requests 库的要求)。
禁用 SSL 验证(仅限开发)
⚠️ 警告:仅在开发/测试环境中使用!
# In .env file
REDMINE_SSL_VERIFY=false
禁用 SSL 验证会使连接容易受到中间人攻击。
有关 SSL 故障排查,请参阅故障排查指南。
身份验证
服务支持五种身份验证模式,通过 REDMINE_AUTH_MODE 选择。默认值为 legacy,因此现有部署无需更改即可继续运行;OAuth2 支持仅作为附加功能提供。
| 使用场景 | 模式 | Redmine |
|---|---|---|
| 单个共享凭据,最简单的设置 | legacy(默认) | 任意 |
| 多用户,且你控制 MCP 客户端 | oauth | 6.1+ |
| 托管服务,客户端自行注册(DCR) | oauth-proxy | 6.1+ |
| 多用户,Redmine 未启用 OAuth,用户通过浏览器登录 | api-key-login | 任意,包括 Easy Redmine |
| 多用户,Redmine 未启用 OAuth,用户在客户端中设置自己的密钥 | legacy-per-user | 任意 |
下方折叠了高级模式。完整设置说明请参阅 OAuth2 设置指南,了解 oauth 和 oauth-proxy;参阅 api-key-login 指南,了解 api-key-login;以及参阅 legacy-per-user 指南,了解 legacy-per-user。
传统模式(默认)
在 .env 中配置一次共享凭据(API 密钥或用户名/密码)。所有发往 Redmine 的请求都使用同一身份。
REDMINE_AUTH_MODE=legacy # or omit entirely; this is the default
REDMINE_URL=https://redmine.example.com
REDMINE_API_KEY=your_api_key
# OR:
# REDMINE_USERNAME=your_username
# REDMINE_PASSWORD=your_password
OAuth2 模式(多用户,Redmine 6.1+)
每个 MCP 请求都携带自己的 Authorization: Bearer <token>,因此每位用户都使用自己的 Redmine 账户进行身份验证。服务会先通过 Doorkeeper 的 introspection 端点验证每个令牌,再转发请求,并提供客户端所需的 OAuth2 发现端点和 /revoke 端点。
REDMINE_AUTH_MODE=oauth
REDMINE_URL=https://redmine.example.com
REDMINE_MCP_BASE_URL=https://redmine-mcp.example.com # public URL of this server
# Confidential OAuth app registered in Redmine admin (see setup guide)
REDMINE_INTROSPECT_CLIENT_ID=...
REDMINE_INTROSPECT_CLIENT_SECRET=...
你需要在 Redmine 管理后台 → Applications 中手动注册 OAuth 应用(不支持 Dynamic Client Registration)。完整操作步骤、端点参考和故障排查指南,请参阅:OAuth2 Setup Guide。
OAuthProxy 模式(托管部署,支持客户端自行注册)
FastMCP 充当面向 MCP 的授权服务器:为 MCP 客户端处理 DCR,然后将用户重定向至 Redmine,由其作为上游 OAuth 提供方处理授权。适用于期望自行注册的客户端(例如 Claude Desktop、VS Code)。
REDMINE_AUTH_MODE=oauth-proxy
REDMINE_URL=https://redmine.example.com
REDMINE_MCP_BASE_URL=https://redmine-mcp.example.com # public URL of this server
# Confidential OAuth app registered in Redmine admin (see setup guide)
REDMINE_INTROSPECT_CLIENT_ID=...
REDMINE_INTROSPECT_CLIENT_SECRET=...
REDMINE_MCP_JWT_SIGNING_KEY=...
上游 Redmine 应用必须将 ${REDMINE_MCP_BASE_URL}/auth/callback 注册为其重定向 URI。有关存储、扩展和凭据复用的说明,请参阅 OAuth2 Setup Guide。
api-key-login 模式(无需 OAuth 的逐用户身份:Easy Redmine、低于 6.1 的 Redmine)
服务充当自己的 OAuth 授权服务器,因此 MCP 客户端只需使用服务 URL 即可连接。首次使用时,客户端会打开浏览器,用户将自己的 Redmine API 密钥粘贴到此服务提供的页面中;此后每次工具调用都会以该用户的身份运行。客户端配置中无需填写任何密钥,也不会要求输入密码。
REDMINE_AUTH_MODE=api-key-login
REDMINE_URL=https://redmine.example.com
REDMINE_MCP_BASE_URL=https://redmine-mcp.example.com # public https URL of this server
REDMINE_MCP_JWT_SIGNING_KEY=... # encrypts the stored keys
服务会将每位用户的密钥加密后存储在 FASTMCP_HOME/api-key-login/ 下,因此该目录需要持久化卷,并且此模式只能运行单个副本。此处的 OAuth 作用域用于缩小客户端请求的权限范围,并非 Redmine 权限;权限边界仍由 Redmine 自身的权限决定。启用此模式前,请阅读 api-key-login guide,了解安全模型、会话规则和客户端设置。
legacy-per-user 模式(低于 6.1 的 Redmine)
对于不支持 OAuth 的旧版 Redmine,每位用户的 MCP 客户端都会在 X-Redmine-API-Key 标头中发送自己的 Redmine API 密钥。每个请求都以该用户的身份及其权限运行。
这是高级的可选模式。 此模式要求端到端使用 TLS,并正确配置反向代理。启用前,请阅读 docs/legacy-per-user-auth.md,了解威胁模型、防火墙指南和密钥撤销操作手册。
mcp-remote(推荐):
{ "mcpServers": { "redmine": {
"command": "npx",
"args": ["mcp-remote", "https://your-host/mcp",
"--header", "X-Redmine-API-Key:${RM_KEY}"],
"env": { "RM_KEY": "<your redmine api key>" }
}}}
注意,X-Redmine-API-Key:${RM_KEY} 中的冒号两侧没有空格。这样可以避免 Cursor 和 Claude Desktop 在 Windows 上的参数转义错误。
VS Code(mcp.json):
使用 .vscode/mcp.json(工作区文件)或用户配置文件中的 mcp.json。工作区的 .mcp.json 会静默丢弃 headers(参见 microsoft/vscode#319528),因此请勿使用该文件。VS Code 版本请使用 1.102 或更高版本。
{
"servers": {
"redmine": {
"type": "http",
"url": "https://your-host/mcp",
"headers": { "X-Redmine-API-Key": "${input:rmKey}" },
"inputs": [{ "id": "rmKey", "type": "promptString",
"description": "Redmine API key", "password": true }]
}
}
}
**不支持:**无法设置自定义请求标头的客户端,或将 Authorization 标头保留给自身 OAuth 流程使用的客户端。
MCP 客户端配置
服务在 http://127.0.0.1:8000/mcp 提供 HTTP 端点。请按照以下说明,将其注册到你首选的 MCP 兼容 Agent。能够自行启动 MCP 服务的客户端也可以通过 stdio 运行此服务,无需运行中的服务,也无需桥接程序:请参阅 stdio transport。
以下示例假设使用
legacy或oauth模式。在legacy-per-user模式下,每个客户端还必须发送X-Redmine-API-Key标头;需要使用能处理标头的配置,请参阅上文的 legacy-per-user 模式。
Visual Studio Code(原生 MCP 支持)
VS Code 通过 GitHub Copilot 内置了 MCP 支持(需要 VS Code 1.102+)。
使用 CLI(最快):
code --add-mcp '{"name":"redmine","type":"http","url":"http://127.0.0.1:8000/mcp"}'
使用命令面板:
- 打开命令面板(
Cmd/Ctrl+Shift+P) - 运行
MCP: Open User Configuration(用于全局配置)或MCP: Open Workspace Folder Configuration(用于项目专属配置) - 添加以下配置:
{ "servers": { "redmine": { "type": "http", "url": "http://127.0.0.1:8000/mcp" } } } - 保存文件。VS Code 将自动加载 MCP 服务。
手动配置:
在工作区中创建 .vscode/mcp.json(或在用户配置文件目录中创建 mcp.json):
{
"servers": {
"redmine": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp"
}
}
}
Claude Code
使用 CLI 命令将其添加到 Claude Code:
claude mcp add --transport http redmine http://127.0.0.1:8000/mcp
或者在 Claude Code 设置文件(~/.claude.json)中手动配置:
{
"mcpServers": {
"redmine": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp"
}
}
}
Claude Desktop(macOS 和 Windows)
Claude Desktop 的配置文件仅支持 stdio 传输。使用 FastMCP 的代理通过 uv 连接到此 HTTP 服务。
设置:
- 打开 Claude Desktop
- 点击 Claude 菜单(macOS 菜单栏 / Windows 标题栏)> Settings...
- 点击 Developer 选项卡 > Edit Config
- 添加以下配置:
{
"mcpServers": {
"redmine": {
"command": "uv",
"args": [
"run",
"--with", "fastmcp",
"fastmcp",
"run",
"http://127.0.0.1:8000/mcp"
]
}
}
}
- 保存文件,然后完全退出并重启 Claude Desktop
- 查看输入区域中的工具图标,以确认连接成功
配置文件位置:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
注意: 启动 Claude Desktop 前,Redmine MCP 服务必须处于运行状态。
Cursor
Cursor 可直接连接 HTTP MCP 服务,无需桥接。
- 创建
~/.cursor/mcp.json(在每个项目中均可使用),或在项目根目录中创建.cursor/mcp.json(仅适用于该项目):{ "mcpServers": { "redmine": { "url": "http://127.0.0.1:8000/mcp" } } } - 保存文件。Cursor 会自动加载该服务;其 MCP 设置会列出该服务及其加载的工具。
注意: 与上面的 VS Code 和 Claude Code 配置不同,Cursor 使用不带其他字段的 url 来标识远程服务,并且没有 type 字段。
在 legacy-per-user 模式下,添加 API 密钥标头:
{
"mcpServers": {
"redmine": {
"url": "https://your-host/mcp",
"headers": { "X-Redmine-API-Key": "<your redmine api key>" }
}
}
}
在 oauth 模式下,在 MCP 服务上设置 REDMINE_OAUTH_DISCOVERY_AS=self。Cursor 会在其自身的规范 well-known 位置查找授权服务元数据,而默认的 redmine 发现配置不提供该元数据,因此如果不设置此项,授权流程会停滞(#188)。请参阅 Cursor 和 self-AS 发现。
Codex CLI
使用以下命令将其添加到 Codex CLI:
codex mcp add redmine -- npx -y mcp-client-http http://127.0.0.1:8000/mcp
或者在 ~/.codex/config.toml 中手动配置:
[mcp_servers.redmine]
command = "npx"
args = ["-y", "mcp-client-http", "http://127.0.0.1:8000/mcp"]
注意: Codex CLI 主要支持基于 stdio 的 MCP 服务。上述配置使用 mcp-client-http 作为 HTTP 传输的桥接工具。
Kiro
Kiro 主要支持基于 stdio 的 MCP 服务。对于 HTTP 服务,请使用 HTTP 到 stdio 的桥接工具:
- 在工作区中创建或编辑
.kiro/settings/mcp.json:{ "mcpServers": { "redmine": { "command": "npx", "args": [ "-y", "mcp-client-http", "http://127.0.0.1:8000/mcp" ], "disabled": false } } } - 保存文件并重启 Kiro。Redmine 工具将显示在 MCP 面板中。
注意: Kiro 对直接 HTTP 传输的支持有限。上述配置使用 mcp-client-http 作为桥接工具来连接 HTTP MCP 服务。
通用 MCP 客户端
大多数 MCP 客户端都使用标准配置格式。对于 HTTP 服务:
{
"mcpServers": {
"redmine": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp"
}
}
}
对于需要通过 HTTP 桥接工具使用命令方式的客户端:
{
"mcpServers": {
"redmine": {
"command": "npx",
"args": ["-y", "mcp-client-http", "http://127.0.0.1:8000/mcp"]
}
}
}
设置 REDMINE_MCP_TRANSPORT=stdio 后,客户端会将服务器作为独立进程启动,并通过 stdin/stdout 与其通信。不会有端口处于监听状态,也不需要上述 HTTP 桥接服务。这仅适用于 legacy 模式,因为其他模式会对每个 HTTP 请求进行身份验证。
Claude Code:
claude mcp add redmine \
-e REDMINE_URL=https://your-redmine-server.com \
-e REDMINE_API_KEY=your_api_key \
-e REDMINE_MCP_TRANSPORT=stdio \
-e ATTACHMENTS_DIR=/absolute/path/to/redmine-attachments \
-- uvx redmine-mcp-server
Claude Desktop、Codex CLI、Kiro 和其他基于命令的客户端:
{
"mcpServers": {
"redmine": {
"command": "uvx",
"args": ["redmine-mcp-server"],
"env": {
"REDMINE_URL": "https://your-redmine-server.com",
"REDMINE_API_KEY": "your_api_key",
"REDMINE_MCP_TRANSPORT": "stdio",
"ATTACHMENTS_DIR": "/absolute/path/to/redmine-attachments"
}
}
}
}
没有 HTTP 服务器,就没有可提供的 URL,因此 get_redmine_attachment 会返回本地 file_path,而 create_upload_ticket 会拒绝操作;请改用 file_path 附加本地文件(允许的文件夹:ATTACHMENTS_DIR 加上 REDMINE_MCP_UPLOAD_FILE_ROOTS)。将 ATTACHMENTS_DIR 设为绝对路径:默认值 ./attachments 是相对于客户端启动服务器所在的文件夹而言的,而该文件夹通常是你当前打开的项目。
测试你的设置
# Test connection by checking health endpoint
curl http://localhost:8000/health
支持的 Redmine 插件
该服务器可在标准 Redmine 实例上运行。六个可选插件可提供更多功能;由于 CRM 的交易和 Helpdesk 的工单各自有独立的标记,因此下方列出了八行。若要 使用某个插件,请在 Redmine 服务器上安装它,并设置相应的环境变量。 跳过插件只会使你无法使用该插件的功能。
只有设置了环境变量,插件工具才会出现在客户端的工具列表中;关闭标记时,这些工具根本不会注册到 MCP 接口上。
| 插件 | 供应商 | 环境变量 | 提供的功能 |
|---|---|---|---|
| Agile | RedmineUP | REDMINE_AGILE_ENABLED | get_redmine_issue 会返回 story_points、agile_sprint_id、agile_position;update_redmine_issue 接受 story_points |
| Checklists | RedmineUP(Pro) | REDMINE_CHECKLISTS_ENABLED | 3 个工具:get_checklist、create_checklist_item、update_checklist_item |
| Products | RedmineUP | REDMINE_PRODUCTS_ENABLED | 1 个工具:manage_product;同时设置 REDMINE_DEALS_ENABLED 后,还会提供 add_deal_product |
| CRM | RedmineUP | REDMINE_CRM_ENABLED | 2 个工具:manage_contact、list_contact_tags;另有 2 个共享 CRM 工具 manage_crm_note 和 list_crm_queries,设置任一 CRM 标记即可启用(启用时,会将 *_contacts 和 note 作用域加入 OAuth 发现) |
| CRM deals | RedmineUP(Pro) | REDMINE_DEALS_ENABLED | 3 个工具:manage_deal、list_deal_statuses、manage_deal_category;另有上述 2 个共享 CRM 工具,并且同时设置 REDMINE_PRODUCTS_ENABLED 时还会提供 add_deal_product(启用时,会将 *_deals 和 note 作用域加入 OAuth 发现)。这是与 CRM 相同的插件,但 Light 版本不包含交易功能 |
| DMSF | danmunn(开源) | REDMINE_DMSF_ENABLED | 1 个工具:manage_document |
| Helpdesk | RedmineUP | REDMINE_HELPDESK_ENABLED | 1 个工具:send_helpdesk_email_reply |
| Helpdesk tickets | RedmineUP | REDMINE_HELPDESK_TICKETS_ENABLED | 1 个工具:manage_helpdesk_ticket。这是与 Helpdesk 相同的插件,但使用独立标记,因为它会增加 OAuth 作用域 |
| Additional Tags | AlphaNodes(开源) | REDMINE_TAGS_ENABLED | get_redmine_issue 会返回一个 tags 数组;create_redmine_issue / update_redmine_issue 接受 tag_list |
Agile 和 Additional Tags 会为现有工具添加字段,因此不会注册新工具。其他七个插件会提供各自的工具,这些工具无论如何都会显示在 tools/list 中,但在设置标记之前会返回功能已禁用的错误。Tags 还需要在 Redmine 服务器上授予 view_issue_tags、create_issue_tags 和 edit_issue_tags 权限。
可通过独立软件包添加为内部编写的 Redmine 插件提供的工具,无需分叉此服务器;请参阅扩展。
可用工具
部署可以通过 REDMINE_MCP_ALLOW_TOOLS 暴露其中的一部分;其余工具会从 tools/list 中消失,并且调用 call_tool 时会被拒绝。
此 MCP 服务提供 53 个与 Redmine 交互的核心工具,以及 15 个仅在设置相应 REDMINE_*_ENABLED 标志时才会列出的插件工具(共 68 个);此外,设置 REDMINE_MCP_EXPOSE_ADMIN_TOOLS=true 后会暴露 1 个运维工具(最多 69 个)。连接到原版 Redmine 的客户端只能看到 53 个核心工具。有关所有工具的完整文档,请参阅工具参考。
核心工具(53 个,始终可用): 项目管理(10 个)、问题操作(13 个)、时间跟踪(4 个)、发现 / 枚举(7 个)、搜索与 Wiki(2 个)、新闻(4 个)、文件操作(5 个)、甘特图(1 个)、交互式应用(6 个)、元数据(1 个)。
受插件标志控制的工具(15 个,仅在设置相应标志时列出): 清单(3 个)、产品(1 个)、联系人 / CRM(2 个)、交易 / CRM(3 个)、共享的 CRM 备注和已保存的查询(2 个,任一 CRM 标志均可)、交易产品条目(1 个,需启用交易和产品)、文档 / DMSF(1 个)、帮助台(1 个)、帮助台工单(1 个)。每项都需要安装相应的 Redmine 插件并且设置其环境标志;关闭标志时,这些工具不会注册到 MCP 接口。
运维工具(1 个,受管理员权限控制): 仅在 REDMINE_MCP_EXPOSE_ADMIN_TOOLS=true 时注册的 cleanup_attachment_files。
完整工具列表及说明
核心工具(53 个,始终可用)
这些工具只需要 Redmine 实例和凭据,无需额外插件或功能标志。
-
项目管理(10 个工具)
list_redmine_projects- 列出可访问的项目(除非filters要求查看更多,否则仅列出活动项目);在服务端缩小范围,并可选择分页list_project_issue_custom_fields- 列出为项目配置的问题自定义字段list_redmine_versions- 列出项目的版本 / 里程碑manage_redmine_version- 创建、更新或删除版本 / 里程碑manage_redmine_project- 创建项目、编辑其设置,或关闭并重新打开项目list_project_members- 列出项目成员及其角色summarize_project_status- 获取全面的项目状态摘要list_redmine_roles- 列出 Redmine 实例中定义的所有角色(用于查找有效的role_ids)get_project_modules- 获取项目已启用的模块manage_project_member- 添加、更新或移除项目成员
-
问题操作(13 个工具)
get_redmine_issue- 获取详细的问题信息(支持日志分页、关注者、关联关系和子问题)list_redmine_issues- 使用灵活的筛选条件列出问题(项目、状态、指派人等)search_redmine_issues- 按文本查询搜索问题create_redmine_issue- 创建新问题,可通过uploads参数选择性地附加文件update_redmine_issue- 更新现有问题,可通过uploads参数选择性地附加文件(与notes结合使用可将文件附加到日志备注)delete_redmine_issue- 永久删除问题;不可撤销地删除前,必须提供确认标记并预览级联影响。copy_issue- 复制现有问题,可选择性地覆盖字段list_subtasks- 列出指定父问题的子任务(子问题)get_private_notes- 获取问题的私人备注manage_issue_relation- 列出、创建或删除问题关联关系manage_issue_watcher- 添加或移除问题的关注者manage_issue_note- 编辑日志备注文本或切换其隐私设置manage_issue_category- 列出、创建、更新或删除问题类别- 注意:
get_redmine_issue可包含custom_fields,而update_redmine_issue可按名称更新自定义字段(例如{"size": "S"})。
-
时间跟踪(4 个工具)
list_time_entries- 按项目、问题、用户和日期范围筛选并列出工时记录manage_time_entry- 创建或更新工时记录(使用user_id可代其他用户记录工时)list_time_entry_activities- 查询工时记录可用的活动类型import_time_entries- 通过顺序调用 API 批量导入工时记录,并逐条报告错误
-
发现 / 枚举(7 个工具):帮助 LLM 在调用创建 / 更新工具前查找有效 ID
list_redmine_trackers- 列出所有跟踪器(Bug、Feature、Support 等)list_project_trackers- 列出特定项目启用的跟踪器list_redmine_issue_statuses- 列出所有问题状态及其is_closed标记list_redmine_issue_priorities- 列出所有优先级list_redmine_users- 筛选 / 列出用户(仅限管理员;支持按名称和用户组筛选)get_current_user- 获取已认证用户的个人资料(非管理员也可使用)list_redmine_queries- 列出已保存的自定义查询(只读)
-
搜索与 Wiki(2 个工具)
search_entire_redmine- 全局搜索问题和 Wiki 页面(Redmine 3.3.0+)manage_redmine_wiki_page- 列出、获取、创建、更新、删除或重命名 Wiki 页面
-
新闻(4 个工具):项目公告——发布说明、维护时段
list_redmine_news- 列出新闻,可选择指定项目get_redmine_news- 查看一条新闻及其评论和附件manage_redmine_news- 创建或更新新闻(Redmine 4.1+)delete_redmine_news- 删除新闻,需要确认(Redmine 4.1+)
-
文件操作(5 个工具)
list_files- 列出上传到项目“文件”版块的文件create_upload_ticket- 预留上传位置并返回一次性 URL,使调用方机器上的文件能够传到服务端,而无需将文件字节传经模型upload_file- 将新文件上传到项目(来源可以是暂存的upload_id、URL、base64 内容或服务端的file_path),也可选择关联到某个版本delete_file- 从项目中删除文件get_redmine_attachment- 下载附件(HTTP 和 stdio 模式均可使用)
-
甘特图(1 个工具)
get_gantt_chart- 获取项目时间线数据:包含日期、依赖关系和里程碑的事项
-
交互式应用(4 个工具):通过 MCP Apps 扩展在聊天中呈现实时 UI(需要客户端支持)
show_triage_board- 将项目事项呈现为按状态分组的交互式看板,并支持拖动以更改状态并回写get_triage_board_data- 为看板的刷新操作提供数据源show_project_dashboard- 将项目实时快照(未关闭/已关闭、逾期、本周到期、按优先级统计的未关闭事项、近期活动)呈现为交互式仪表板,并可点击深入查看匹配的事项列表get_project_dashboard_data- 仅供应用使用的数据源,为仪表板的刷新操作提供数据show_project_timeline- 将项目计划呈现为交互式时间线:按版本显示事项条形图、里程碑菱形图标和“今天”标线get_project_timeline_data- 仅供应用使用的数据源,为时间线的刷新操作提供数据
-
元信息(1 个工具)
get_mcp_server_info- 报告服务版本、认证模式、只读状态、已认证用户(current_user),以及已启用的插件门控工具类别。可用于在依赖近期发布的修复前检测部署是否滞后,或确认assigned_to_id="me"对应的用户。
插件门控工具(15 个,通过环境变量启用)
这些工具要求服务端安装相应的 Redmine 插件,并且在 MCP 服务上将对应的环境变量设为 true。只有设置了标志时,它们才会列在 tools/list 中;关闭标志后,它们不会注册到 MCP 接口上(直接调用仍会返回功能未启用错误)。
-
检查清单(3 个工具):设置
REDMINE_CHECKLISTS_ENABLED=true;需要安装 RedmineUP Checklists Pro 插件get_checklist- 获取问题的所有检查清单项create_checklist_item- 为问题添加新的检查清单项update_checklist_item- 更新检查清单项的文本、完成状态或位置
-
产品(1 个工具):设置
REDMINE_PRODUCTS_ENABLED=true;需要安装 RedmineUP Products 插件manage_product- 列出、获取、创建或更新产品
-
联系人(CRM)(2 个工具):设置
REDMINE_CRM_ENABLED=true;需要安装 RedmineUP CRM 插件。在 OAuth 模式下,此标志还会将 CRM 权限添加到公布的作用域中,因此请在 OAuth 应用程序中授予这些权限,并让用户重新授权。在 Pro 安装中设置REDMINE_CRM_EDITION=pro,以允许联系人list筛选器;Light 版本不会注册这些筛选器manage_contact- 列出、获取、创建、更新、删除联系人,或分配/移除联系人与项目的关联list_contact_tags- 获取联系人正在使用的标签及其颜色,供tags筛选器和tag_list使用
-
交易(CRM)(3 个工具):设置
REDMINE_DEALS_ENABLED=true;需要安装同一 CRM 插件的 Pro 版本,并在项目中启用deals项目模块。交易使用独立标志,因为 Light 版本未定义任何交易权限,公布这些权限会导致 Light 部署无法完成授权manage_deal- 列出、获取、创建、更新或删除交易list_deal_statuses- 获取交易状态(仅限插件端管理员)及项目的交易类别,供创建交易前使用manage_deal_category- 列出、创建、重命名或删除项目的交易类别
-
CRM 备注和已保存查询(2 个共享工具):设置
REDMINE_CRM_ENABLED或REDMINE_DEALS_ENABLED后即可使用;每次调用都会根据备注或查询的来源检查对应标志manage_crm_note- 获取、创建、更新或删除联系人和交易上的 CRM 备注list_crm_queries- 获取已保存的联系人或交易查询
-
交易产品条目(1 个工具):需要同时设置
REDMINE_DEALS_ENABLED=true和REDMINE_PRODUCTS_ENABLED=true;只有在 CRM 旁安装了 Products 插件时,该端点才存在add_deal_product- 向交易添加目录产品或自定义产品条目
-
文档(DMSF)(1 个工具):设置
REDMINE_DMSF_ENABLED=true;需要安装redmine_dmsf插件manage_document- 列出、获取、创建(上传)或更新(新修订版)DMSF 文档
-
Helpdesk(1 个工具):设置
REDMINE_HELPDESK_ENABLED=true;需要安装 RedmineUP Helpdesk 插件send_helpdesk_email_reply- 向 Helpdesk 工单的客户发送电子邮件回复,可选择同时更改工单状态
-
Helpdesk 工单(1 个工具):设置
REDMINE_HELPDESK_TICKETS_ENABLED=true;需要安装 RedmineUP Helpdesk 插件和 RedmineUP CRM 插件manage_helpdesk_ticket- 读取工单的 Helpdesk 数据,或将其移至另一个现有联系人
运维工具(1 个,需管理员权限)
默认情况下不会显示在 tools/list 中。设置 REDMINE_MCP_EXPOSE_ADMIN_TOOLS=true 可在 MCP 接口中注册这些工具。无论此标志如何设置,底层后台任务都会运行;公开这些工具只会增加通过 MCP 驱动这些任务的选项。
cleanup_attachment_files- 手动触发清理过期附件文件(无论如何,后台清理任务都会自动运行)
Docker 部署
使用 Docker 快速入门
# Configure environment
cp .env.docker.example .env.docker
# Edit .env.docker with your Redmine settings
# Run with docker-compose
docker-compose up --build
# Or run directly
docker build -t redmine-mcp-server .
docker run -p 8000:8000 --env-file .env.docker redmine-mcp-server
使用已发布的镜像
每次发布时,都会将预构建的多架构镜像(linux/amd64、linux/arm64)发布到
GitHub Container Registry,因此无需自行构建即可运行服务:
docker pull ghcr.io/jztan/redmine-mcp-server:latest
docker run -p 8000:8000 --env-file .env.docker ghcr.io/jztan/redmine-mcp-server:latest
固定到精确版本(例如 ghcr.io/jztan/redmine-mcp-server:2.2.0),或跟踪
次要版本系列(例如 :2.2)。已发布的镜像从下一个版本开始提供。
生产环境部署
使用自动化部署脚本:
chmod +x deploy.sh
./deploy.sh
故障排除
如果遇到任何问题,请查看我们的故障排除指南。
路线图
请参阅路线图,了解计划中的功能和未来开发。
贡献
欢迎贡献!详情请参阅我们的贡献指南。
贡献者
感谢所有通过代码、评审、测试和功能请求帮助改进此项目的人:
@sebastianelsner · @mihajlovicjj · @timcomport · @aadnehovda · @Vitexus · @Bricklou · @martindglaser · @LaurensRietveld · @pdostal · @stevehollis-orderflow · @knasiotis · @azelcs · @fionnb · @goizper · @mmahmed · @andilem · @gino8080 · @siva01c · @chesterXalan · @mliebischer
每个版本的贡献者名单见变更日志。
此外,感谢 RedmineUP 提供 CRM PRO 和 Helpdesk PRO 的评估副本,使我们能够使用真实的 Pro 实例验证 CRM 和 Helpdesk 工具。
许可证
本项目采用 MIT 许可证授权——详情请参阅 LICENSE 文件。
博客文章
版本发布背后的故事。 构建这个服务的过程总让我不断遇到意外:事实证明全面 API 访问是个错误;69 个工具不得不精简为 43 个;还有一个 OAuth 作用域错误,直到一位贡献者在真实的 Redmine 6 实例上运行授权流程时才暴露出来。许多最深刻的经验,来自其他人的部署,而不是我自己的。我在 The Dispatch 中写下了这些思考。如果你也感兴趣,欢迎加入。
构建这个服务的背景、设计笔记和复盘:
入门
- Redmine MCP Server:为 AI Agent 提供实时项目数据:介绍这个服务的功能、为何工具范围经过精选而非完整映射 API,以及如何选择 Redmine MCP 服务
- 我如何用 MCP 将传统系统连接到现代 AI Agent:介绍这个项目的起因,以及最初的两个只读工具
工具设计与架构
- 设计可靠的 MCP 服务:Agent 架构的 3 个艰难教训:为何向 Agent 开放全面 API 访问是个错误,以及后来用什么方案取代
- MCP 工具泛滥:我如何用装饰器将 69 个工具精简为 43 个:v2 整合如何降低上下文开销,并让 Agent 更准确地选择工具
生产实践
- MCP 文件上传:为什么 Base64 工具参数会损坏文件:为何模型重新输入 Base64 后,一个 3 KB 的 PNG 文件会悄然丢失 32 个字符,以及后来取代它的旁路上传方案和 SHA-256 校验
- 如何用大模型评估 MCP 服务:发现并修复 17 个错误:用 Agent 驱动服务,发现了测试套件遗漏的 17 个问题,其中包括一个
role_ids=[True]错误,它会悄悄分配更高权限的角色 - 为 Redmine 发布生产级 MCP 服务究竟需要做什么:从原型到生产环境的完整历程
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。