# 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`](../gitea.env.example) 复制一份到 `$HOME/.codex/gitea.env`,替换示例值。也可用 `GITEA_ENV_FILE` 指向其他本机私有路径: ```text 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`](../scripts/gitea-mcp.ps1) 到稳定的本机路径,然后在全局 `~/.codex/config.toml` 或可信项目的 `.codex/config.toml` 注册: ```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: ```powershell ./scripts/gitea-mcp.ps1 -CheckConfig ``` 连接预检: ```powershell ./scripts/gitea-mcp.ps1 doctor ``` 预检至少确认:实例可达、Token 有效、当前用户正确、MCP 版本固定。失败时查看系统临时目录中的 `gitea-mcp-.stderr.log`;日志不得复制 Token 或敏感正文。 ## 降级规则 - Gitea / MCP 不可用:允许继续已领取任务的本地工作,不允许领取新任务或猜测远端状态。 - 恢复连接后:先拉取默认分支并重新读取任务 Issue,再提交或更新状态。 - MCP 读取结果与本地 checkout 冲突:以明确记录的提交 SHA 为比较基准,不静默覆盖本地未提交改动。 ## 按需读取 启用 [`agent-context.json`](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,不要再创建第三份人工同步副本。