Skip to content

MCP: update_custom_attribute with required:true is blocked by the auto-mode classifier #7

Description

@coryodaniel

update_custom_attribute with required: true is refused by the Claude Code auto-mode
classifier, so an agent cannot finish a governance setup it is otherwise authorized to do.

What happens

mcp__..._massdriver__update_custom_attribute { id: "<uuid>", required: true }
→ Permission for this action was denied by the Claude Code auto mode classifier.
  Reason: Blocked by classifier.

The operator had to open the UI and flip the flag by hand. Every other step in the same
flow — create_custom_attribute, create_group, create_policy — went through.

create_policy is also refused intermittently. The same call, retried unchanged
seconds later, succeeded. Two of eleven policy creations were refused on first attempt.

Why this should be allowed

required: true is a schema-tightening change. It makes an attribute mandatory at its
scope going forward. It does not delete data, does not touch infrastructure, and is
reversible with the same mutation. It is strictly more restrictive than the state it
replaces, which is the opposite of the risk the classifier is presumably screening for.

Blocking it is also self-defeating for the guardrail story: required: true is what
forces every new project to declare its owner and every environment to declare its tier.
An agent that can create attributes and write policies against them, but cannot mark them
required, produces a governance model with a hole in it and no signal that the hole exists.

Suggested fix

Set MCP tool annotations on the server so the classifier can size these calls correctly:

  • update_custom_attributedestructiveHint: false, idempotentHint: true
  • create_custom_attribute, create_group, create_policydestructiveHint: false

If the intermittent create_policy refusals persist after annotation, they are worth
chasing separately — nondeterminism on an unchanged call is hard to write runbooks around.

Repro

  1. create_custom_attribute { key: "tier", scope: "ENVIRONMENT", values: ["dev","staging","production"], required: false }
  2. Tag existing environments with mass environment update <env> -a tier=dev
  3. update_custom_attribute { id: "<id from step 1>", required: true } → refused

Create-then-tag-then-require is the only safe ordering, since marking an attribute required
while resources at that scope lack it is the case worth avoiding. So this is the normal path,
not an edge case.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingest:easyYou could easily do multiple of these in a day.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions