Skip to content

Scope catalog

Floopy’s TBAC catalog is exactly 12 scopes — 4 V1 tool-named scopes (one per V1 tool) and 8 V2 capability scopes that gate the credibility-initiative endpoints. Wildcard * is reserved as “every current and future scope” and grants full access.

ScopeTools unlockedPlan gate
list_modelslist_models(none)
estimate_costestimate_cost(none)
route_llm_requestroute_llm_request(none)
get_analyticsget_analytics(none)
decisions:readget_decision, list_decisionsaudit_api
experiments:readlist_experiments, get_experiment_resultsaudit_api
experiments:writecreate_experiment, rollback_experimentaudit_api
optimization:readget_verificationaudit_api
constraints:readget_constraintsaudit_api, constraints_api
constraints:writeupdate_constraintsaudit_api, constraints_api
export:readexport_decisionsaudit_api, log_retention_days ≥ 30
routing:explainexplain_routingaudit_api, feedback_driven_routing

In the dashboard’s Create token dialog, the Scope Picker groups the 12 scopes by area (V1 tools / Decisions / Experiments / Constraints / Routing). You can:

  • Search by scope name or description.
  • Toggle individual scopes.
  • “Select all” / “Unselect all” within a group.
  • Grant the wildcard * (with a visible warning).

The picker only shows the functional scopes above. Decorative scopes from older designs (requests:*, prompts:*, evals:*, feedback:*, cache:*, admin*) have no corresponding routes and are intentionally omitted.


Two checkpoints, both server-side:

  1. tools/list filters its response to tools whose scope_required matches at least one scope on the token. The filtered list is what the LLM sees as available tools.
  2. tools/call re-validates the scope before dispatching; an out-of-scope call returns JSON-RPC error -32602.

Wildcard * short-circuits both checks.


Every audit row is keyed back to the token’s creatormcp_tbac_tokens.created_by is the auth.users.id of the dashboard user who minted the token. That column populates audit_log.actor_user_id.

For legacy tokens minted before migration 00122 (where created_by IS NULL), the audit row sets actor_type = 'service_account' and writes a metadata.actor_fallback = "tbac_token_id:<token_id>" so trail consumers can still track who did what — even if it’s at the token granularity rather than the user granularity.