内容
<p align="center">
<img src="logo.png" alt="gojira-mcp" width="200">
</p>
<h1 align="center">gojira-mcp</h1>
<div align="center">
[](https://github.com/bashhack/gojira-mcp/actions/workflows/ci.yml)
[](https://codecov.io/gh/bashhack/gojira-mcp)
[](https://pkg.go.dev/github.com/bashhack/gojira-mcp)
[](https://goreportcard.com/report/github.com/bashhack/gojira-mcp)
</div>
MCP 服务器,为 AI 助手提供结构化的 Jira 访问权限,借助 [jira-cli](https://github.com/ankitpokhrel/jira-cli) 实现。
主要功能是 `create_issue` - 一个工具调用,可以创建问题 **并** 分配它,链接到一个史诗,转换其状态,并添加到一个冲刺中。不需要再链式调用五个 shell 命令,并使用脆弱的转义。
## 为什么选择 jira-cli?
[jira-cli](https://github.com/ankitpokhrel/jira-cli) 是 Jira 的事实上的命令行工具 - 4k+ 星标,[Atlassian 赞助](https://github.com/ankitpokhrel/jira-cli#supporters),支持云和服务器/数据中心。它已经处理了冲刺,史诗,板块,克隆,链接,工作日志和自定义字段。Atlassian 没有提供 Jira CLI。
gojira-mcp 为 AI 助手提供结构化的 Jira 访问权限。与其重新实现 Jira API,它封装了一个成熟的工具,并在其上添加了复合操作 - 一个单一的 `create_issue` 调用,可以创建,分配,链接到一个史诗,转换状态,并添加到一个冲刺中。
如果您需要 Confluence 或 Compass 以及 Jira,请参阅 Atlassian 的 [Rovo MCP Server](https://github.com/atlassian/atlassian-mcp-server)。
## 先决条件
- [jira-cli](https://github.com/ankitpokhrel/jira-cli) 已安装并配置 (`jira init`)
## 安装
从 [Releases](https://github.com/bashhack/gojira-mcp/releases) 下载预编译的二进制文件:
下载 tarball 和 `checksums.txt`,然后:
```bash
# 验证校验和(推荐)
shasum -a 256 -c checksums.txt
# macOS(Apple Silicon)
tar xzf gojira-mcp_darwin_arm64.tar.gz
sudo mv gojira-mcp /usr/local/bin/
# macOS(Intel)
tar xzf gojira-mcp_darwin_amd64.tar.gz
sudo mv gojira-mcp /usr/local/bin/
# Linux(x86_64)
tar xzf gojira-mcp_linux_amd64.tar.gz
sudo mv gojira-mcp /usr/local/bin/
# Linux(ARM64)
tar xzf gojira-mcp_linux_arm64.tar.gz
sudo mv gojira-mcp /usr/local/bin/
```
或使用 Go 1.25+:
```bash
go install github.com/bashhack/gojira-mcp@latest
```
或从源代码构建:
```bash
git clone https://github.com/bashhack/gojira-mcp.git
cd gojira-mcp
go build -o gojira-mcp .
```
## 注册 Claude Code
如果您下载了预编译的二进制文件:
```bash
claude mcp add --scope user jira -- /usr/local/bin/gojira-mcp
```
如果您使用 `go install` 安装:
```bash
claude mcp add --scope user jira -- "$(go env GOPATH)/bin/gojira-mcp"
```
如果您从源代码构建:
```bash
claude mcp add --scope user jira -- ./gojira-mcp
```
注册后重启 Claude Code 会话。
验证它是否已连接:
```
/mcp
```
`jira` 服务器应显示为健康状态,包含 22 个工具。
## 用法
注册后,您不需要直接调用工具 - Claude Code 会为您调用。只需用自然语言请求您需要的操作:
```text
> 创建一个 bug 票据 "Login redirect broken on Safari",高优先级,分配给 alice@example.com
已创建 PROJ-456: "Login redirect broken on Safari"
状态:待处理 -- OK
冲刺:42(活动)-- OK
https://example.atlassian.net/browse/PROJ-456
```
```text
> PROJ 项目中有哪些正在进行中的票据?
类型 关键 描述 状态 分配人
Bug PROJ-456 登录重定向在 Safari 上损坏 进行中 alice@example.com
故事 PROJ-411 添加深色模式支持 进行中 bob@example.com
```
```text
> 将 PROJ-456 移至完成状态,并添加一个注释,说明修复已在 v2.3.1 中发布
✓ 问题已转换为状态 "完成"
✓ 已向问题 "PROJ-456" 添加注释
```
这些工具适用于任何 Jira 项目 - 无论 `jira-cli` 配置为访问什么,gojira-mcp 都可以访问。
## 工具
### `create_issue`
创建一个 Jira 问题,带有可选的分配,史诗链接,状态转换和冲刺放置 - 所有操作都在一个调用中。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `summary` | 字符串 | 是 | 问题标题 |
| `type` | 字符串 | 是 | 任务,故事,缺陷,史诗,子任务 |
| `description` | 字符串 | 否 | 问题正文(支持多行) |
| `priority` | 字符串 | 否 | 最高,高,中,低,最低 |
| `assignee` | 字符串 | 否 | 电子邮件或用户名 |
| `epic` | 字符串 | 否 | 父史诗键,例如 `PROJ-100` |
| `status` | 字符串 | 否 | 目标状态,例如 `进行中` |
| `sprint` | 字符串 | 否 | 冲刺 ID 或 `active` 自动检测 |
| `project` | 字符串 | 否 | 项目键覆盖 |
| `labels` | 字符串数组 | 否 | 应用的标签 |
| `components` | 字符串数组 | 否 | 设置的组件 |
| `fix_version` | 字符串数组 | 否 | 设置的修复版本 |
| `affects_version` | 字符串数组 | 否 | 设置的影响版本 |
| `original_estimate` | 字符串 | 否 | 时间估计,例如 `2d 1h 30m` |
| `custom` | 对象 | 否 | 自定义字段作为键值对(见下文) |
创建后步骤(状态,冲刺)是尽力而为的 - 失败被报告但不会阻止问题创建。
`custom` 参数将任意字段传递给 jira-cli 的 `--custom` 标志。字段名称必须与您的 jira-cli 配置匹配(见 `jira init`)。常见示例 - 设置故事点数:
```text
> 创建一个故事 "添加缓存层",具有 5 个故事点,分配给 alice@example.com
# 工具接收:{"custom": {"story_points": "5"}}
```
示例输出:
```
已创建 PROJ-456: "实现缓存层"
状态:进行中 -- OK
冲刺:3601(活动)-- OK
https://example.atlassian.net/browse/PROJ-456
```
### `edit_issue`
更新现有问题的字段。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 是 | 例如 `PROJ-123` |
| `summary` | 字符串 | 否 | 新摘要 |
| `body` | 字符串 | 否 | 新描述 |
| `priority` | 字符串 | 否 | 新优先级 |
| `assignee` | 字符串 | 否 | 新分配人 |
| `epic` | 字符串 | 否 | 父史诗键 |
| `labels` | 字符串数组 | 否 | 添加的标签 |
| `components` | 字符串数组 | 否 | 替换的组件 |
| `fix_version` | 字符串数组 | 否 | 添加的修复版本 |
| `affects_version` | 字符串数组 | 否 | 添加的影响版本 |
| `custom` | 对象 | 否 | 自定义字段作为键值对 |
### `clone_issue`
克隆一个 Jira 问题,可选地覆盖副本上的字段。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 是 | 要克隆的问题键 |
| `summary` | 字符串 | 否 | 覆盖摘要 |
| `priority` | 字符串 | 否 | 覆盖优先级 |
| `assignee` | 字符串 | 否 | 覆盖分配人 |
| `labels` | 字符串数组 | 否 | 覆盖标签 |
| `components` | 字符串数组 | 否 | 覆盖组件 |
### `delete_issue`
删除一个 Jira 问题。使用 cascade 也删除子任务。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 是 | 例如 `PROJ-123` |
| `cascade` | 布尔值 | 否 | 也删除子任务(默认为 false) |
### `move_issue`
将问题转换为新状态。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 是 | 例如 `PROJ-123` |
| `status` | 字符串 | 是 | 例如 `进行中`,`完成` |
### `view_issue`
查看问题详情(只读)。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 是 | 例如 `PROJ-123` |
| `comments` | 数字 | 否 | 评论数量(默认为 5) |
### `list_issues`
搜索问题并使用筛选器或原始 JQL(只读)。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `jql` | 字符串 | 否 | 原始 JQL(覆盖其他筛选器) |
| `assignee` | 字符串 | 否 | 按分配人筛选 |
| `type` | 字符串 | 否 | 按问题类型筛选 |
| `priority` | 字符串 | 否 | 按优先级筛选 |
| `parent` | 字符串 | 否 | 按父/史诗键筛选 |
| `project` | 字符串 | 否 | 项目键覆盖 |
| `status` | 字符串数组 | 否 | 按状态筛选 |
| `labels` | 字符串数组 | 否 | 按标签筛选 |
| `limit` | 数字 | 否 | 最大结果数(默认为 20) |
### `add_comment`
向问题添加评论。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 是 | 例如 `PROJ-123` |
| `body` | 字符串 | 是 | 评论文本 |
### `add_to_sprint`
将问题添加到冲刺中。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 是 | 例如 `PROJ-123` |
| `sprint` | 字符串 | 是 | 冲刺 ID 或 `active` 自动检测 |
### `search_users`
按姓名,电子邮件或用户名搜索 Jira 用户。用于在不确切知道显示名称或电子邮件的情况下查找正确的分配人。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `query` | 字符串 | 是 | 部分名称,电子邮件或用户名 |
| `project` | 字符串 | 否 | 限定为可分配用户的项目键 |
此工具直接调用 Jira REST API(而非 jira-cli),并要求设置 `JIRA_API_TOKEN` 环境变量。
示例:
```text
> 搜索名为 "aaron" 的用户,他们可以被分配到 PRO 票据
Aaron Maturen <aaron@example.com> (accountId: 5f3c...)
```
### `unlink_issues`
删除两个 Jira 问题之间的链接。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `inward` | 字符串 | 是 | 内侧问题的键 |
| `outward` | 字符串 | 是 | 外侧问题的键 |
### `watch_issue`
向 Jira 问题添加观察者。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 是 | 例如 `PROJ-123` |
| `watcher` | 字符串 | 是 | 观察者电子邮件或显示名称 |
### `add_worklog`
记录在 Jira 问题上花费的时间。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 是 | 例如 `PROJ-123` |
| `time_spent` | 字符串 | 是 | 例如 `2d 1h 30m` |
| `comment` | 字符串 | 否 | 工作日志注释 |
| `started` | 字符串 | 否 | 何时开始工作 |
| `new_estimate` | 字符串 | 否 | 新的剩余估计 |
### `create_epic`
创建 Jira 史诗。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `name` | 字符串 | 是 | 史诗名称 |
| `summary` | 字符串 | 是 | 史诗摘要 |
| `body` | 字符串 | 否 | 史诗描述 |
| `priority` | 字符串 | 否 | 优先级 |
| `assignee` | 字符串 | 否 | 分配人电子邮件或用户名 |
| `project` | 字符串 | 否 | 项目键覆盖 |
| `labels` | 字符串数组 | 否 | 应用的标签 |
| `components` | 字符串数组 | 否 | 设置的组件 |
| `custom` | 对象 | 否 | 自定义字段 |
### `list_epics`
列出史诗,或列出史诗中的问题。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `key` | 字符串 | 否 | 史诗键,列出问题 |
| `assignee` | 字符串 | 否 | 按分配人筛选 |
| `priority` | 字符串 | 否 | 按优先级筛选 |
| `jql` | 字符串 | 否 | 原始 JQL 查询 |
| `project` | 字符串 | 否 | 项目键覆盖 |
| `status` | 字符串数组 | 否 | 按状态筛选 |
| `labels` | 字符串数组 | 否 | 按标签筛选 |
| `limit` | 数字 | 否 | 最大结果数(默认为 50) |
### `add_issues_to_epic`
将问题添加到史诗中(最多 50 个)。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `epic` | 字符串 | 是 | 史诗键,例如 `PROJ-100` |
| `issues` | 字符串数组 | 是 | 要添加的问题键 |
### `remove_issues_from_epic`
从问题中删除史诗链接(最多 50 个).
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `issues` | 字符串数组 | 是 | 要删除的问题键 |
### `list_sprints`
列出项目板块中的冲刺。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `state` | 字符串 | 否 | 筛选:`future`,`active`,`closed` |
| `project` | 字符串 | 否 | 项目键覆盖 |
### `list_boards`
列出 Jira 板块。
| 参数 | 类型 | 必需 | 描述 |
| --- | --- | --- | --- |
| `project` | 字符串 | 否 | 项目键覆盖 |
### `list_projects`
列出 Jira 项目。无参数。
## 工作原理
gojira-mcp 使用 [MCP 协议](https://modelcontextprotocol.io/)(JSON-RPC 2.0)通过 stdio 进行通信。它通过 `os/exec` 包装 `jira-cli` 命令 - 每个操作都是一个单独的进程,不涉及 shell,从而避免了转义问题。
诊断日志输出到 stderr(符合 MCP 要求)。stdout 保留用于 JSON-RPC 消息。
## 开发
```bash
# 运行测试
go test -v -race ./...
# 构建
go build -o gojira-mcp .
# 烟雾测试 MCP 协议
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1"}}' | ./gojira-mcp 2>/dev/null
```
## 许可证
MIT
连接信息
猜你喜欢
暂无推荐服务器