From 0e12f0b3a65af1cf7b03f48561f20ddf4369bc3f Mon Sep 17 00:00:00 2001 From: Dhravya <63950637+Dhravya@users.noreply.github.com> Date: Wed, 23 Sep 2026 01:12:51 +0000 Subject: [PATCH] fix(mcp): treat full-scope read grants as read-only --- apps/mcp/src/server/auth/rbac.test.ts | 12 ++++++++++++ apps/mcp/src/server/auth/rbac.ts | 8 +++++--- 2 files changed, 17 insertions(+), 3 deletions(-) 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" }