Files
harness_coding_docs/docs/gitea-mcp.md
T

3.7 KiB
Raw Blame History

Gitea MCP 接入

可选增强:让 agent 通过 Gitea 读取共享文档、Issue、分支和 PR。Git checkout 仍是本地编辑与离线降级入口,MCP 不取代 Git。

适用边界

  • Gitea Git 仓库保存版本化文档和代码。
  • Gitea Issue / PR 保存实时协调状态。
  • Gitea MCP 提供受控的远端读取和写入工具。
  • AGENTS.md、docs/00-ai-start-here.md 等最小启动文件仍保留在项目 checkout 中。

私有配置

从根目录 gitea.env.example 复制一份到 $HOME/.codex/gitea.env,替换示例值。也可用 GITEA_ENV_FILE 指向其他本机私有路径:

GITEA_URL=【Gitea 实例根地址,不含 /api/v1】
GITEA_TOKEN=【最小权限 Personal Access Token】

# 仅当团队明确接受 HTTP 下 Token 明文传输风险时设置:
GITEA_ALLOW_INSECURE_HTTP=1

# 仅当该实例必须绕过本机代理直连时设置:
GITEA_DIRECT=1

规则:

  • 不把 gitea.env、Token、Authorization header、私有实例地址提交到仓库或粘贴到 Issue。
  • Token 一旦出现在聊天、日志或提交历史中,立即撤销并轮换。
  • 推荐 HTTPS;如果项目长期使用 HTTP,必须在项目安全决策中记录风险接受人、网络边界和轮换策略。
  • GITEA_URL 填实例根地址;gitea-mcp 会自动追加 /api/v1。

Codex 配置

复制 ../scripts/gitea-mcp.ps1 到稳定的本机路径,然后在全局 ~/.codex/config.toml 或可信项目的 .codex/config.toml 注册:

[mcp_servers.gitea]
command = "pwsh.exe"
args = ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "【gitea-mcp.ps1 的绝对路径】"]
default_tools_approval_mode = "writes"
startup_timeout_sec = 30
tool_timeout_sec = 60

包装脚本固定使用 gitea-mcp==0.5.1,避免 uvx 自动升级造成协议或工具集合漂移。升级版本时先在独立分支验证 initialize、tools/list 和一条只读 API,再更新版本号。

工具审批

默认策略:

  • 自动允许只读:list_repos、read_file、list_issues、get_issue、list_branches、list_pull_requests。
  • 写入前确认:create_issue、update_issue、add_comment、create_branch、commit_changes、create_pr。
  • 破坏性动作再次确认:merge_pr、关闭 Issue、覆盖文件、批量操作。

如果 Codex 版本支持 enabled_tools / disabled_tools,应再用 allowlist 收窄工具,而不是只依靠提示词。

本地验证

只检查文件格式,不连接 Gitea、不显示 Token:

./scripts/gitea-mcp.ps1 -CheckConfig

连接预检:

./scripts/gitea-mcp.ps1 doctor

预检至少确认:实例可达、Token 有效、当前用户正确、MCP 版本固定。失败时查看系统临时目录中的 gitea-mcp-<PID>.stderr.log;日志不得复制 Token 或敏感正文。

降级规则

  • Gitea / MCP 不可用:允许继续已领取任务的本地工作,不允许领取新任务或猜测远端状态。
  • 恢复连接后:先拉取默认分支并重新读取任务 Issue,再提交或更新状态。
  • MCP 读取结果与本地 checkout 冲突:以明确记录的提交 SHA 为比较基准,不静默覆盖本地未提交改动。

按需读取

启用 agent-context.json 后,agent 不用通过 MCP 全量读取 docs/:

  1. 获取默认分支头 SHA 作为 context_ref。
  2. 读取清单和 bootstrap.always_read。
  3. 按本轮任务类型读取对应 routes。
  4. 保存 read_file 返回的文件 SHA;同一会话内 SHA 未变化时复用内容。

Gitea 中的文件与本地 docs/ 是同一 Git 工件的远端与 checkout,不要再创建第三份人工同步副本。