Skip to content

Add authScope to namespace MCP OAuth tokens per project#496

Open
rschmukler wants to merge 1 commit into
editor-code-assistant:masterfrom
rschmukler:rs/mcp-auth-scoping
Open

Add authScope to namespace MCP OAuth tokens per project#496
rschmukler wants to merge 1 commit into
editor-code-assistant:masterfrom
rschmukler:rs/mcp-auth-scoping

Conversation

@rschmukler
Copy link
Copy Markdown
Contributor

MCP OAuth tokens were stored in the global cache keyed only by server name, so two projects using a same-named server (e.g. a plugin-provided linear) shared one [:mcp-auth <name>] slot. Authenticating a different account in one project clobbered the other's token.

Introduce an optional authScope field on HTTP MCP server config and derive the storage key from it via a single mcp-auth-key helper that all reads/writes/deletes route through:

  • global (default/unset): bare server name, one token shared everywhere (back-compat, no migration of existing tokens).
  • workspace: scoped to the workspace folder set (reuses cache/workspaces-hash).
  • any other value: a named bucket shared by projects using that value.

The server name always prefixes composite keys so different servers never share a token, and tool names (<server>__<tool>) are unaffected. Storage stays in the single global cache; only the key is namespaced.

Document the field in config.json, protocol.md and tools.md, including that it supports the full dynamic-string interpolation like other config values.

  • I added a entry in changelog under unreleased section.
  • This is not an AI slop.

MCP OAuth tokens were stored in the global cache keyed only by server
name, so two projects using a same-named server (e.g. a plugin-provided
`linear`) shared one `[:mcp-auth <name>]` slot. Authenticating a
different account in one project clobbered the other's token.

Introduce an optional `authScope` field on HTTP MCP server config and
derive the storage key from it via a single `mcp-auth-key` helper that
all reads/writes/deletes route through:
- `global` (default/unset): bare server name, one token shared
  everywhere (back-compat, no migration of existing tokens).
- `workspace`: scoped to the workspace folder set (reuses
  `cache/workspaces-hash`).
- any other value: a named bucket shared by projects using that value.

The server name always prefixes composite keys so different servers
never share a token, and tool names (`<server>__<tool>`) are unaffected.
Storage stays in the single global cache; only the key is namespaced.

Document the field in config.json, protocol.md and tools.md, including
that it supports the full dynamic-string interpolation like other config
values.
@rschmukler rschmukler force-pushed the rs/mcp-auth-scoping branch from 51e703b to 9daba74 Compare June 7, 2026 18:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant