diff --git a/apps/mcp/src/server/auth/rbac.test.ts b/apps/mcp/src/server/auth/rbac.test.ts index bbb0143d..b75bfb70 100644 --- a/apps/mcp/src/server/auth/rbac.test.ts +++ b/apps/mcp/src/server/auth/rbac.test.ts @@ -46,4 +46,16 @@ describe("effectiveContainerTagAccess", () => { { containerTag: "one", permission: "read" }, ]) }) + + it("treats full-scope read-only grants as read on every tag", () => { + const session: SessionInfo = { + ...baseSession, + scope: { type: "full", permission: "read" }, + } + + expect(effectiveContainerTagAccess(["one", "two"], session)).toEqual([ + { containerTag: "one", permission: "read" }, + { containerTag: "two", permission: "read" }, + ]) + }) }) diff --git a/apps/mcp/src/server/auth/rbac.ts b/apps/mcp/src/server/auth/rbac.ts index 327587a2..bc1198af 100644 --- a/apps/mcp/src/server/auth/rbac.ts +++ b/apps/mcp/src/server/auth/rbac.ts @@ -21,10 +21,12 @@ export function effectiveContainerTagAccess( permission = memberAccess.get(containerTag) ?? "read" } - if ( + if (session.scope?.permission === "read") { + permission = "read" + } else if ( session.scope?.type === "scoped" && - (session.scope.permission === "read" || - (scopedTags.size > 0 && !scopedTags.has(containerTag))) + scopedTags.size > 0 && + !scopedTags.has(containerTag) ) { permission = "read" }