Skip to main content
Glama
yunxiao-projex-mcp

yunxiao-projex-mcp

by MrLinWang

云效 Projex 项目管理 MCP

PyPI License: MIT

An MCP server for Alibaba Cloud Yunxiao (阿里云云效) Projex project management. It exposes work items, sprints, comments, members, current-user identity, project metadata and authenticated file downloads as MCP tools over stdio.

基于阿里云云效 Projex OpenAPI 的 MCP 服务。使用 YUNXIAO_USER_* Bot Key,所有工具固定作用于 YUNXIAO_API_PROJECT_ID 指定的项目,无法访问其他项目。

安装

从 PyPI 运行,无需本地克隆:

uvx yunxiao-projex-mcp

或安装到本地环境:

uv tool install yunxiao-projex-mcp

本地开发:

uv sync --all-extras

Related MCP server: nod-mcp

配置

支持以下环境变量:

变量

必填

说明

YUNXIAO_USER_ACCESS_KEY_ID

是

云效 Bot AccessKey ID

YUNXIAO_USER_ACCESS_KEY_SECRET

是

云效 Bot AccessKey Secret

YUNXIAO_USER_NAME

否

当前 AccessKey 用户的云效显示名(如 yunxiao-bot);设置后严格校验,省略时自动识别

YUNXIAO_API_ORG_ID

是

云效组织 ID

YUNXIAO_API_PROJECT_ID

是

云效 Projex 项目 ID

YUNXIAO_API_ENDPOINT

否

默认 devops.cn-hangzhou.aliyuncs.com

标准 mcpServers 配置(Magpie / Claude Desktop / Cursor 等通用):

{
  "mcpServers": {
    "aliyun-yunxiao-projex": {
      "command": "uvx",
      "args": ["yunxiao-projex-mcp"],
      "env": {
        "YUNXIAO_USER_ACCESS_KEY_ID": "your-access-key-id",
        "YUNXIAO_USER_ACCESS_KEY_SECRET": "your-access-key-secret",
        "YUNXIAO_USER_NAME": "yunxiao-bot",
        "YUNXIAO_API_ORG_ID": "your-organization-id",
        "YUNXIAO_API_PROJECT_ID": "your-project-id",
        "YUNXIAO_API_ENDPOINT": "devops.cn-hangzhou.aliyuncs.com"
      }
    }
  }
}

YUNXIAO_API_ENDPOINT 可省略,省略时使用默认值;YUNXIAO_USER_NAME 也可省略,MCP 会通过当前 AccessKey 自动识别。 如果设置 YUNXIAO_USER_NAME,值必须与当前 AccessKey 用户在云效的显示名完全一致(不是 AccessKey ID,也不是 aliyun_ram:... 完整 username)。 多个 Agent 要区分身份时,必须各自使用独立的 AccessKey;共享同一个 AccessKey 会被视为同一个用户。

本地 .env

从源码运行时,可在项目根目录放置 .env:

YUNXIAO_API_ORG_ID=...
YUNXIAO_API_PROJECT_ID=...
YUNXIAO_API_ENDPOINT=devops.cn-hangzhou.aliyuncs.com
YUNXIAO_USER_ACCESS_KEY_ID=...
YUNXIAO_USER_ACCESS_KEY_SECRET=...
YUNXIAO_USER_NAME=yunxiao-bot

建议执行 chmod 600 .env,并确保 .env 不被提交到版本库。

接入 Codex

codex mcp add aliyun-yunxiao-projex \
  --env YUNXIAO_API_ORG_ID=... \
  --env YUNXIAO_API_PROJECT_ID=... \
  --env YUNXIAO_USER_ACCESS_KEY_ID=... \
  --env YUNXIAO_USER_ACCESS_KEY_SECRET=... \
  --env YUNXIAO_USER_NAME=yunxiao-bot \
  -- uvx yunxiao-projex-mcp
codex mcp list

等价的 ~/.codex/config.toml 配置:

[mcp_servers.aliyun-yunxiao-projex]
command = "uvx"
args = ["yunxiao-projex-mcp"]

[mcp_servers.aliyun-yunxiao-projex.env]
YUNXIAO_API_ORG_ID = "..."
YUNXIAO_API_PROJECT_ID = "..."
YUNXIAO_USER_ACCESS_KEY_ID = "..."
YUNXIAO_USER_ACCESS_KEY_SECRET = "..."
YUNXIAO_USER_NAME = "yunxiao-bot"

接入 Magpie

该服务已发布到官方 MCP Registry,名称为 io.github.MrLinWang/aliyun-yunxiao-projex-mcp。在 Magpie 的 Discover 中搜索 yunxiao、projex、aliyun 或 mcp 即可找到,安装时按提示填写环境变量。

也可以直接编辑 Magpie 的 MCP 配置,使用上面的 mcpServers JSON 片段。

配套 Skill

仓库中的 skills/yunxiao-projex/ 是配合本 MCP 使用的 Agent Skill,包含查询、写入、工作项生命周期状态同步、自身负责人识别和附件下载约定。 在仓库根目录执行以下命令,链接到 Codex 技能目录,后续 git pull 会自动同步。 如果目标位置已有实体目录,先移走,避免在其中生成嵌套链接:

mkdir -p "${CODEX_HOME:-$HOME/.codex}/skills"
ln -sfn "$PWD/skills/yunxiao-projex" "${CODEX_HOME:-$HOME/.codex}/skills/yunxiao-projex"

该 Skill 依赖已配置的 aliyun-yunxiao-projex MCP(若注册为其他名称,工具前缀会随之变化), 不会另行保存或读取云效凭据。 新增或修改 MCP 工具、参数或权限边界时,应同步更新该 Skill,并运行:

python3 "${CODEX_HOME:-$HOME/.codex}/skills/.system/skill-creator/scripts/quick_validate.py" \
  skills/yunxiao-projex

工具

只读:get_project、get_current_user、list_project_members、list_workitem_types、list_workitem_fields、list_workitem_statuses、list_workitems、get_workitem、get_workitem_file、list_workitem_comments、list_sprints、get_sprint。

写入:create_workitem、update_workitem、create_workitem_comment、update_workitem_comment、create_sprint。

删除:delete_workitem、delete_workitem_comment,均要求 confirm=true。

使用约定

  • assigned_to、owner_ids、participants、trackers、verifier 使用项目成员的账号 ID,可通过 list_project_members 获取。

  • 判断工作项负责人是否为自己时,调用 get_current_user 获取当前用户的 identifier,或直接使用 list_workitems 的 assigned_to_me=true;list_workitems/get_workitem 返回的 isMine 为 true/false。isMine 为 null 表示未配置 YUNXIAO_USER_NAME 且自动识别失败,可调用 get_current_user 查看原因。

  • YUNXIAO_USER_NAME 只用于识别当前用户,不能直接传给 assigned_to;assigned_to 仍使用成员 identifier。

  • 提交 PR 后,Skill 会把实际 PR 链接写回对应云效工作项的评论,不能只写在最终答复里;已有评论仅在有误时更正,否则新建评论。

  • 更新云效进展时默认新建评论,不修改此前已提交的评论;只有旧评论内容有误时才编辑原评论。

  • 创建工作项前先查 list_workitem_types、list_workitem_fields 和 list_workitem_statuses;必填自定义字段(例如 priority)通过 custom_fields 传入选项 ID。

  • 实现或修复已绑定的工作项时,Skill 会先读取当前状态流并按阶段推进:开工进入进行中,交付进入验证态,验收后再关闭;只读查询不改状态。

  • list_project_members 内部固定使用 targetType=Space。

  • 描述和评论默认使用 Markdown;日期使用 YYYY-MM-DD。

  • get_workitem_file 使用 Bot Key 认证获取下载地址并下载内容。传入工作项 identifier(workitem_id)及描述等富文本图片 URL 中的 fileIdentifier(file_id);PNG、JPEG、GIF、WebP 以图片内容返回,其他文件以 Base64 嵌入资源返回,最大 10 MiB。

  • 客户端只读取 structuredContent、不渲染 MCP 图片块时,给 get_workitem_file 传 save_to(目录或完整文件名)将附件保存到本地;返回 JSON 中的 path 可直接用于 view_image 等本地查看工具。

  • 删除评论和删除工作项会先校验资源属于当前项目,再执行删除;工作项删除为异步生效,列表索引可能需要数秒刷新。

  • create_workitem_comment 默认创建顶级评论,回复评论时才需要传 parent_id。

权限限制

  • 当前 Bot 角色为“开发机器人”,修改项目字段、管理项目成员会返回 403。

  • 不包含工时/预估、附件上传、工作项关联、工作项动态、项目创建/删除、迭代修改/删除。

  • 代码库与流水线不在本服务范围内。

测试

.venv/bin/python -m pytest -m "not live"
YUNXIAO_LIVE_TESTS=1 .venv/bin/python -m pytest -m "live and not live_write"
YUNXIAO_LIVE_TESTS=1 YUNXIAO_LIVE_WRITE_TESTS=1 .venv/bin/python -m pytest -m live_write

写入测试会创建 __mcp_probe__ 临时工作项并在结束时删除;create_sprint 不做线上写入测试,因为云效未提供删除迭代接口。

许可证

MIT

Available Tools

19 tools
create_sprintA

在当前项目创建迭代。日期格式为 YYYY-MM-DD;owner_ids 使用成员账号 ID。云效没有删除迭代的接口。

Inputs: name (required), owner_ids (required), end_date, start_date. Returns: object

create_workitemA

在当前项目创建工作项。assigned_to 使用成员账号 ID;custom_fields 用于必填自定义字段,例如 priority。

Inputs: subject (required), category (required), assigned_to (required), workitem_type_id (required), +8 more. Returns: object

create_workitem_commentB

给当前项目内的工作项添加评论,默认 Markdown 格式。

Inputs: content (required), workitem_id (required), parent_id, format_type. Returns: object

delete_workitemB
Destructive

删除当前项目内的工作项。必须显式传 confirm=true。

Inputs: confirm (required), workitem_id (required). Returns: object

delete_workitem_commentB
Destructive

删除当前项目内工作项的一条评论。必须显式传 confirm=true。

Inputs: confirm (required), comment_id (required), workitem_id (required). Returns: object

get_current_userA
Read-only

获取当前 AccessKey 对应的云效用户及其在当前项目中的成员 ID。identifier 可用于与 assignedTo 比较;YUNXIAO_USER_NAME 设置后会严格校验。

Inputs: no named parameters. Returns: object

get_projectB
Read-only

获取当前配置项目的基本信息。

Inputs: no named parameters. Returns: object

get_sprintA
Read-only

获取当前项目内单个迭代的信息。

Inputs: sprint_id (required). Returns: object

get_workitemB
Read-only

获取当前项目内单个工作项的完整信息;isMine 表示负责人是否为当前 AccessKey 用户。

Inputs: workitem_id (required). Returns: object

get_workitem_fileA
Read-only

认证下载当前项目工作项中的文件或图片。图片直接返回图像内容;其他文件返回 Base64。可传 save_to 将文件保存到本地(目录或完整路径),返回的 path 可用 view_image 等工具查看。仅支持描述等富文本中的 fileIdentifier,最大 10 MiB。

Inputs: file_id (required), workitem_id (required), save_to.

list_project_membersA
Read-only

列出当前项目成员及其角色,返回可用于 assigned_to 的账号 ID。

Inputs: no named parameters. Returns: object

list_sprintsC
Read-only

分页列出当前项目的迭代。

Inputs: next_token, max_results. Returns: object

list_workitem_commentsB
Read-only

列出当前项目内某个工作项的评论。

Inputs: workitem_id (required). Returns: object

list_workitem_fieldsB
Read-only

列出指定工作项类型的字段定义、是否必填及选项。

Inputs: workitem_type_id (required). Returns: object

list_workitemsA
Read-only

分页查询当前项目的工作项。可按标题、状态、负责人、迭代筛选;多个状态值按同一条件的可选值处理。assigned_to_me=true 只返回当前 AccessKey 用户负责的工作项;结果含 isMine。

Inputs: category (required), sprint_id, next_token, status_ids, +4 more. Returns: object

list_workitem_statusesB
Read-only

列出指定工作项大类或类型的可用状态流。

Inputs: category (required), workitem_type_id. Returns: object

list_workitem_typesA
Read-only

列出当前项目指定大类(Req/Bug/Task)下的工作项类型。

Inputs: category (required). Returns: object

update_workitemB
DestructiveIdempotent

更新当前项目内的工作项。fields 是字段 identifier 到新值的映射,不能包含 description;description 单独使用 description 参数更新。

Inputs: workitem_id (required), fields, description, description_format. Returns: object

update_workitem_commentC
DestructiveIdempotent

修改当前项目内工作项的一条评论。

Inputs: content (required), comment_id (required), workitem_id (required), format_type. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 19 tools

    Disambiguation4/5

    Most tools target distinct resources and actions: project metadata, workitems, comments, and sprints each have clearly separated operations. The three metadata lookups (list_workitem_types/fields/statuses) and the member-related pair (get_current_user vs list_project_members) could be momentarily confused, but the descriptions distinguish them well enough.

    Naming Consistency5/5

    Every tool follows a strict snake_case verb_noun convention (get_, list_, create_, update_, delete_) applied consistently across projects, workitems, comments, and sprints. Sub-resources are composed predictably, e.g. list_workitem_comments, create_workitem_comment, create_sprint.

    Tool Count4/5

    Nineteen tools is at the upper edge of comfortable, but the domain (workitems, comments, sprints, plus schema/introspection helpers) justifies nearly all of them. Each tool maps to a real operation rather than being redundant, though a couple of the metadata listers could arguably be consolidated.

    Completeness4/5

    Workitems and comments have full CRUD coverage, and the metadata/introspection tools (types, fields, statuses, members) support correct create/update calls. The main gap is sprints, which only offer list/get/create with no update or delete (the latter explicitly unavailable via the API), so sprint lifecycle management is partially a dead end.

    Related MCP Connectors

    Related MCP Servers