mcpField
R
redmine-mcp-server

redmine-mcp-server

本地服务
github.com/jztan生产力852 周前更新

关于 redmine-mcp-server

redmine-mcp-server 将 Redmine 实例接入 AI 助手,适用于需要通过 MCP 管理项目与工单的团队。它提供覆盖问题、项目、工时、Wiki 和文件等领域的工具,并支持多种认证方式及只读限制。

主要功能

  1. 01管理问题、项目和新闻
  2. 02操作工时、Wiki 与文件
  3. 03支持 Gantt、成员及插件功能
  4. 04提供多种认证模式
  5. 05支持只读模式和工具访问限制
  6. 06通过 MCP Apps 显示看板

适用场景

  1. 01在对话中整理和分派工单
  2. 02查询项目工时与 Wiki 内容
  3. 03通过看板查看待处理问题

MCP 相关

MCP 服务将 Redmine 项目、问题、工时、Wiki 页面和文件作为工具提供给 MCP 客户端;通过 HTTP 传输,也支持 stdio 模式。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"jztan-redmine": {
"command": "uvx",
"args": [
"redmine-mcp-server"
],
"env": {
"REDMINE_URL": "<REDMINE_URL>",
"REDMINE_USERNAME": "<REDMINE_USERNAME>",
"REDMINE_PASSWORD": "<REDMINE_PASSWORD>",
"REDMINE_API_KEY": "<REDMINE_API_KEY>",
"SERVER_HOST": "<SERVER_HOST>",
"SERVER_PORT": "<SERVER_PORT>",
"PUBLIC_HOST": "<PUBLIC_HOST>",
"PUBLIC_PORT": "<PUBLIC_PORT>",
"ATTACHMENTS_DIR": "<ATTACHMENTS_DIR>",
"AUTO_CLEANUP_ENABLED": "<AUTO_CLEANUP_ENABLED>",
"CLEANUP_INTERVAL_MINUTES": "<CLEANUP_INTERVAL_MINUTES>",
"ATTACHMENT_EXPIRES_MINUTES": "<ATTACHMENT_EXPIRES_MINUTES>"
}
}
}
}
启动命令uvx redmine-mcp-server
需要配置的环境变量
REDMINE_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiredmine-mcp-server2.19.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Redmine MCP 服务

PyPI Version License Python Version Redmine Version GitHub Issues CI Coverage Downloads

一个将 AI 助手连接到 Redmine 的模型上下文协议(MCP)服务。它将 Redmine 实例中的项目、问题、工时记录、Wiki 页面和文件作为 MCP 工具提供。

mcp-name: io.github.jztan/redmine-mcp-server

AI Agent 通过 redmine-mcp-server 整理 Redmine 冲刺待办事项

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 上的预构建镜像

快速开始

  1. 安装软件包
    pip install redmine-mcp-server
    
  2. 创建 .env 文件,填入 Redmine 凭据(模板请参阅安装)
  3. 启动服务
    redmine-mcp-server
    
  4. 使用 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 客户端oauth6.1+
托管服务,客户端自行注册(DCR)oauth-proxy6.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"}'

使用命令面板:

  1. 打开命令面板(Cmd/Ctrl+Shift+P)
  2. 运行 MCP: Open User Configuration(用于全局配置)或 MCP: Open Workspace Folder Configuration(用于项目专属配置)
  3. 添加以下配置:
    {
      "servers": {
        "redmine": {
          "type": "http",
          "url": "http://127.0.0.1:8000/mcp"
        }
      }
    }
    
  4. 保存文件。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 服务。

设置:

  1. 打开 Claude Desktop
  2. 点击 Claude 菜单(macOS 菜单栏 / Windows 标题栏)> Settings...
  3. 点击 Developer 选项卡 > Edit Config
  4. 添加以下配置:
{
  "mcpServers": {
    "redmine": {
      "command": "uv",
      "args": [
        "run",
        "--with", "fastmcp",
        "fastmcp",
        "run",
        "http://127.0.0.1:8000/mcp"
      ]
    }
  }
}
  1. 保存文件,然后完全退出并重启 Claude Desktop
  2. 查看输入区域中的工具图标,以确认连接成功

配置文件位置:

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows:%APPDATA%\Claude\claude_desktop_config.json

注意: 启动 Claude Desktop 前,Redmine MCP 服务必须处于运行状态。

Cursor

Cursor 可直接连接 HTTP MCP 服务,无需桥接。

  1. 创建 ~/.cursor/mcp.json(在每个项目中均可使用),或在项目根目录中创建 .cursor/mcp.json(仅适用于该项目):
    {
      "mcpServers": {
        "redmine": {
          "url": "http://127.0.0.1:8000/mcp"
        }
      }
    }
    
  2. 保存文件。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 的桥接工具:

  1. 在工作区中创建或编辑 .kiro/settings/mcp.json:
    {
      "mcpServers": {
        "redmine": {
          "command": "npx",
          "args": [
            "-y",
            "mcp-client-http",
            "http://127.0.0.1:8000/mcp"
          ],
          "disabled": false
        }
      }
    }
    
  2. 保存文件并重启 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"]
    }
  }
}
### stdio 传输方式

设置 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 接口上。

插件供应商环境变量提供的功能
AgileRedmineUPREDMINE_AGILE_ENABLEDget_redmine_issue 会返回 story_points、agile_sprint_id、agile_position;update_redmine_issue 接受 story_points
ChecklistsRedmineUP(Pro)REDMINE_CHECKLISTS_ENABLED3 个工具:get_checklist、create_checklist_item、update_checklist_item
ProductsRedmineUPREDMINE_PRODUCTS_ENABLED1 个工具:manage_product;同时设置 REDMINE_DEALS_ENABLED 后,还会提供 add_deal_product
CRMRedmineUPREDMINE_CRM_ENABLED2 个工具:manage_contact、list_contact_tags;另有 2 个共享 CRM 工具 manage_crm_note 和 list_crm_queries,设置任一 CRM 标记即可启用(启用时,会将 *_contacts 和 note 作用域加入 OAuth 发现)
CRM dealsRedmineUP(Pro)REDMINE_DEALS_ENABLED3 个工具:manage_deal、list_deal_statuses、manage_deal_category;另有上述 2 个共享 CRM 工具,并且同时设置 REDMINE_PRODUCTS_ENABLED 时还会提供 add_deal_product(启用时,会将 *_deals 和 note 作用域加入 OAuth 发现)。这是与 CRM 相同的插件,但 Light 版本不包含交易功能
DMSFdanmunn(开源)REDMINE_DMSF_ENABLED1 个工具:manage_document
HelpdeskRedmineUPREDMINE_HELPDESK_ENABLED1 个工具:send_helpdesk_email_reply
Helpdesk ticketsRedmineUPREDMINE_HELPDESK_TICKETS_ENABLED1 个工具:manage_helpdesk_ticket。这是与 Helpdesk 相同的插件,但使用独立标记,因为它会增加 OAuth 作用域
Additional TagsAlphaNodes(开源)REDMINE_TAGS_ENABLEDget_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 个工具)

  • 问题操作(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 个工具)

  • 发现 / 枚举(7 个工具):帮助 LLM 在调用创建 / 更新工具前查找有效 ID

  • 搜索与 Wiki(2 个工具)

  • 新闻(4 个工具):项目公告——发布说明、维护时段

  • 文件操作(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 插件

  • 产品(1 个工具):设置 REDMINE_PRODUCTS_ENABLED=true;需要安装 RedmineUP Products 插件

  • 联系人(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 后即可使用;每次调用都会根据备注或查询的来源检查对应标志

  • 交易产品条目(1 个工具):需要同时设置 REDMINE_DEALS_ENABLED=true 和 REDMINE_PRODUCTS_ENABLED=true;只有在 CRM 旁安装了 Products 插件时,该端点才存在

  • 文档(DMSF)(1 个工具):设置 REDMINE_DMSF_ENABLED=true;需要安装 redmine_dmsf 插件

    • manage_document - 列出、获取、创建(上传)或更新(新修订版)DMSF 文档
  • Helpdesk(1 个工具):设置 REDMINE_HELPDESK_ENABLED=true;需要安装 RedmineUP Helpdesk 插件

  • Helpdesk 工单(1 个工具):设置 REDMINE_HELPDESK_TICKETS_ENABLED=true;需要安装 RedmineUP Helpdesk 插件和 RedmineUP CRM 插件

运维工具(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 中写下了这些思考。如果你也感兴趣,欢迎加入。

构建这个服务的背景、设计笔记和复盘:

入门

工具设计与架构

生产实践

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。