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:read5 toolsagents:write4 toolsapprovals:read1 toolapprovals:write2 toolsassets:read11 toolsassets:write13 toolsassignments:read2 toolsassignments:write2 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:write4 toolsinvites:read1 toolmarketing:read3 toolsmarketing:write3 toolsorg_overview:read1 toolorgs:read5 toolsorgs:write7 toolsproducts:read26 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_milestones list_products list_products_by_band list_releases list_timeline_items search
products:write29 tools= projects:write add_gate_condition add_gate_evidence add_temporal_dependency 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 record_actual remove_temporal_dependency request_gate_pass reschedule_item restore_product rotate_repository_webhook_secret set_deployment_runtime 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:read5 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.