Skip to content

Commit 629846c

Browse files
chore: tighten changelog, remove PRs, clarify fine-grained permissions
1 parent 2c7fd77 commit 629846c

File tree

1 file changed

+14
-96
lines changed

1 file changed

+14
-96
lines changed

docs/changelog/2026-01-intelligent-scope-features.md

Lines changed: 14 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -7,88 +7,37 @@ category: feature
77

88
# Intelligent Scope Features
99

10-
GitHub MCP Server now provides intelligent handling of OAuth scopes across all authentication methods—automatically filtering tools based on your permissions and enabling dynamic scope requests when needed.
10+
GitHub MCP Server now intelligently handles OAuth scopesfiltering tools based on your permissions and enabling dynamic scope requests when needed.
1111

1212
## What's New
1313

1414
### OAuth Scope Challenges (Remote Server)
1515

16-
When using the remote MCP server with OAuth authentication (like VS Code's GitHub Copilot Chat), the server now implements the [MCP scope challenge handling specification](https://modelcontextprotocol.io/specification/2025-11-05/basic/authorization#scope-challenge-handling). Instead of failing when you lack a required scope, the server can request additional permissions dynamically.
17-
18-
**How it works:**
19-
1. You attempt to use a tool that requires a scope you haven't granted
20-
2. The server returns a `401` with a `WWW-Authenticate` header indicating the missing scope
21-
3. Your MCP client (if supported) prompts you to authorize the additional scope
22-
4. After granting permission, the operation completes automatically
23-
24-
This means you can start with minimal permissions and expand them naturally as you use more features—no upfront "grant all permissions" prompts.
16+
The remote server now implements [MCP scope challenge handling](https://modelcontextprotocol.io/specification/2025-11-05/basic/authorization#scope-challenge-handling). Instead of failing when you lack a required scope, it requests additional permissions dynamically—start with minimal permissions and expand them as needed.
2517

2618
### PAT Scope Filtering
2719

28-
For users authenticating with a classic Personal Access Token (`ghp_` prefix), tools are now automatically filtered based on your token's scopes. At startup, the server discovers your token's scopes and hides tools you can't use. This works on both the local (stdio) and remote server.
20+
For classic Personal Access Tokens (`ghp_` prefix), tools are automatically filtered based on your token's scopes. The server discovers your scopes at startup and hides tools you can't use.
2921

30-
**Benefits:**
31-
- **Reduced clutter** — Only see tools your token supports
32-
- **No failed calls** — Tools requiring unavailable scopes are hidden proactively
33-
- **Clear expectations** — Your tool list matches your actual capabilities
34-
35-
**Example:** If your PAT only has `repo` and `gist` scopes, tools requiring `admin:org`, `project`, or `notifications` will be hidden from your tool list.
22+
**Example:** If your PAT only has `repo` and `gist` scopes, tools requiring `admin:org`, `project`, or `notifications` are hidden.
3623

3724
### Server-to-Server Token Handling (Remote Server)
3825

39-
When using server-to-server tokens (like the `GITHUB_TOKEN` in GitHub Actions), the remote server now intelligently hides user-context tools that don't make sense without a human user.
40-
41-
**Tools hidden for S2S tokens:**
42-
- `get_me` — No user to query
43-
- Other user-specific context tools
44-
45-
This ensures automated workflows see only the tools they can actually use, rather than failing when they attempt to call user-context APIs.
26+
For server-to-server tokens (like `GITHUB_TOKEN` in Actions), the remote server hides user-context tools like `get_me` that don't apply without a human user.
4627

4728
### Documented OAuth Scopes
4829

49-
Every MCP tool now includes explicit OAuth scope documentation:
50-
51-
- **Required Scopes** — The minimum scope(s) needed to use the tool
52-
- **Accepted Scopes** — All scopes that satisfy the requirement (including parent scopes)
53-
54-
This information is visible in:
55-
- **README.md** — Each tool's documentation shows required and accepted scopes
56-
- **Tool metadata** — Available programmatically via the MCP protocol
57-
58-
**Example from README:**
59-
```
60-
### create_issue
61-
Creates a new issue in a GitHub repository.
62-
Required scopes: repo
63-
Accepted scopes: repo
64-
```
30+
Every MCP tool now documents its required and accepted OAuth scopes in the README and tool metadata.
6531

6632
### New `list-scopes` Command
6733

68-
A new CLI command helps you understand what scopes your configured toolsets need:
34+
Discover what scopes your toolsets need:
6935

7036
```bash
71-
# See scopes for default toolsets
7237
github-mcp-server list-scopes --output=summary
73-
74-
# Output:
75-
# Required OAuth scopes for enabled tools:
76-
# read:org
77-
# repo
78-
# Total: 2 unique scope(s)
79-
80-
# All toolsets with detailed output
81-
github-mcp-server list-scopes --toolsets=all --output=text
82-
83-
# JSON for automation
84-
github-mcp-server list-scopes --output=json
38+
github-mcp-server list-scopes --toolsets=all --output=json
8539
```
8640

87-
Use this to:
88-
- **Create minimal PATs** — Know exactly what scopes to grant
89-
- **Audit permissions** — Understand what each toolset requires
90-
- **CI/CD setup** — Generate scope lists programmatically
91-
9241
## Scope Hierarchy
9342

9443
The server understands GitHub's scope hierarchy, so parent scopes satisfy child scope requirements:
@@ -108,33 +57,15 @@ If a tool requires `read:org` and your token has `admin:org`, the tool is availa
10857
|----------------------|----------------|
10958
| **OAuth** (remote server) | Scope challenges — request permissions on-demand |
11059
| **Classic PAT** (`ghp_`) | Automatic filtering — hide unavailable tools |
111-
| **Fine-grained PAT** (`github_pat_`) | No filtering — API enforces permissions at call time |
112-
| **GitHub App** (`ghs_`) | No filtering — permissions based on app installation |
60+
| **Fine-grained PAT** (`github_pat_`) | No filtering — fine-grained permissions, not OAuth scopes |
61+
| **GitHub App** (`ghs_`) | No filtering — fine-grained permissions, not OAuth scopes |
11362
| **Server-to-Server** (`GITHUB_TOKEN`) | User tools hidden — no user context available |
11463

11564
## Getting Started
11665

117-
### For Remote Server (OAuth) Users
118-
119-
No action required! Scope challenges work automatically with supporting MCP clients like VS Code. You'll be prompted for additional permissions as needed.
120-
121-
### For Local Server (PAT) Users
122-
123-
1. **Discover required scopes:**
124-
```bash
125-
github-mcp-server list-scopes --toolsets=repos,issues,pull_requests --output=summary
126-
```
127-
128-
2. **Create a PAT with those scopes** at [github.com/settings/tokens](https://github.com/settings/tokens)
129-
130-
3. **Start the server** — tools not supported by your token will be automatically hidden
66+
**OAuth users:** No action required—scope challenges work automatically.
13167

132-
### Checking Your Current Scopes
133-
134-
```bash
135-
curl -sI -H "Authorization: Bearer $GITHUB_PERSONAL_ACCESS_TOKEN" \
136-
https://api.github.com/user | grep -i x-oauth-scopes
137-
```
68+
**PAT users:** Run `list-scopes` to discover required scopes, create a PAT at [github.com/settings/tokens](https://github.com/settings/tokens), and start the server.
13869

13970
## Related Documentation
14071

@@ -144,21 +75,8 @@ curl -sI -H "Authorization: Bearer $GITHUB_PERSONAL_ACCESS_TOKEN" \
14475

14576
## Feedback
14677

147-
Share your experience and report issues in the [Scope filtering/challenging discussion](https://github.com/github/github-mcp-server/discussions/1802).
148-
149-
## Key PRs
150-
151-
**github-mcp-server:**
152-
- [#1679](https://github.com/github/github-mcp-server/pull/1679) — Add OAuth scope metadata to all MCP tools
153-
- [#1741](https://github.com/github/github-mcp-server/pull/1741) — Add PAT scope filtering for stdio server
154-
- [#1750](https://github.com/github/github-mcp-server/pull/1750) — Add `list-scopes` command using inventory architecture
155-
- [#1650](https://github.com/github/github-mcp-server/pull/1650) — OAuth scopes customization and documentation
156-
157-
**github-mcp-server-remote:**
158-
- [#503](https://github.com/github/github-mcp-server-remote/pull/503) — Dynamic scope challenges implementation
159-
- [#609](https://github.com/github/github-mcp-server-remote/pull/609) — Dynamic OAuth scopes based on route and headers
160-
- [#618](https://github.com/github/github-mcp-server-remote/pull/618) — Initialize tool scope map for scope challenge middleware
78+
Share your experience in the [Scope filtering/challenging discussion](https://github.com/github/github-mcp-server/discussions/1802).
16179

16280
## What's Not Included
16381

164-
**Fine-grained PAT support** — Fine-grained Personal Access Tokens use a different permission model based on repository access rather than OAuth scopes. They don't return an `X-OAuth-Scopes` header, so scope filtering and scope challenges don't apply. The GitHub API enforces permissions at call time, and you'll receive clear error messages if an operation isn't permitted.
82+
**Fine-grained permissions** — Fine-grained PATs (`github_pat_`) and GitHub Apps (`ghs_`) use repository-based permissions rather than OAuth scopes. They don't return `X-OAuth-Scopes` headers, so scope filtering and scope challenges don't apply. The API enforces permissions at call time.

0 commit comments

Comments
 (0)