Permissions
The tools reference answers "what does this do." This page answers a different question: what can go wrong if I authorize it. The MCP spec requires your client to get your explicit consent before it invokes any tool — this table is what that consent should be based on.
What each tool can do
Two separate checks gate every call: the OAuth scope your client was approved for (see Authentication), and the Abyssale role of the signed-in user — enforced independently, on the Abyssale side, on every request. Both have to allow a call for it to succeed.
| Tool | Scope | Role required | Behavior | Notes |
|---|---|---|---|---|
get_me | none | Admin, Manager, Designer, or Operator | Read-only | Identity check only. |
get_remaining_credits | read:credits | Admin, Manager, Designer, or Operator | Read-only | |
list_designs | read:design | Admin, Manager, Designer, or Operator | Read-only | |
search_designs | read:design | Admin, Manager, Designer, or Operator | Read-only | |
list_projects | read:project | Admin, Manager, Designer, or Operator | Read-only | |
create_project | write:project | Admin or Manager | Mutates | Creates a new project. Fails, doesn't overwrite, on a name collision. |
list_fonts | read:font | Admin, Manager, Designer, or Operator | Read-only | |
get_design | read:design | Admin, Manager, Designer, or Operator | Read-only | |
get_design_as_import | read:design | Admin, Manager, Designer, or Operator | Read-only | |
get_design_format | read:design | Admin, Manager, Designer, or Operator | Read-only | |
get_design_import_example | read:design | Any signed-in role | Read-only | No live data — bundled static examples, not role-gated. |
generate_static_banner | generate:banner | Admin, Manager, Designer, or Operator | Mutates, spends credits | Spends generation credits (amount varies — see the help center). original_visual_id overwrites in place instead of creating new. |
generate_banners_async | generate:banner | Admin, Manager, Designer, or Operator | Mutates, spends credits | Spends generation credits (amount varies), plus AI credits if elements uses text_to_image/remove_bg. |
generate_multipage_pdf | generate:banner | Admin, Manager, Designer, or Operator | Mutates, spends credits | Spends generation credits (amount varies). Cannot regenerate in place. |
check_generation_status | generate:banner | Admin, Manager, Designer, or Operator | Read-only | Polls a job; costs nothing itself. |
import_design_from_json | import:design | Admin, Manager, or Designer | Mutates | Creates a new design or workspace template. |
check_design_import_status | import:design | Admin, Manager, or Designer | Read-only | Polls an import; costs nothing itself. |
The workspace Owner is always allowed
The Owner can use every tool regardless of role. At the other end, Viewer and Light Operator accounts cannot use the MCP server at all — every tool above except get_design_import_example denies them outright.
What data leaves your side, and what Abyssale-side data a tool can touch
The MCP server is a thin proxy: every tool call it makes is forwarded to Abyssale's backend on your own workspace's behalf, using a per-connection identity it resolves from your OAuth token. It cannot see or touch another workspace's data, and it holds no standing access beyond what a call actually needs.
What leaves your side is exactly what a tool's parameters say — a design id, project name, or, for import_design_from_json, the design payload you supply (including any inline image data you choose to embed). Nothing is sent anywhere outside Abyssale's own infrastructure.
Side effects that aren't obvious from the name
Generation spends credits every time
generate_static_banner, generate_banners_async, and generate_multipage_pdf each spend generation credits per call, whether or not the output is what you expected. How many depends on the generation itself (format, output type, page count) — see Understanding Abyssale credits for how credit cost is calculated. elements values that use text_to_image or remove_bg on generate_banners_async additionally spend AI credits. Check get_remaining_credits before a batch of calls if your balance is tight.
Regenerating in place overwrites, it doesn't duplicate
original_visual_id on generate_static_banner and generate_banners_async re-renders an existing visual and keeps its share URL — the previous render is replaced, not kept alongside the new one. generate_multipage_pdf deliberately doesn't accept this option.
Unknown layer or attribute names fail silently
Every generation tool's elements payload is lenient: a layer or property name it doesn't recognize is accepted and simply does nothing — no error, no warning. Call get_design or get_design_format first to confirm the names you're about to use actually exist on the design.
Generation results expire after 7 days
check_generation_status answers generation_request_gone for a job older than 7 days. Download anything you need before then.
Local-file uploads expire after 1 hour
When import_design_from_json returns WAITING_FOR_VALIDATION, the presigned upload commands it hands back stop accepting uploads about an hour after the import was created. Past that, the import is dead and has to be started over — check_design_import_status cannot revive it.
Rate limiting is enforced by Abyssale's backend on every call this server makes; exact numeric limits aren't published for this surface yet. If you're issuing a high volume of calls in a short window, expect requests to be throttled rather than assume none will be.
