在 macOS 上把云效安全接入 Codex

摘要

使用云效官方 MCP Server,把代码管理和项目协作能力接入 Codex;令牌保存在 macOS 钥匙串中,不写入 Codex 配置或公开文档。

本文介绍如何把阿里云云效的代码管理和项目协作能力接入 Codex。配置完成后,可以让 Codex 查询仓库、分支、合并请求、项目和工作项。

这里接入的是云效 DevOps 工具,不是替换 Codex 使用的 AI 模型。

方案概览

本文使用云效官方的 alibabacloud-devops-mcp-server

  1. 云效个人访问令牌存入 macOS 钥匙串。
  2. 私有启动脚本从钥匙串读取令牌。
  3. Codex 只保存启动脚本路径,不保存令牌明文。
  4. MCP 只启用 code-managementproject-management,降低权限和上下文占用。

数据流如下:

Codex -> 私有启动脚本 -> macOS 钥匙串
                     -> 云效官方 MCP -> 云效中心站 API

准备工作

需要:

  • macOS
  • Node.js 20 或更高版本
  • npm/npx
  • Codex CLI 或 Codex 桌面版
  • 云效中心站账号

检查环境:

node --version
npx --version
codex --version
command -v npx

记录 command -v npx 返回的绝对路径,后面需要写入启动脚本。

1. 创建云效个人访问令牌

打开云效官方文档中的获取个人访问令牌页面。

按实际用途授予最小权限。本文只需要:

  • 代码管理(Codeup)
  • 项目协作(Projex)

不要把令牌提交到 Git、写入共享文档或粘贴到公开聊天中。如果令牌曾经出现在聊天记录、截图或日志里,应在配置验证完成后立即轮换。

2. 把令牌存入 macOS 钥匙串

运行:

/usr/bin/security add-generic-password \
  -U \
  -a "$USER" \
  -s codex-yunxiao-mcp \
  -l "Codex Yunxiao MCP token" \
  -w

终端会要求输入并再次确认密码数据。在提示符中粘贴云效令牌;输入不会显示在屏幕上。

这里故意没有把令牌写成命令行参数,因为命令行参数可能进入 Shell 历史或进程列表。

验证钥匙串项目存在,但不要打印令牌:

if /usr/bin/security find-generic-password \
  -a "$USER" \
  -s codex-yunxiao-mcp >/dev/null 2>&1; then
  echo "Yunxiao credential is available"
else
  echo "Yunxiao credential is missing"
fi

3. 创建私有 MCP 启动脚本

创建目录:

mkdir -p "$HOME/.local/bin"

创建 $HOME/.local/bin/codex-yunxiao-mcp,内容如下:

#!/bin/sh
set -eu
 
KEYCHAIN_SERVICE="codex-yunxiao-mcp"
KEYCHAIN_ACCOUNT="${USER:?USER is not set}"
NPX_BIN="<ABSOLUTE_PATH_TO_NPX>"
 
if ! TOKEN=$(/usr/bin/security find-generic-password \
  -a "$KEYCHAIN_ACCOUNT" \
  -s "$KEYCHAIN_SERVICE" \
  -w 2>/dev/null); then
  echo "Yunxiao token is missing from macOS Keychain." >&2
  exit 1
fi
 
if [ -z "$TOKEN" ]; then
  echo "Yunxiao token in macOS Keychain is empty." >&2
  exit 1
fi
 
if [ ! -x "$NPX_BIN" ]; then
  echo "npx was not found at $NPX_BIN." >&2
  exit 1
fi
 
PATH="${NPX_BIN%/*}:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export PATH
export YUNXIAO_ACCESS_TOKEN="$TOKEN"
unset TOKEN
 
exec "$NPX_BIN" -y alibabacloud-devops-mcp-server \
  --toolsets=code-management,project-management

<ABSOLUTE_PATH_TO_NPX> 替换为之前 command -v npx 的输出。例如:

NPX_BIN="/opt/homebrew/bin/npx"

限制脚本权限并检查语法:

chmod 700 "$HOME/.local/bin/codex-yunxiao-mcp"
sh -n "$HOME/.local/bin/codex-yunxiao-mcp"
stat -f 'launcher mode: %Lp' "$HOME/.local/bin/codex-yunxiao-mcp"

权限应显示为 700

4. 注册到 Codex

运行:

codex mcp add yunxiao -- "$HOME/.local/bin/codex-yunxiao-mcp"

检查配置:

codex mcp get yunxiao
codex mcp list

预期结果:

  • enabled: true
  • transport: stdio
  • command 指向私有启动脚本
  • env: -,没有令牌或内联环境变量

Codex 会把等价配置写入 ~/.codex/config.toml

[mcp_servers.yunxiao]
command = "/Users/your-name/.local/bin/codex-yunxiao-mcp"

重启 Codex 桌面版或 IDE 扩展,使新 MCP 配置生效。在 Codex 中输入 /mcp 可以查看连接状态。

5. 验证云效鉴权

可以直接调用云效官方托管端点验证令牌。下面的命令从钥匙串读取令牌,不会把令牌放进 Shell 历史:

YX_TOKEN=$(/usr/bin/security find-generic-password \
  -a "$USER" \
  -s codex-yunxiao-mcp \
  -w)
 
curl -sS \
  'https://openapi-rdc.aliyuncs.com/ai/mcp?toolsets=code-management,project-management' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H "Authorization: Bearer $YX_TOKEN" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_current_user","arguments":{}}}'
 
unset YX_TOKEN

成功时返回 JSON-RPC result。返回内容包含账号信息,不要直接贴到公开文档或工单中。

6. 在 Codex 中使用

重启 Codex 后,可以尝试:

使用云效工具列出我有权访问的代码仓库。
查询指定项目中尚未完成的工作项,按负责人分组。
查看指定仓库最近的合并请求,只汇总标题、状态和审查人。

创建分支、评论或工作项等写操作会修改云效数据。执行前应让 Codex 明确列出目标组织、项目、仓库和具体变更。

工具范围

本文只启用了:

  • code-management:仓库、分支、文件、提交和合并请求
  • project-management:项目、迭代、工作项、评论和工时

没有启用流水线、制品仓库、应用交付、测试管理和组织管理。需要增加能力时,修改启动脚本中的 --toolsets

--toolsets=code-management,project-management,pipeline-management

修改后重启 Codex。云效支持的工具集以官方 MCP Server 仓库为准。

常见问题

Codex 显示 MCP 启动失败

直接运行启动脚本查看错误:

"$HOME/.local/bin/codex-yunxiao-mcp"

首次运行时,npx 可能需要下载官方 npm 包。确认网络可访问 npm,并检查 NPX_BIN 是否为有效的绝对路径。

提示钥匙串中没有令牌

重新执行第 2 节的 security add-generic-password 命令。macOS 首次读取钥匙串时可能弹出授权对话框,应确认请求来自本机 /usr/bin/security

返回 401 Invalid token

令牌可能已过期、被吊销或缺少对应 API 权限。重新创建令牌并更新钥匙串。

工具数量太多

不要省略 --toolsets。只启用实际需要的工具集,可以降低 Codex 上下文占用并减少误操作范围。

Region 专属站点

本文针对访问地址为 https://devops.aliyun.com/ 的云效中心站。Region 专属站点通常使用 https://<your-org>.devops.aliyuncs.com,需要在官方 MCP Server 文档中按 Region 站方式配置 YUNXIAO_API_BASE_URL

轮换令牌

先在云效创建新令牌,然后重新运行钥匙串写入命令:

/usr/bin/security add-generic-password \
  -U \
  -a "$USER" \
  -s codex-yunxiao-mcp \
  -l "Codex Yunxiao MCP token" \
  -w

更新后重启 Codex,不需要修改启动脚本或 config.toml。验证新令牌可用后,在云效控制台吊销旧令牌。

卸载

确认不再需要接入后,依次运行:

codex mcp remove yunxiao
rm "$HOME/.local/bin/codex-yunxiao-mcp"
/usr/bin/security delete-generic-password \
  -a "$USER" \
  -s codex-yunxiao-mcp

这些操作会移除 Codex 注册、启动脚本和钥匙串令牌。删除钥匙串项目后无法恢复,只能重新创建云效令牌。

本次验证记录

本文方案于 2026-08-06 在 macOS 上完成实际验证:

  • Node.js:24.x
  • 云效站点:中心站
  • MCP 包:alibabacloud-devops-mcp-server
  • 启用范围:code-management,project-management
  • 云效官方端点鉴权:通过
  • MCP initialize:通过
  • MCP tools/list:返回 66 个工具
  • 代码管理和项目协作代表工具:存在
  • 流水线和应用交付代表工具:不存在
  • Codex MCP 状态:已启用
  • 启动脚本权限:700
  • Codex 配置和公开文件中的令牌明文:未发现

参考资料

相关笔记