Tool profile / phased exposure
ae_system_profile_setInspect or switch the MCP tool profile to control which tools the model sees, widening a narrow session to read-only, authoring, or full access.
Instructions
Inspect or CHANGE the MCP tool profile (which tools the model is shown).
This is the ONE tool that is visible in EVERY profile, because it is how a
narrow profile is widened again: without it, a session started on idle
could never reach a write tool without a human editing the phase file.
YOU START ON idle (2026-10-29): the default face is exactly this tool plus
ae_system_tool_search - two tools, ~4.8 KB of prompt instead of ~195 KB. That
is deliberate, and one call changes it: profile="read" for the 33 read-only
tools, profile="authoring" for the 83 authoring tools, profile="full" for all
108. Use ae_system_tool_search first if you do not know which profile carries
the tool you want - it searches the ACTIVE face, so widening is what makes its
answers useful.
WHERE THE COST IS. The tool list is re-sent to the model on every request, so it is paid for continuously - which is why the profiles are not cosmetic. The numbers live in docs/tool-description-rationale.md.
THE SWITCH IS NOT INSTANT, AND THAT IS A CONTRACT, NOT A WARNING. The host
only re-reads tools/list after a notifications/tools/list_changed
notification; the measured window is about 75 ms, but the honest instruction
is coarser: the new tool set is usable on your NEXT model turn, never in
this one. Calling a just-exposed tool in the same turn can therefore fail
with unknown_tool -- that refusal text says so, and it is NOT a failed edit.
Likewise a tool that has just been REMOVED can still be offered for one turn
(stale registration) and will be refused the same way.
Switching is a META operation: it is journaled (event tool_profile, with the
exposed names and whether the host was told) but it never dispatches to After
Effects and never needs the write gate.
WHOSE TOOL LIST MOVES: scope="session" (the default) changes THIS
conversation only - the other conversations served by the same process keep
the face they had, and the notification is sent to this session alone.
scope="process" is the old, deliberate meaning: every conversation the server
serves re-syncs on its next request, EXCEPT the ones that set their own
profile, which keep it (a session choice always wins over the process default).
request_id is accepted and NOT forwarded (the tool has no args envelope); the
async wrapper's finish is what makes the key guard it.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| list | No | ||
| scope | No | session | |
| profile | No | ||
| request_id | No |