Skip to content

Feature: per-toolset (or per-tool) read-only mode instead of global GITHUB_READ_ONLY #3229

Description

@huangsijun17

Feature request

GITHUB_READ_ONLY is currently all-or-nothing: when set, the whole server rejects every write operation. There is no way to keep some domains writable while others stay read-only.

Use case

Running the server as a local coding-agent tool with a single GitHub token, I want a common "safe by default" posture:

  • Reads everywhere (repos, issues, pull requests) allowed without human confirmation
  • Writes (merge PR, close/label issues, push comments) gated behind explicit user approval

Today the only way to approximate this is to launch two full server instances — one with GITHUB_READ_ONLY=1 and one without — and rely on agent-side conventions to route writes to the second instance. That is fragile because nothing on the server side prevents an agent from calling write tools on the writable instance, and it doubles the tool surface / process count.

Proposed solution

Any of the following would fix it:

  1. Per-toolset read-only, e.g. GITHUB_READ_ONLY_TOOLSETS=issues,pull_requests (writes rejected only for the listed toolsets), or
  2. Per-tool read-only overrides, e.g. a GITHUB_READ_ONLY_TOOLS=merge_pull_request,create_issue deny list, or
  3. A "write-confirm" layer that rejects write tools unless an opt-in env var for that specific call is present.

Option 1 seems the most consistent with the existing GITHUB_TOOLSETS design.

Alternatives considered

  • Token scoping (fine-grained PAT without write scopes): does not help, because the same token is also expected to perform approved writes.
  • Dual-instance setup: works only as a convention, not enforcement (described above).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions