JIRA MCP服务器

一个连接AI助手与Atlassian JIRA的模型上下文协议服务器,支持通过自然语言读写JIRA票据。

  • by bala2404jbs
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 bala2404jbs/jira-mcp

使用说明

JIRA MCP服务器

A. 模型上下文协议(MCP) 连接AI助手的服务器(例如 克劳德 或 光标)直接到Atlassian JIRA云 或 JIRA服务器/数据中心,使其能够通过自然语言读写门票。


特性

读取操作

工具 说明
get_issue 按关键字获取单个问题(例如。 PROJ-123)
search_issues 运行JQL查询并返回匹配问题
get_project 按键获取项目元数据
list_projects 列出所有可访问的项目
get_issue_comments 列出对某个问题的所有评论
get_transitions 列出问题的可用工作流转换
find_users 按姓名或电子邮件搜索JIRA用户
get_issue_fields 列出所有可用的JIRA字段(包括自定义字段)
list_attachments 列出问题上的所有附件(名称、大小、类型、ID)
get_attachment_content 通过经过身份验证的代理下载并返回附件内容

写入操作

工具 说明
create_issue 创建新问题(摘要、类型、优先级、描述、标签)
update_issue 更新现有问题上的所有可写字段
set_issue_dates 使用精确的JIRA UI字段名称设置日期字段
add_comment 为问题添加评论
transition_issue 在工作流程中移动问题(例如。→ 进行中→ 完成)
assign_issue 分配或取消分配问题
delete_issue 永久删除问题
upload_attachment 将文件上传到JIRA问题(本地路径或base64)

先决条件

  • Node.js >=18(在17上工作,有警告)
  • A. JIRA云 或 JIRA服务器/DC 例子
  • A有效 API令牌 (云)或 个人访问令牌 (服务器/DC)

设置

1.克隆和安装

git clone <repo-url> jira-mcp
cd jira-mcp
npm install

2.配置环境

cp .env.example .env

编辑 .env (仅服务器端默认凭据或stdio模式需要):

# JIRA Cloud
JIRA_BASE_URL=https://yourcompany.atlassian.net
JIRA_USER_EMAIL=your@email.com
JIRA_API_TOKEN=your_api_token_here

# JIRA Server/DC (PAT — leave JIRA_USER_EMAIL blank)
# JIRA_BASE_URL=https://jira.yourcompany.com
# JIRA_API_TOKEN=your_personal_access_token

# Transport mode: "sse" for HTTP server, leave blank for stdio (default)
MCP_TRANSPORT=

# SSE server settings (only needed in SSE mode)
PORT=3000
HOST=0.0.0.0

获取JIRA Cloud API令牌: https://id.atlassian.com/manage-profile/security/api-tokens

3.建造

npm run build

4.跑步

# stdio mode (default — for Claude Desktop / CLI tools)
npm start

# SSE / HTTP mode (for Cursor, remote clients, ngrok, hosted deployments)
npm run start:sse

# During development (runs TypeScript directly, no build needed)
npm run dev        # stdio
npm run dev:sse    # SSE

运输方式

服务器支持 两种运输方式:

模式 标志/环境 最适合
标准 (默认) (无) Claude Desktop、MCP检查器、CLI
SSE/HTTP --sse 或 MCP_TRANSPORT=sse Cursor、远程web客户端、ngrok、托管部署

选择模式

# Via CLI flag
node dist/index.js --sse

# Via environment variable
MCP_TRANSPORT=sse node dist/index.js

# Custom port / host
PORT=8080 HOST=127.0.0.1 MCP_TRANSPORT=sse node dist/index.js

SSE HTTP端点

在SSE模式下启动后,以下端点可用:

端点 方法 目的
/sse GET 客户端在此处连接以打开事件流
/messages?sessionId=<id> POST 客户端在此处发送JSON-RPC消息
/health GET 健康检查-退货 {"status":"ok","transport":"sse"}

基于凭据的访问(SSE模式)

在SSE模式下,每个连接的客户端都可以提供 他们自己的JIRA证书 直接在SSE URL中作为查询参数。这意味着:

  • 服务器会 不 需要存储每个人的凭据
  • 每个用户都使用自己的JIRA帐户进行连接
  • 可以同时使用多个不同的JIRA实例
  • 如果没有提供查询参数,服务器将回退到 .env 凭证

查询参数

参数 必填 说明
jiraUrl ✅ 是 JIRA实例的基本URL
jiraToken ✅ 是 API令牌(JIRA云)或个人访问令牌(服务器/DC)
jiraEmail ☑️ 仅限云 您的Atlassian帐户电子邮件(省略服务器/DC PAT身份验证)

URL格式

JIRA云(电子邮件+API令牌):

http://localhost:3000/sse?jiraUrl=https://yourcompany.atlassian.net&jiraEmail=you@company.com&jiraToken=YOUR_API_TOKEN

JIRA服务器/数据中心(PAT——无需电子邮件):

http://localhost:3000/sse?jiraUrl=https://jira.yourcompany.com&jiraToken=YOUR_PAT

通过ngrok公共网址:

https://your-ngrok-domain.ngrok-free.app/sse?jiraUrl=https://yourcompany.atlassian.net&jiraEmail=you@company.com&jiraToken=YOUR_API_TOKEN

安全: 总是使用 超文本传输安全协议 (ngrok会自动提供此功能),因此凭证在传输过程中会被加密。切勿以纯文本形式共享包含令牌的URL。


连接到克劳德桌面(stdio模式)

将此添加到您的 claude_desktop_config.json
(通常在 ~/.config/claude/claude_desktop_config.json 在Linux/Mac上):

{
  "mcpServers": {
    "jira": {
      "command": "node",
      "args": ["/absolute/path/to/jira-mcp/dist/index.js"],
      "env": {
        "JIRA_BASE_URL": "https://yourcompany.atlassian.net",
        "JIRA_USER_EMAIL": "your@email.com",
        "JIRA_API_TOKEN": "your_api_token_here"
      }
    }
  }
}

重新启动Claude Desktop——JIRA工具将自动出现。


通过SSE URL(游标)连接

步骤1--启动SSE服务器

npm run start:sse
# Server logs:
#   JIRA MCP server running in SSE mode
#   SSE endpoint : http://localhost:3000/sse

步骤2——添加到光标

打开的游标→ 设置 → 主控程序 → Edit mcp.json,然后添加:

选项A——URL中的凭据(建议个人使用):

{
  "mcpServers": {
    "jira": {
      "url": "http://localhost:3000/sse?jiraUrl=https://yourcompany.atlassian.net&jiraEmail=you@company.com&jiraToken=YOUR_API_TOKEN"
    }
  }
}

选项B--服务器中的凭据 .env (单一共享帐户):

{
  "mcpServers": {
    "jira": {
      "url": "http://localhost:3000/sse"
    }
  }
}

第3步——使用ngrok公开曝光(可选)

ngrok http 3000

然后在Cursor中使用您的ngrok URL:

{
  "mcpServers": {
    "jira": {
      "url": "https://your-ngrok-domain.ngrok-free.app/sse?jiraUrl=https://yourcompany.atlassian.net&jiraEmail=you@company.com&jiraToken=YOUR_API_TOKEN"
    }
  }
}

检查工具(不含克劳德)

npx @modelcontextprotocol/inspector dist/index.js

打开终端中打印的链接,以交互方式浏览和测试所有工具。


示例提示

连接后,您可以说:

  • “搜索PROJ项目中所有打开的错误”
  • “在PROJ中创建一个名为“修复登录超时”的高优先级新任务”
  • “在PROJ-42上添加一条评论,称修复程序将于今晚部署”
  • “将PROJ-42移至完成”
  • “将PROJ-42分配给帐户ID 5b1a2844c20165700ede21g”
  • “显示CORE项目中最近更新的10个问题”
  • “查找电子邮件中包含john@的用户”
  • “列出我的JIRA中可用的所有自定义字段ID”

项目结构

jira-mcp/
├── src/
│   ├── index.ts              # Entry point — stdio + SSE transport, per-session credentials
│   ├── jira/
│   │   ├── client.ts         # JIRA REST client factory (per-session + .env fallback)
│   │   └── types.ts          # TypeScript interfaces for JIRA API responses
│   └── tools/
│       ├── read.ts           # Read-only MCP tools (8 tools)
│       └── write.ts          # Write/mutate MCP tools (7 tools)
├── .env.example              # Environment variable reference
├── package.json
└── tsconfig.json

身份验证参考

场景 认证方法 所需参数
JIRA云(URL参数) HTTP基本身份验证 jiraUrl + jiraEmail + jiraToken
JIRA服务器/DC(URL参数) 承载PAT jiraUrl + jiraToken
JIRA云(.env/stdio) HTTP基本身份验证 JIRA_BASE_URL + JIRA_USER_EMAIL + JIRA_API_TOKEN
JIRA服务器/DC(.env/stdio) 承载PAT JIRA_BASE_URL + JIRA_API_TOKEN (无电子邮件)

优先: URL参数始终优先于 .env 变量。如果两者都没有设置,服务器将返回 401 错误,并显示一条有用的消息。


使用附件

MCP服务器充当 经过身份验证的代理 加入JIRA的附件API,解决了人工智能助手无法直接访问JIRA媒体服务器的问题。

列出问题的附件

list_attachments(issue_key: "PROJ-123")

退货: id, filename, mimeType, size_human, author, created.

下载附件内容

get_attachment_content(issue_key: "PROJ-123", attachment_id: "12345")
  • 文本文件 (.txt, .csv, .json, .xml, .log, .md, .yaml, .html) → 返回为 纯文本
  • 二进制文件 (图像、PDF、Office文档等)→ 返回为 base64 字符串

将文件上传到问题

# From a local file path:
upload_attachment(issue_key: "PROJ-123", file_path: "/tmp/report.pdf")

# From base64 content:
upload_attachment(issue_key: "PROJ-123", filename: "data.csv", base64_content: "...")

示例提示

  • “列出PROJ-123上的所有附件”
  • “显示PROJ-123所附日志文件的内容”
  • “将/tmp/secreenshot.png上传到PROJ-456”