Jira到Asana同步工具

一个轻量级的MCP服务器,用于将Jira的功能进度同步到Asana的项目状态更新,适用于企业环境中的开发和PMO团队。

  • by RaInta
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 RaInta/jira-asana-mcp

使用说明

Jira至Asana MCP大桥

您是否使用以下方式管理项目 Jira 但需要让利益相关者了解最新情况 阿萨纳?

如果是这样,那么我完全能感受到你的痛苦!这是一个轻量级的 模型上下文协议(MCP) 同步的服务器(HTTP变体) Jira 功能进度 阿萨纳 项目状态更新。

专为运行的企业环境而设计 VS代码,以及 GitHub,这座桥让开发或PMO团队在Asana中保持项目组合的可见性,同时将Jira作为唯一的信息来源。


特性

  • 从Jira到Asana的只读集成
    • 计算两周进度快照 特性 级别(基于用户故事完成情况和故事点数)。
    • 在单个功能下汇总多个功能 史诗 (这可能取决于您的组织模型如何在Jira中工作项目)。
  • 自动更新Asana项目状态
    • 发布干净、标记格式的摘要,带有颜色编码状态(绿色/黄色/红色)。
    • 可选地记录Asana项目中“进度日志”任务的更新。
  • HTTP MCP兼容
    • 暴露两者 资源 (用于只读查询)和 工具 (用于受控写入)通过REST。
    • 可以直接从VS Code的MCP客户端或LLM代理调用。
  • 安全且可审计
    • Jira和Asana令牌通过环境变量或Azure密钥库传递。
    • 按设计只读;没有给Jira写信。
    • 轻松容器化并部署到Azure容器应用程序或AKS。

架构概述

                ┌──────────────────────────┐
                │  VS Code / MCP Client    │
                └─────────────┬────────────┘
                              │ HTTP (JSON)
                ┌─────────────▼────────────┐
                │    jira-asana-mcp        │
                │  (FastAPI + MCP facade)  │
                └──────┬────────┬──────────┘
                       │        │
           ┌───────────▼───┐ ┌──▼────────────┐
           │ Jira Cloud API│ │ Asana REST API│
           └───────────────┘ └───────────────┘
  • 资源 /resources/jira/feature/{feature_key}/profiles

    /资源/jira/epic/{epic_key}/rollup

  • 工具

    /工具/post_asana_project_status

    /工具/sync_one_feature

jira-asana-mcp/
├─ app/
│  ├─ server.py              # FastAPI + MCP HTTP layer
│  ├─ jira_client.py         # Jira REST wrapper
│  ├─ asana_client.py        # Asana REST wrapper
│  ├─ logic.py               # Story-point math, markdown rendering
│  ├─ mapping.py             # Epic-to-Project map utilities
│  └─ settings.py            # Env configuration
├─ mappings/
│  └─ epic_asana_map.yaml    # Optional static mapping
├─ Dockerfile
├─ requirements.txt
├─ .env.example
└─ README.md

快速入门(本地)

git clone https://github.com/RaInta/jira-asana-mcp.git
cd jira-asana-mcp
cp .env.example .env

编辑 .env 添加您的Jira和Asana代币。确保 .env 在你的 .gitignore!这是在此仓库中默认设置的。

JIRA_BASE=https://yourcompany.atlassian.net
JIRA_EMAIL=svc-jira@yourcompany.com
JIRA_TOKEN=***************
ASANA_TOKEN=1/***************
JIRA_STORY_POINTS_FIELD=customfield_10016
JIRA_PARENT_LINK_FIELD="Parent Link"

在Docker中构建和运行:

docker build -t jira-asana-mcp:local .
docker run --env-file .env -p 8080:8080 jira-asana-mcp:local

服务器监听端口8080。

用法

获取一个功能的进度

curl http://localhost:8080/resources/jira/feature/FEATURE-123/progress

将所有功能汇总到Epic下

curl http://localhost:8080/resources/jira/epic/EPIC-456/rollup

发布为期两周的Asana状态更新

curl -X POST "http://localhost:8080/tools/post_asana_project_status" \
  -H "Content-Type: application/json" \
  -d '{
        "epic_key": "EPIC-123",
        "asana_project_gid": "12001234567890"
      }'

该工具将:

  • 收集EPIC-123下的所有功能。
  • 统计过去14天内完成的故事点数。
  • 计算完成百分比并渲染降价。
  • 在Asana发布新的项目状态。

VS代码MCP集成

  1. 安装 MCP客户端扩展 在VS代码中。

将此块添加到.vcode/settings.json中:

{
  "mcpServers": {
    "jira-asana-bridge": {
      "type": "http",
      "baseUrl": "http://localhost:8080",
      "tools": {
        "post_asana_project_status": { "path": "/tools/post_asana_project_status", "method": "POST" },
        "sync_one_feature": { "path": "/tools/sync_one_feature", "method": "POST" }
      },
      "resources": {
        "jira-feature-progress": { "path": "/resources/jira/feature/{feature_key}/progress" },
        "jira-epic-rollup": { "path": "/resources/jira/epic/{epic_key}/rollup" }
      }
    }
  }
}

然后,您可以直接通过MCP接口查询或触发工具。

部署(Azure容器应用程序)

az acr create -g my-rg -n myacr --sku Basic
docker tag jira-asana-mcp:local myacr.azurecr.io/jira-asana-mcp:v1
docker push myacr.azurecr.io/jira-asana-mcp:v1

az containerapp create \
  -g my-rg -n jira-asana-mcp \
  --environment my-env \
  --image myacr.azurecr.io/jira-asana-mcp:v1 \
  --target-port 8080 --ingress internal \
  --env-vars-file .env
  • 将入口设置为 内部的 为了安全。
  • 使用Azure密钥库进行注入 JIRA_TOKEN 和 ASANA_TOKEN.

配置选项

变量 描述
JIRA_BASE Jira云基础URL
JIRA_EMAIL Jira服务帐户电子邮件
JIRA_TOKEN Jira API代币
ASANA_TOKEN Asana个人访问令牌
JIRA_STORY_POINTS_FIELD 故事点的自定义字段ID
JIRA_PARENT_LINK_FIELD 父字段名称(通常 "Parent Link")
EPIC_ASANA_MAP_PATH Epic的YAML映射文件→ Asana项目
ASANA_PROGRESS_LOG_TASK_NAME 用于记录更新的可选任务名称

安全与治理

  • 只读Jira访问--无写操作。
  • Asana PAT仅限于发布项目状态更新。
  • 可审计性——记录所有工具调用;与你的标准可观测性堆栈配对。
  • 部署选项——在本地、Azure容器应用程序中或内部入口后面的AKS上运行。

状态逻辑

  1. 收集每个功能下的故事。
  2. 计算总计:
    • 故事总得分。
    • 在两周内完成的故事点。
  3. 聚合Epic下的所有功能。
  4. 渲染标记表并发布Asana项目状态:
    • 🟢 绿色≥60%
    • 🟡 黄色20-59%
    • 🔴 红色<20%

自动化

您可以自动运行此操作,例如每两个星期五通过GitHub Actions运行一次:

name: Post Asana Status
on:
  schedule:
    - cron: '0 22 * * 5'   # 22:00 UTC ≈ 16:00 CT
jobs:
  post:
    runs-on: ubuntu-latest
    steps:
      - name: Post fortnightly Asana status
        run: |
          curl -X POST "$MCP_BASE/tools/post_asana_project_status" \
            -H "Content-Type: application/json" \
            -d "{\"epic_key\":\"EPIC-123\",\"asana_project_gid\":\"12001234567890\"}"
        env:
          MCP_BASE: https://internal-gateway/jira-asana-mcp

未来的增强功能

  • 支持其他Jira工作项类型(例如倡议)。
  • 更精细的进展
  • Sprint感知窗口检测(使用最新关闭的Jira Sprint日期)。
  • Idempotent更新(更新现有的Asana状态条目,而不是创建重复项)。
  • 动态Asana项目查找 jira_epic_key 自定义字段。
  • 与内部Alana代理集成,用于对话式报告。但目前看来,这似乎很糟糕,所以也许不是。

许可证

Apache 2.0许可证。请参阅repo中的LICENSE文件。


附录:获取开发人员API密钥(企业SSO)

这主要是因为我总是忘记自己该怎么做!

Jira Cloud API代币(Atlassian)

  1. 首选 https://id.atlassian.com/manage-profile/security/api-tokens
    (如果强制执行SSO,您可能需要在专用窗口中打开此窗口。)
  2. 点击 创建API令牌给它起个名字 jira-asana-mcp.
  3. 复制令牌。
  4. 在 .env,设置:
JIRA_EMAIL=<your Atlassian user email>
JIRA_TOKEN=<copied token>
  1. 确认您的服务帐户对正在查询的Jira项目和Epics具有读取权限。

如果您的组织通过SSO(Okta/AzureAD)限制个人令牌,请您的Jira管理员使用API令牌和有限的“只读”权限创建服务帐户。

Asana个人访问令牌(PAT)

  1. 导航至 https://app.asana.com/0/developer-console (您可能需要成为Asana管理员或工作区所有者。)
  2. 在“个人访问令牌”下,单击 Create new token.
  3. 给它一个描述性的名字,例如。 jira-asana-mcp.
  4. 复制生成的令牌并添加到 .env:
  ASANA_TOKEN=1/<your token here>
  1. 确保PAT有足够的范围来发布项目状态更新(至少 Edit Project Status 许可)。

对于企业SSO管理的帐户,Asana可能需要通过管理员控制的服务帐户创建令牌。如果禁用令牌创建,请通过Asana管理面板请求一个。

推荐做法

  • 将令牌存储在Azure密钥库中,并在运行时注入(而不是提交 .env 文件)。
  • 每90天(或更短时间,如果你足够多疑的话)旋转Jira和Asana代币。
  • 将所有服务帐户记录在您的内部访问注册表中。