Authorization

Configure Role-Based Access Control (RBAC) policies for fine-grained permission management in Argus MCP.

Argus MCP supports Role-Based Access Control (RBAC) for fine-grained permission management. When enabled, every MCP operation is evaluated against a set of authorization policies.

Configuration

authorization:
  enabled: true
  default_effect: deny          # "allow" or "deny" when no policy matches
  policies:
    - effect: allow
      roles: ["admin"]
      resources: ["*"]

    - effect: allow
      roles: ["developer"]
      resources: ["tool:search_*", "resource:docs/*", "prompt:*"]

    - effect: deny
      roles: ["*"]
      resources: ["tool:dangerous_*"]

Policy Fields

FieldTypeDescription
effect"allow" or "deny"Grant or deny access
roleslistRoles this policy applies to. "*" matches all roles
resourceslistResource patterns to match (glob-supported)
descriptionstringOptional human-readable description

Resource Identifiers

Resources are formatted as type:name:

FormatExampleMatches
tool:<name>tool:search_webSpecific tool
tool:*--All tools
tool:search_*--Tools matching glob
resource:<uri>resource:docs/readmeSpecific resource
prompt:<name>prompt:code_reviewSpecific prompt
server:<name>server:my-backendSpecific backend server
group:<name>group:search-toolsA server group
*--Everything

Evaluation Logic

Request arrives with UserIdentity (from auth middleware)
  |
  +-- For each policy (in order):
  |   +-- Does user have any matching role?
  |   +-- Does the resource match?
  |       +-- YES: Apply the policy's effect (allow/deny) -- DONE
  |       +-- NO:  Continue to next policy
  |
  +-- No policy matched: Apply default_effect
  • Policies are evaluated in order -- first match wins
  • Glob patterns are supported for resources (via fnmatch)
  • Roles come from the JWT claims (roles or realm_access.roles)

Role Sources

Roles are extracted from the authenticated user's identity:

Auth TypeRole Source
anonymousEmpty (no roles)
localEmpty (no roles)
jwtroles claim or realm_access.roles
oidcSame as JWT

Examples

Admin-only access

authorization:
  enabled: true
  default_effect: deny
  policies:
    - effect: allow
      roles: ["admin"]
      resources: ["*"]

Read-only for viewers, full access for developers

authorization:
  enabled: true
  default_effect: deny
  policies:
    - effect: allow
      roles: ["viewer"]
      resources: ["resource:*", "prompt:*"]
    - effect: allow
      roles: ["developer"]
      resources: ["*"]

Deny dangerous tools for everyone

authorization:
  enabled: true
  default_effect: allow
  policies:
    - effect: deny
      roles: ["*"]
      resources: ["tool:delete_*", "tool:drop_*"]

Middleware Integration

The AuthzMiddleware sits after AuthMiddleware in the chain:

  1. Reads UserIdentity from ctx.metadata["user"]
  2. Builds the resource identifier (e.g., tool:search_web)
  3. Evaluates policies via the PolicyEngine
  4. On allow: passes to next middleware
  5. On deny: raises AuthorizationError (HTTP 403)

If authorization is disabled (enabled: false), the middleware is a no-op pass-through.