Scopes
A token carries scopes, and they do two things: gate the call, and gate discovery - a tool whose scope you do not hold is not listed at all. Grant the narrowest set that does the job.
No scope grants everything Around thirty tools are refused to agent principals whatever their token says: creating tenants, changing membership, registering agents, resolving decisions, and every hard delete. They are marked in the tool reference.
activity:read2 toolsactivity:write1 toolagents:read9 toolsagents:write10 toolsapprovals:read1 toolapprovals:write2 toolsassets:read11 toolsassets:write13 toolsassignments:read3 toolsassignments:write6 toolsbilling:read4 toolscredentials:reveal1 toolReturns stored secrets in plaintext. Everything else in the product goes out of its way never to do this.
decisions:read7 toolsdecisions:write16 toolsdocuments:read8 toolsdocuments:write5 toolsfinancials:read1 toolfinancials:write1 toolinbox:read2 toolsinbox:write1 toolincidents:read2 toolsincidents:write2 toolsinfra:read12 toolsEnumerates every server the ORGANIZATION runs, across all workspaces - strictly wider than any product-level read, which is why no product scope implies it.
infra:write16 tools add_infra_database add_infra_datastore add_infra_host add_infra_platform archive_infra_database archive_infra_datastore archive_infra_host archive_infra_platform link_deployment_infra record_verification set_database_protection set_deployment_runtime update_infra_database update_infra_datastore update_infra_host update_infra_platform
instructions:read8 toolsinstructions:write11 toolsintegrations:read3 toolsintegrations:write6 toolsintelligence:read6 toolsinventory:read4 toolsinventory:write9 toolsinvites:read1 toolmarketing:read3 toolsmarketing:write3 toolsorg_overview:read1 toolorgs:read5 toolsorgs:write7 toolsportfolio_reviews:read2 toolsportfolio_reviews:write3 toolsproducts:read27 tools= projects:read generate_briefing get_assignment_context get_briefing get_gate get_initiative get_intake_plan get_lifecycle get_milestone get_operations_context get_portfolio_stream get_product get_product_context get_product_health get_release get_timeline_item get_workspace_overview list_briefings list_gate_templates list_gates list_initiatives list_metrics list_milestones list_products list_products_by_band list_releases list_timeline_items search
products:write36 tools= projects:write add_gate_condition add_gate_evidence add_temporal_dependency archive_goal complete_next_step convert_entity create_gate create_initiative create_milestone create_product create_release create_timeline_item delete_product evaluate_gate link_deployment_infra link_repository move_product purge_product reach_goal record_actual record_metric remove_temporal_dependency request_gate_pass reschedule_item restore_product rotate_repository_webhook_secret set_assignment_criteria set_deployment_runtime set_goal set_next_step unlink_repository update_gate_condition update_initiative update_milestone update_product update_release
profile:read1 toolprofile:write1 toolprojects:read2 tools= products:readprojects:write13 tools= products:writeresources:read2 toolsresources:write3 toolssetup_profiles:read5 toolssetup_profiles:write3 toolssite:read3 toolssite:write0 toolstasks:read6 toolstasks:write18 toolsworkspace:export3 toolsProduces a bundle of the entire workspace in one call. Every other read is narrow; this one is not.
products:* and projects:* are equivalent - holding either satisfies the other. The projects spelling is the older name kept working; write new tokens with products.