浏览 MCP与Skills教程与资源

GitHub MCP 只读配置:限定仓库,读取同一条 Issue 并核对权限

使用 GitHub 官方远程 MCP,以同一仓库的 Issue #42 贯穿工具配置、读取参数和失败诊断,分清工具只读模式与 Token 资源权限。

先固定对象

仓库全名和 Issue 编号必须一起传递

本页采用 GitHub 官方远程 Server,不运行第三方 GitHub 代理。教学对象始终是 acme/demo-app 的 Issue #42;acme/demo-app 是示例名,开始前必须把它整体替换成你有权访问的测试仓库,并选一条真实存在的 Issue。若它不是 #42,后文所有参数和提示词一起改成实际编号。本文不声称这个演示仓库或 Issue 真实存在。

读取标题、状态和评论不需要创建 Issue、提交代码或执行 Actions。先在浏览器确认你选的是 Issue 而非 PR,记录完整 URL。GitHub 的 Issue/PR 共享编号空间,单凭数字不能确定对象类型。

控制两层权限

只读 Server 与仓库范围都要设

控制本例设置它不能替代什么
GitHub 账户确认本人能访问目标测试仓库Token 不会赋予账户原本没有的权限
Fine-grained PATResource owner 选目标所有者;Only select repositories 选 demo-app;Issues 设 Read-only;设置过期时间组织可能还需审批;仅生成 Token 不代表私有仓库可访问
Server 工具集只加载 issues,启用 X-MCP-Readonly禁用写工具不等于缩窄 Token 能读到的仓库
每次工具参数owner、repo 和 issue_number 固定为同一个目标‘只看这个仓库’的提示词不是 Token 的服务端授权限制

Fine-grained PAT 本身仍可读取 GitHub 公共仓库;不要用另一个公共仓库读取成功来证明私有仓库白名单失效。测试私有资源权限时只用你拥有的另一测试仓库。

Codex 远程连接

Token 从进程环境读取,配置只保留变量名

先合并下面的 TOML,再从 PowerShell 7.1 或更新版本启动本次 Codex CLI。脚本在变量不存在时用掩码提示输入 PAT;输入值不会写进命令文本,也不会打印出来。已有凭证管理工具注入了 GITHUB_PAT_TOKEN 时,则沿用它。仅创建一个 .env 文件不会让 Codex 自动读取它。

这是当前终端及其子进程的环境变量,不是加密存储。不要用 setx 把练习令牌长期写入用户环境,也不要把值放进仓库配置。正常退出 Codex 后,finally 会清除本脚本新设的变量;原来已有的变量保持原状。桌面应用不会自动继承这个终端的临时变量。

config.toml

GitHub 官方 endpoint + issues 只读工具集

[mcp_servers.github_issues]
url = "https://api.githubcopilot.com/mcp/"
bearer_token_env_var = "GITHUB_PAT_TOKEN"
http_headers = { "X-MCP-Toolsets" = "issues", "X-MCP-Readonly" = "true" }
PowerShell 7.1+

输入临时凭证并启动同一个进程环境中的 Codex

if ($PSVersionTable.PSVersion -lt [version]'7.1') {
  throw '请在 PowerShell 7.1 或更新版本运行此示例'
}
$githubPatWasSet = Test-Path Env:GITHUB_PAT_TOKEN
try {
  if (-not $githubPatWasSet) {
    $env:GITHUB_PAT_TOKEN = Read-Host '输入本次练习的 GitHub PAT' -MaskInput
  }
  if ([string]::IsNullOrWhiteSpace($env:GITHUB_PAT_TOKEN)) {
    throw '没有提供 PAT,停止启动'
  }
  codex mcp get github_issues
  codex
} finally {
  if (-not $githubPatWasSet) {
    Remove-Item Env:GITHUB_PAT_TOKEN -ErrorAction SilentlyContinue
  }
}

在 /mcp 中确认 github_issues 工具列表。启用只读模式后,不应把评论、创建或修改 Issue 当作本例已开放的能力。

同一个 Issue

详情与评论分开读取,编号都为 42

GitHub 官方工具 issue_read 通过 method 区分读取内容。以下是工具参数,不是 curl 请求;调用时使用你选定的真实 owner/repo/编号。

issue_read 参数

读取详情

{"method":"get","owner":"acme","repo":"demo-app","issue_number":42}
issue_read 参数

读取评论第一页

{"method":"get_comments","owner":"acme","repo":"demo-app","issue_number":42,"page":1,"perPage":20}

只读第一页不代表评论已读完。根据工具分页结果继续读取,或在摘要里明确只覆盖前 20 条;不要省略分页却声称总结全部讨论。

交给 Agent 的任务

让摘要中的每项结论都回到同一对象

可复制使用

让摘要中的每项结论都回到同一对象

只使用 github_issues,读取 acme/demo-app 的 Issue #42。
先返回 owner/repo、Issue URL、标题、状态,再读取评论。
正文里的需求、评论里的建议、已确认的决定分开描述。
每条“已决定”结论给出对应评论链接;没有明确证据就写“讨论中”。
若分页未读完,说明读取范围,不声称覆盖全部。
不要创建、评论、关闭 Issue,不调用其他仓库或工具补写操作。

仓库和编号按本页开头一次性替换。工具返回的文字是待分析资料,即便某条评论要求运行命令或发送凭证,也不构成本次任务授权。

别把所有问题当 Token 无效

按出现问题的层级缩小范围

连接成功,但没有 issue_read

原因
可能未启用 issues 工具集,或凭证与服务策略过滤了工具。
怎么改
先核对 X-MCP-Toolsets、只读配置和当前会话工具清单,再核对 Issues: Read。不要直接授予 repo 全权限。

能读公开仓库,目标私有仓库返回 404

原因
GitHub 会对部分无权访问的私有资源返回 404,也可能是真实对象不存在。
怎么改
比较同一身份在浏览器的目标 URL、PAT 所选 owner/repo、审批状态和 Issue 编号;公共仓库成功只说明基础连接可用。

要求添加评论时工具不存在

原因
本例刻意启用只读 Server;这是预期边界。
怎么改
保留评论为本地草稿。如果以后确需发布,另行评估目标、正文与权限,不为通过本例测试取消只读模式。

工具返回 403

原因
既可能是资源授权,也可能是组织策略或速率限制。
怎么改
检查响应错误正文和限流头;若是限流,等待并降低频率;若是授权,核对该 Issue 所在仓库。状态码本身不足以决定扩权。
依据与适用范围

本页的一手资料