@@ -10,7 +10,9 @@ who can manage sources, registries, and entries. Authorization builds on top of
1010[ authentication] ( ./authentication.mdx ) — you need OAuth authentication enabled
1111before configuring authorization.
1212
13- Claims operate at three layers, checked in order when a client reads entries:
13+ ## How authorization works
14+
15+ When a client accesses registry data, the server checks three layers in order:
1416
15171 . ** Registry claims** (access gate) — can the caller access this registry at
1618 all? If the registry has claims and the caller's JWT doesn't satisfy them,
@@ -23,17 +25,6 @@ Claims operate at three layers, checked in order when a client reads entries:
2325 operation? Publishing, deleting, and managing sources/registries require
2426 specific [ roles] ( #configure-roles ) .
2527
26- ## How authorization works
27-
28- Authorization in the Registry server operates at two levels:
29-
30- 1 . ** Role-based access control (RBAC)** : Determines which admin operations a
31- caller can perform (manage sources, manage registries, publish/delete
32- entries).
33- 2 . ** Claims-based scoping** : Limits visibility and access to specific sources,
34- registries, and entries based on key-value claims attached to both resources
35- and callers.
36-
3728When a caller makes an API request, the server:
3829
39301 . Extracts the caller's claims from their JWT token
@@ -221,16 +212,21 @@ caller's claims must be a superset of the resource's claims. For example:
221212| `{org : " acme" }` | `{org: "contoso"}` | Denied |
222213
223214Registries and sources with no claims are accessible to all authenticated
224- callers. However, **entries** with no claims behave differently : they are
225- visible in anonymous mode and [auth-only mode](#auth-only-mode), but invisible
226- when full authorization is enabled. With authorization, the per-entry filter
227- requires both sides to have claims for a match — so entries without claims are
228- filtered out. To make entries visible to authorized callers, attach claims to
229- the source (for synced sources) or to individual entries (via the publish
215+ callers.
216+
217+ :::warning[Entries without claims are invisible when authorization is enabled]
218+
219+ Entries with no claims are visible in anonymous mode and
220+ [auth-only mode](#auth-only-mode), but **invisible** when full authorization is
221+ enabled. The per-entry filter requires both sides to have claims for a match —
222+ entries without claims are filtered out. To make entries visible, attach claims
223+ to the source (for synced sources) or to individual entries (via the publish
230224payload or the
231225[`authz-claims` annotation](./configuration.mdx#per-entry-claims-via-annotation)
232226for Kubernetes sources).
233227
228+ :: :
229+
234230# # Claims on published entries
235231
236232When you publish an MCP server version or skill to a managed source, you can
0 commit comments