几个编码 Agent 同时对着一个仓库干活,最常见的乱象是:两个 Agent 认领了同一个 issue、改完没人复核、AI 生成任务时把 token 花超了也没人拦。mcp-github-project-manager 是一个 MIT 许可的 MCP server,把 GitHub Projects v2 直接变成 Agent 的任务底座——无需数据库、无需 Redis,Agent 注册表放在专用分支的 registry.json,任务认领写在项目自定义字段,交付物是结构化 issue 评论。本教程按官方 README 六步落地:装服务、接客户端、注册认领、心跳交付、设预算硬闸、审计加固。
先弄清:它管的是队列,不是替你写代码
这个服务把「谁在做什么、做到哪、花了多少」存在 GitHub 原生位置,Agent 只通过 MCP 工具读写它。官方表格给出的对应关系如下,理解这张表才能看懂后面每一步的副作用:
| 状态 | 存放位置 | 含义 |
|---|---|---|
| Agent 注册表 | agent-registry 分支上的 registry.json | 用 Contents API 做 sha 比较再写入,避免并发覆盖 |
| 任务认领 | Projects v2 自定义字段 | agent_claimed_by、agent_status、agent_pr_number 等 |
| 交付物 | 结构化 issue 评论 | 分支、PR、文件、测试结果一并留痕 |
| 预算与心跳 | 注册表里的 Agent 记录 | 服务端自行扣减,Agent 绕不过去 |
版本口径先说清:官方 README 的工具面为 21 个复合工具、175 个动作,第三方雷达在 2026-11-05 记录的 5.0.1 版本是 20 个工具、169 个动作,npm 上随后又有新版本发布。这些数字随版本变化,写自动化脚本时请以 npm view mcp-github-project-manager version 与仓库 docs/TOOLS.md 为准,不要把工具数量写死在断言里。
Step 1:装 CLI 并确认运行环境
官方要求 Node.js 22.12.0 以上,推荐 Node 24。四条安装路线任选其一,装完直接运行即可启动 stdio 传输的 MCP server:
# 确认运行时版本
node --version
# 路线 A:全局安装(官方 Quickstart)
npm install -g mcp-github-project-manager
# 路线 B:npx 即用(客户端配置里最常用)
npx -y mcp-github-project-manager
# 路线 C:pnpm dlx
pnpm dlx mcp-github-project-manager
# 路线 D:容器
docker compose up --build
# 全局安装后直接启动 stdio server
mcp-github-project-manager
npx -y 写法,由客户端自己解析包;全局安装适合先在终端里手动验一遍。本地构建的方式是把 MCP 客户端指向 node build/index.js。Node 版本是硬门槛:低于 22.12.0 时依赖可能安装成功但运行时报语法或 API 错误。用 node --version 确认后再接客户端;容器路线还要注意官方提示——把宿主目录挂到 /data 时,该目录需归容器用户 uid 10001 所有。
Step 2:配置凭据并接入 MCP 客户端
官方明确 GITHUB_TOKEN 不是必需的:凭据链按「GitHub App 安装 → --token 参数 → SECRETS_DIR 下的文件 → GITHUB_TOKEN 环境变量 → auth login 存的 OAuth 令牌 → gh auth token」依次命中,且每次工具调用都会重新解析。已经 gh auth login 过就什么都不用配。
# 方式一:环境变量(Quickstart 写法)
export GITHUB_TOKEN="ghp_..."
export GITHUB_OWNER="your-org-or-user"
export GITHUB_REPO="your-repo"
# 方式二:复用 gh CLI 登录态,无需自建 PAT
mcp-github-project-manager auth login --gh
gh auth refresh -h github.com -s project
# 方式三:OAuth 设备流
GITHUB_OAUTH_CLIENT_ID=... mcp-github-project-manager auth login
# Claude Code CLI 一行接入
claude mcp add github-project-manager -- npx -y mcp-github-project-manager
其余 MCP 客户端用标准 stdio 配置,官方给出的示例结构如下,把三个环境变量换成你自己的值:
{
"mcpServers": {
"github-project-manager": {
"command": "npx",
"args": ["-y", "mcp-github-project-manager"],
"env": {
"GITHUB_TOKEN": "ghp_...",
"GITHUB_OWNER": "your-org-or-user",
"GITHUB_REPO": "your-repo"
}
}
}
}
GITHUB_OWNER 与 GITHUB_REPO 是必填项,GITHUB_TOKEN 是可选的。用 MCP_TOOL_GROUPS=core 可以只暴露项目管理工具,core,ai 再加上 AI 工具,默认 all;组过滤时 discover_tools 依然可调用。凭据与权限风险:使用 PAT 时需要 repo、project、write:org 三个 scope,权限范围很大,勿提交含令牌的配置文件。复用 gh CLI 登录态虽方便,但官方说明 gh 令牌每 60 秒重读一次,多人共用机器时可能串到别的账号,用 GH_CLI_USER 钉住账号、或用 GH_CLI_TOKEN_FALLBACK=false 关掉回退更稳。headless 与 CI 场景官方建议改用 GitHub App 或 PAT,不要依赖交互式登录。
Step 3:注册 Agent 并原子认领任务
每个工具都用 action 字段路由到具体动作,所以客户端只看到 21 个工具 schema 而不是 175 个。官方给出的 Agent 循环从注册开始,认领策略有 highest_priority、oldest_first、skills_match、milestone_deadline、ai 五种:
{
"tool": "agent_work",
"arguments": {
"action": "register",
"name": "claude-eng-1",
"role": "engineer",
"runtime": "claude-code",
"capabilities": ["typescript", "testing"]
}
}
{
"tool": "agent_work",
"arguments": {
"action": "checkout_task",
"agentId": "agent-abc123",
"strategy": "highest_priority"
}
}
{
"tool": "agent_work",
"arguments": {
"action": "get_task_context",
"issueNumber": 42
}
}
runtime 与 capabilities 写清楚,后续用 skills_match 策略才派得准。上例的 agent-abc123 是注册回显里返回的 ID,实际调用时按回显原样带回,别自己编。先拿测试仓库练手:认领会写 Projects v2 的自定义字段,交付物会写进真实 issue 评论,注册表会提交到 agent-registry 分支。这些改动在你的仓库里是可见的,甚至会触发通知与自动化;新接团队请用一个临时仓库跑通整条链路,确认字段与分支命名可接受后再接正式项目。
Step 4:心跳、提交交付物、闭环复核
官方的 Agent 循环是「注册 → 认领 → 取上下文 → 心跳 → 提交交付物 → 完成」,每一步的 ID 都从上一步回显里串下来。提交交付物用 agent_manage,完成后由人或另一个 Agent 走复核:
{
"tool": "agent_work",
"arguments": {
"action": "heartbeat",
"agentId": "agent-abc123",
"status": "working",
"taskId": "issue-42",
"progress": 60,
"currentBranch": "feat/42-add-login-form"
}
}
{
"tool": "agent_manage",
"arguments": {
"action": "submit_work_product",
"agentId": "agent-abc123",
"taskId": "issue-42",
"issueNumber": 42,
"branch": "feat/42-add-login-form",
"prNumber": 99,
"summary": "Added login form with validation"
}
}
{
"tool": "agent_work",
"arguments": {
"action": "complete_task",
"agentId": "agent-abc123",
"taskId": "issue-42",
"summary": "Implemented and tested"
}
}
官方在仓库里放了 examples/basic/agent-loop.ts,是这条循环的 Runnable 版本(worker 加 reviewer,ID 逐环串联,任一失败非零退出);加 --plan 会打印带符号引用的调用序列,适合先看清再实跑。
idempotencyKey,24 小时内重试会重放结果而不是重复创建;分页 list 会返回 nextCursor,原样作为 cursor 传回即可。每个工具还会带 _meta.schemaVersion,便于客户端做兼容判断。复核动作口径:官方表格把 review 列在 agent_work 的能力里,叙述里也提到 approve、reject、decompose 的复核循环,但 README 没有给出精确的 review 动作字符串示例。需要精确参数时请查 docs/TOOLS.md,不要照着本文或其他二手文章猜动作名。
Step 5:给每个 Agent 装预算硬闸
官方的设计意图很直接:预算必须由 Agent 绕不过的一方执行。每个 Agent 都有带告警阈值与硬停止的 token 预算,服务端按工具调用自行扣减,record_usage 覆盖 Agent 自身的运行时开销;硬停止时 AI 工具会收到 BudgetExhausted。预算用 agent_manage 设置,重置周期可选 daily、weekly、monthly 或 never。
# 设置预算的工具与动作(参数细节见 docs/TOOLS.md)
# tool: agent_manage
# action: set_budget
# reset period: daily | weekly | monthly | never
# 与单次操作预算区分开
# AI_SESSION_TOKEN_LIMIT 是「每次 AI 任务生成」的上限
# 与 per-agent 预算是两套独立机制
# 只暴露必要工具组,减小上下文开销
MCP_TOOL_GROUPS=core
MCP_TOOL_GROUPS=core,ai
MCP_TOOL_GROUPS=all
# 按需展开动作,而不是把 175 个动作全塞进 schema
# {"tool": "discover_tools", "arguments": {"domain": "sprints"}}
discover_tools 支持 domain(projects、issues、pull_requests、milestones、sprints、labels、automation、iterations、events、status_updates、analytics、ai_generation、ai_analysis、ai_planning、agents、system)或自由文本 query;即便开了工具组过滤它也一直可用。别把预算当总体账单:官方说明 AI 工具是可选的,不配模型 key 时其余功能照常工作;因此预算主要约束 AI 工具与 record_usage 上报的开销,不等于你在本机跑编码 Agent 的全部模型花费。告警阈值的具体数值 README 未列出,需查 docs/TOOLS.md。
Step 6:AI 生成 PRD 到 issue,并留审计线索
ai_generate 覆盖从想法生成 PRD、增强与解析 PRD、加特性、推荐下一任务、复杂度分析、扩展子任务、追溯矩阵,最后把任务实体化为 GitHub issue 并按里程碑与冲刺分组。启用它需要配模型提供方;官方支持 anthropic、openai、google、google-vertex、perplexity 与 openai-compatible(OpenRouter、Groq、Ollama、LM Studio 等),且没有默认模型,需按角色自行配置。
# 打开 AI 工具组(默认 all 时无需设置)
MCP_TOOL_GROUPS=core,ai
# 按角色配置模型(官方变量形态)
# AI_{MAIN,PRD,RESEARCH,FALLBACK}_{PROVIDER,MODEL,API_KEY,BASE_URL}
# 例:AI_PRD_PROVIDER、AI_PRD_MODEL、AI_PRD_API_KEY
# 打开变更审计:追加式、已脱敏的 JSONL
AUDIT_LOG_ENABLED=true
AUDIT_LOG_PATH=.mcp-audit/mutations.jsonl
# 健康与速率
# system 组提供实时 GitHub 速率探测的健康检查
RATE_LIMIT_FLOOR=100
ai_generate 的九个动作以能力描述列出,但精确 action 字符串与完整参数表在 docs/TOOLS.md;写脚本前先读那份参考,比照着第三方示例猜更稳。HTTP 端点默认收紧:官方说明 WEBHOOK_HOST 默认只绑 127.0.0.1,/events/* 需要 EVENTS_AUTH_TOKEN 或 OAuth 2.1 配置,两者都没有时返回 503;EVENTS_ALLOW_UNAUTHENTICATED=true 仅供受信任的开发环境。要把服务暴露到网络前,先确认令牌、代理信任列表与签名校验都已配置,别把项目管理队列开放成公开写入口。
常见问题速查
| 现象 | 排查方向 |
|---|---|
| 客户端看不到工具 | 确认 Node 22.12.0 以上、stdio 配置正确、会话已重启;用 discover_tools 验证连通 |
| 报 project 权限不足 | PAT 需 repo、project、write:org;gh 登录态用 gh auth refresh -h github.com -s project 补 scope |
| 串到了别人的账号 | 凭据链回退到 gh auth token;用 GH_CLI_USER 钉账号或关掉回退 |
| 重复创建了 issue | create 动作带上 idempotencyKey,24 小时内重试会重放原结果 |
| AI 工具不可用 | 未配模型 key 或 MCP_TOOL_GROUPS 过滤掉了 ai 组;官方说明无 key 时其余功能不受影响 |
| 动作名报错 | README 未列全九个 ai_generate 动作字符串,去 docs/TOOLS.md 核对 |
做到哪一步算成功
在测试仓库里:claude mcp add github-project-manager -- npx -y mcp-github-project-manager 之后会话能列出工具;agent_work 的 register 返回可用 agentId,checkout_task 在 Projects v2 里写入认领字段且两个 Agent 不会抢到同一任务;heartbeat、submit_work_product、complete_task 三步依次回显成功,issue 评论里能看到分支与 PR;set_budget 设一个很小的额度后触发 AI 工具应被 BudgetExhausted 拦下;.mcp-audit/mutations.jsonl 里有追加式变更记录。这条链路走通,说明队列、复核与预算三件事都落在服务端而不是靠提示词约束。