Session context
When you first connect, Moda uses your default organization and team. If you belong to multiple organizations, you can switch withset_context:
- Call
list_organizationsto see your orgs and teams. - Call
set_contextwith the org name (and optionally team name). - All subsequent tool calls use that workspace automatically.
list_brand_kits, create_brand_kit, start_design_task, and remix_design all read from your session context automatically. You can also pass org_id or team_id explicitly to override the session context for a single call.
URL formats
All tools that accept aurl parameter support these formats:
Private canvas URLs require authentication via the remote server.
set_context
Sets your preferred organization and team for the current session. Once set, all subsequent tools that operate within a workspace (brand kits, design tasks, remixes) will use these defaults automatically.This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
A confirmation string:Example usage
Notes
- Call
list_organizationsfirst to see available organization and team names - Context persists for 24 hours across reconnections
- You can call
set_contextagain at any time to switch workspaces
get_context
Shows your current session context — which organization and team are active for workspace-scoped tools.This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
This tool takes no parameters.Returns
A string describing your current context:get_moda_bootstrap
MANDATORY FIRST CALL, every new conversation, before creating, editing, reading, remixing, or exporting any canvas — even if the agent already knows the user’s identity: this returns far more than identity (the Moda skill pointer, active user, active workspace, and entitlements that affect tool-call decisions). The response also lets agents skip downstream lookups when defaults are unambiguous.This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
This tool takes no parameters.Returns
Notes
- Reads from existing session context — no side effects.
- A good first call on any new conversation:
org_count,brand_kit_count, andconcurrency_capcollectively eliminate the need for several downstream tool calls. - The
planvalue is the same enum returned by the billing service;concurrency_capis pre-resolved so callers don’t need to maintain their own mapping.
set_session_brand_kit
Pin a brand kit for the current session without changing the team default. Subsequent calls tostart_design_task / remix_design that omit brand_kit_id will resolve to this kit instead of the team default.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.set_default_brand_kit instead.
Parameters
Returns
A confirmation string:Notes
- Switching workspaces via
set_contextclears the session brand kit (kits are team-scoped). - Resolution order for
start_design_task/remix_design: explicitbrand_kit_id→ session preference → team default → none (ifskip_brand_kit=true). - The kit must belong to the active team; trying to pin a kit from a different team raises a tool error.
get_moda_canvas
The primary tool for design-to-code workflows. Fetches a Moda canvas and returns semantic pseudo-HTML with CSS properties and design tokens that AI agents can translate to any frontend framework.Parameters
Returns
A string containing semantic pseudo-HTML with CSS properties, followed by a design tokens summary.Semantic tags
The transformer assigns semantic tag names based on visual properties and layer names:
Layer names in Moda take priority over visual heuristics. See Naming Layers for best practices.
Example usage
Notes
- The output is intentionally HTML-like so agents can map it directly to React, Vue, or HTML components
- Design tokens are appended as a summary at the end of the output
- For multi-page canvases, omitting
page_numberreturns all pages in a single response - Hidden layers are excluded from the output
- Rich text extracts the first style span’s properties; mixed-style paragraphs use the first style encountered
get_moda_canvas_tokens
Returns only the design tokens from a canvas — colors, fonts, variables, and corner radii — as structured JSON. Use this when you need to generate theme configuration files without the full semantic layout.Parameters
Returns
Example usage
Notes
- Variables defined in the Moda canvas (via the variables panel) appear in the
variablesfield with their default values - Colors are deduplicated and sorted
- Font roles (
body,heading) are inferred from usage context (font size and weight)
list_moda_canvas_pages
Returns metadata about each page in a canvas, including page names, dimensions, and the number of design elements. Use this to understand the structure of multi-page canvases before fetching specific pages.Parameters
Returns
Notes
- Page numbers are 1-indexed
- The
node_countincludes all visible elements on the page (shapes, text, images, groups) - Hidden elements are excluded from the count
export_canvas
Export a Moda canvas as an image or document file. Pass exactly one ofcanvas_id or url.
Parameters
Format guide
For multi-page PNG/JPEG without
page_number, the response carries format: "zip" and the URL serves a .zip of per-page raster files. The requested raster format is preserved inside the archive (page-1.png, page-2.png, …).
Returns
On success:page_number was omitted, a PNG/JPEG export bundles into a zip:
get_export_status(task_id) to fetch the URL once it’s ready — the same task_id keeps returning the in-progress shape until terminal:
canvas_id, canvas_url, and task_id are only included for authenticated private-canvas exports (i.e., when using canvas_id or a private URL). Share-link exports omit these fields to avoid leaking internal identifiers.
Example usage
Provide exactly one ofcanvas_id or url per call:
Notes
- Pass exactly one of
canvas_idorurl - For design-generation workflows, prefer
canvas_idfromstart_design_task/get_task_status - Export-before-ready and temporary readiness-check failures are normal retryable MCP states, not tool failures
- The signed URL expires after 7 days
- In production, the URL is served from the signed
assets-cdn.moda.appCDN; rawstorage.googleapis.comlinks are a fallback and not the canonical host - Page exports are cached in Redis for 4 hours per
(canvas, page, ratio)combo. The cache key includes the canvasupdated_at, so any edit auto-invalidates. Re-exporting an unchanged page returns in milliseconds. - For document formats (
pdf,pptx), all pages are included by default unlesspage_numberis specified - For PNG/JPEG: pass a specific
page_numberto get a single image; omit it to get every page — single-page canvases return a raw image, multi-page canvases return a.zipofpage-1.png/page-2.png/… (format: "zip"in the response) - When a design task auto-exports via
export_on_complete, the artifact lives atresult.exporton the task and is keyed identically to a manualexport_canvascall. A follow-upexport_canvasfor the same canvas with no edits hits the cache instead of re-rendering. - Screenshots are rendered server-side using a headless browser
get_export_status
Poll the status of an asynchronous export started byexport_canvas. Use when export_canvas returned status='in_progress' (large multi-page exports that exceed the synchronous wait budget).
Parameters
Returns
While running:Notes
- Export task records are kept for ~1 hour. After that the task ID is treated as unknown and the call returns a tool error.
- Call
get_export_statusinstead of repeatedly callingexport_canvaswhile a known task is running —export_canvasmay return the same in-progress handle, butget_export_statusis the canonical poll path.
list_my_canvases
Returns a paginated list — or, with aquery, a paginated keyword search — of canvases accessible to the authenticated user. Use this to browse available canvases when you don’t have a specific URL, and whenever the user should see or pick one.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Notes
- Canvases are returned in order of most recently updated; with a
query, results are ranked by relevance and then recency - Pairs with the Canvas Gallery interactive app, which renders the results as a thumbnail grid and calls this tool again from its search box and “Show more” button
- Prefer this tool over
search_canvaseswhenever the user should see or pick a canvas — passqueryto hand them a pre-filtered gallery - The
urlfield can be passed directly to other tools likeget_moda_canvas - The maximum
limitis 100 per request
search_canvases
Searches your canvases by name or content and returns matching results as plain JSON. Use this when you need to resolve a canvas ID for a follow-up call and don’t have the exact URL.This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Notes
- The search matches against canvas names and content
- Results are ranked by relevance
- Renders no interactive app — it’s the JSON-only counterpart to
list_my_canvases, which takes the samequeryand renders the Canvas Gallery. Use that one when the user should see the results - The returned
urlcan be passed directly to other tools likeget_moda_canvas - The maximum
limitis 100 per request
list_organizations
Returns a list of organizations and teams you belong to. Use this to discover available workspaces, then callset_context to choose which one to use.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
This tool takes no parameters.Returns
Notes
- Use org and team names with
set_contextto choose your active workspace - IDs are included but typically don’t need to be shown to users — use names in conversation instead
- Organizations are sorted alphabetically by name
- Only teams you have access to are included
find_brand_kits
JSON-only sibling oflist_brand_kits. Same data, same parameters — the difference is presentation. find_brand_kits does not render the visual brand-kit showcase iframe, so it’s appropriate when the agent is just looking up a brand_kit_id to pass to another tool (e.g. start_design_task).
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server._meta.ui.resourceUri. There is no per-call way to suppress rendering. So Moda exposes two tools sharing the same backing data:
find_brand_kits— JSON-only. Use for tool-call decisions.list_brand_kits— renders the visual showcase. Use when the user asked to see their kits.
Parameters
Identical tolist_brand_kits: org_id, team_id, verbose, limit, offset.
Returns
Identical tolist_brand_kits.
list_brand_kits
Returns brand kits for a team. Renders the visual brand-kit showcase iframe on every call (on app-aware hosts like claude.ai and Claude Desktop). Brand kits contain colors, fonts, logos, and brand guidelines that were extracted from company websites. Uses your session context (set viaset_context) or defaults to your primary workspace.
For agent-side lookups where the iframe would take over screen space the user didn’t ask for, prefer find_brand_kits — same data, no UI.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
If neither
org_id nor team_id is provided, uses your session context or defaults to your primary workspace.
Returns
When
verbose=false, each kit drops the colors, fonts, logos, brand_values, brand_aesthetic, brand_tone_of_voice, company_url, and company_description fields — useful when you only need ids/titles to pick a kit by name.
brand_aesthetic is a deprecated keyword array describing the brand’s visual style. The brand’s visual aesthetic is otherwise captured internally and is not exposed through this API.
Notes
- Uses your session context to determine the workspace. Call
set_contextto switch organizations or teams. - Default-kit-first, then created-at descending. Stable across paginated calls when no edits intervene.
- The
is_defaultbrand kit is automatically used bystart_design_taskwhen nobrand_kit_idis specified. - Cache: signed export URLs and signed CDN logo URLs are valid for 24h; a chat refresh that re-renders the showcase iframe within that window hits a Redis cache instead of re-signing.
create_brand_kit
Creates a brand kit by extracting brand information from a company website. Provide a URL or domain and Moda will extract colors, fonts, logos, and brand guidelines automatically. Uses your session context (set viaset_context) or defaults to your primary workspace.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Returns the created brand kit in the same format aslist_brand_kits entries.
Notes
- Extraction typically takes 10–30 seconds depending on the website
- Uses Firecrawl to scrape the website and extract brand data
- If the brand has been extracted before, a cached result is used for faster response
- The first brand kit created for a team is automatically set as the default
update_brand_kit
Updates an existing brand kit. Pass only the fields you want to change — all other fields remain unchanged.This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Setting
default_theme_canvas_id to a non-theme canvas — or one on a different team — fails with invalid_theme_canvas.
Returns
Returns the updated brand kit in the same format aslist_brand_kits entries.
Notes
- Pass only the fields you want to change — omitted fields are not modified
- When updating
colorsorfonts, the entire array is replaced (not merged) - You must have access to the team that owns the brand kit
set_default_brand_kit
Marks a brand kit as the team’s default and clears the default flag on the previously-default kit. The default brand kit is automatically applied bystart_design_task when no brand_kit_id is provided.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Returns the team’s brand kits in the same shape aslist_brand_kits, with the new default first. Use this to rerender any UI that depends on default-kit state without an additional round-trip.
Example usage
Notes
- Idempotent: setting the already-default kit is a no-op
- Only the user’s currently-active team is affected
- Pairs with the Brand Kit Showcase interactive app, which calls this tool from its “Set as default” button
list_brand_kit_images
Returns every image attached to a brand kit — both logos and design references — in newest-insertion order. Useful when reconciling an existing brand kit before adding new images, since blindly callingadd_brand_kit_image would create duplicates.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Example usage
Notes
- Pairs with the Brand Kit Image Gallery interactive app, which renders the images grouped by role
- The image
urlis served from the signed CDN; treat it as opaque
remove_brand_kit_image
Detaches an image from a brand kit by itsbki_ ID. Returns the freshly re-listed images so callers can rerender from authoritative state.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Returns the same payload shape aslist_brand_kit_images after the removal completes, so the caller can rerender directly from the response.
Example usage
Notes
- The underlying file is not deleted from storage — only the brand-kit reference is removed
- Pairs with the Brand Kit Image Gallery interactive app, which calls this tool from each card’s Remove button
- Not idempotent: calling twice with the same
image_idraises a not-found error on the second call
upload_file
Uploads a file from a URL to Moda’s storage. Returns a stable proxy URL that can be used as an attachment instart_design_task. Supports images, PDFs, Office documents (PowerPoint, Word, and Excel spreadsheets), CSV, plain-text/Markdown, and web-playable video (MP4, WebM, MOV).
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Example usage
Notes
- The returned
urlcan be passed directly as an attachment URL instart_design_task - Files are deduplicated by content hash — uploading the same file twice returns the existing record
- Supported types include images (PNG, JPEG, WebP, etc.), PDFs, Office documents (PowerPoint
.pptx/.ppt, Word.docx/.doc, Excel.xlsx/.xls), CSV, plain text/Markdown, and web-playable video (MP4, WebM, MOV)
start_design_task
Starts an AI design task using Moda’s design agent. The agent creates or edits a canvas based on your prompt. Provide acanvas_id to edit an existing canvas, or omit it to create a new one.
By default this tool returns immediately in milliseconds with a task handle ({task_id, canvas_id, canvas_url, status: 'queued'}). On hosts that support interactive apps (claude.ai web, Claude Desktop), the paired Design Task Progress iframe shows live progress and rendered pages, so you don’t need to block on completion. On non-interactive hosts, poll get_task_status(task_id) to track progress and detect completion. Pass wait=True to opt back into synchronous behavior — useful only for non-interactive consumers that need a single blocking call.
Uses your session context (set via set_context) or defaults to your primary workspace.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
theme_canvas_id reports the brand kit’s slides theme that was auto-applied to the new canvas — the canvas whose page layouts the agent themes from. It’s populated only when you create a fresh slides deck (format_category="slides", no canvas_id) with a brand kit that has a saved default theme; it’s null for non-slides designs, edits of existing canvases, and brand kits without a saved theme.
Once get_task_status reports status: "completed", the same envelope additionally carries result.export with the auto-exported artifact:
Example usage
Notes
- The default
wait=Falsereturns a task handle in milliseconds. Passwait=Trueonly when you specifically want a single blocking call. - On iframe-aware hosts (claude.ai web, Claude Desktop), the paired Design Task Progress app polls and renders pages on its own — see Interactive Apps.
- Use
retry_after_secondsas the default delay before the firstget_task_status(task_id)call - Keep polling until
can_export == trueoris_terminal == true can_exportbecomestrueonly after successful completion with exportable canvas data- If no
brand_kit_idis provided, the team’s default brand kit is used automatically - If no
canvas_idis provided, a new canvas is created with the name fromcanvas_nameor “Untitled” - Every response includes a
conversation_id. Pass it back in subsequent calls so the agent has context of all previous interactions. - When resuming a conversation, the
canvas_idparameter is ignored — the agent automatically operates on the conversation’s canvas - Use
upload_fileto upload local files first, then pass the returnedfile_idin anattachmentsitem with arole(source/reference/asset/import).importis PPTX-only — it loads the deck onto the canvas as editable slides. The older URL form is still accepted but drops role metadata. - Reference canvas IDs let the agent see and draw inspiration from existing designs without modifying them
- Always pass
format_categorywhen creating new designs — without it, a fresh canvas is created as a generic"other"canvas at 1080×1080 with no format skill, so a deck/post/document gets a generic layout - The auto-export attached to
result.exportis keyed identically to a follow-upexport_canvas(canvas_id=...), so callingexport_canvasafterward with default args hits the cache instead of re-rendering. Pinexport_on_complete.formatandexport_on_complete.pixel_ratiowhen you need a non-default artifact — the cache match depends on the exact(format, pixel_ratio)pair.
get_task_status
Returns the status and progress of a specific design task. Use this to check on tasks started withstart_design_task or remix_design.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Notes
- Use this after
start_design_taskto poll for progress - Poll again after
retry_after_secondswhileis_terminal == false - On
status="completed", the response carries aresult.exportblock ({url, format, status, page_count}) with the auto-exported design — read it directly instead of callingexport_canvasfor the same canvas. If the auto-export was disabled viaexport_on_complete: {enabled: false}or skipped (animation canvases),result.exportis absent. - Failed or cancelled tasks are terminal, but they do not set
can_export - The
promptfield carries the user’s original prompt in full (the task-progress iframe surfaces it verbatim)
list_tasks
Returns a list of recent design tasks. Use this to see what design tasks have been run recently, optionally filtered by canvas or status.This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Notes
- Tasks are returned in order of most recently created
- The maximum
limitis 50 per request - Only tasks for canvases you have access to are returned
remix_design
Duplicates an existing canvas and optionally starts a design task on the copy. Use this to create variations of existing designs without modifying the original. When a prompt is provided, the tool returns a task handle immediately — pollget_task_status the same way as start_design_task. Uses your session context (set via set_context) or defaults to your primary workspace.
This tool requires authentication via the remote MCP server at
mcp.moda.app. It is not
available when using the local stdio server.Parameters
Returns
Without a prompt (plain duplicate):Example usage
Notes
- The original canvas is never modified — all changes are applied to the copy
- When a
promptis provided, a design task is started on the duplicate and the tool returns immediately with a task handle - Poll
get_task_status(task_id)untilcan_export == trueor the task reaches a terminal failure state, same asstart_design_task
Websites
Moda websites are HTML projects you can draft and manage, then publish from the Moda editor to a public*.moda.page URL. These four MCP tools let your agent draft, inspect, and update websites in Moda — available to every authenticated MCP user.
Publishing the resulting draft is opt-in: create_website_from_upload and update_website_from_upload both accept a publish flag that defaults to false. Passing publish=true requires the website-publishing feature on your Moda account (paid plan); otherwise the call errors and the agent should re-call with publish=false to save the draft. The user can then publish from the editor at any time.
HTML payloads are uploaded out-of-band (presigned URL → PUT bytes → call the tool with the returned storage_key) so large HTML documents — especially ones with inlined base64 images — don’t have to pass through MCP tool args. Inline data: images are extracted to Moda Files automatically so the published artifact stays small.
Every website tool requires authentication via the remote MCP server at
mcp.moda.app. The
local stdio server does not expose them.list_my_websites
Lists the websites visible to the caller in the active team, newest-updated first. Scoped to the team in your session context — callset_context first if you belong to multiple teams.
Parameters
Returns
url is null for unpublished drafts.
get_website
Fetches the full agent-facing projection of one website — the source HTML for the home page, title, share state, comments toggle, editor URL, and (if published) the live*.moda.page URL. Use this before calling update_website_from_upload so the agent has the current source as a base.
Parameters
Returns
published_url and url are both null for unpublished drafts. url is a deprecated alias kept for backward compatibility — prefer published_url in new code.
create_website_from_upload
Creates a new Moda website from an HTML file. The HTML is uploaded out-of-band first so large documents (especially ones with inlined base64 images) don’t have to pass through MCP args. Required upload sequence:create_upload_url(filename="site.html", mime_type="text/html")→ returns{upload_url, storage_key}.- PUT the HTML bytes to
upload_urlwith headerContent-Type: text/html. - Call
create_website_from_upload(storage_key=…)with thestorage_keyfrom step 1.
data:image/… URI to a CDN-hosted Moda File, rewrites the HTML to reference the proxy URL, then creates the website row. Sites default to category='html-document', share_state='unlisted', and comments_enabled=true.
Parameters
Returns
editor_urlis always present — give this link to the user.published_urlis the live*.moda.pageURL whenpublish=truesucceeded;nullfor drafts. Do not fabricate a*.moda.pageURL from thewebsite_id.
update_website_from_upload
Replace the HTML and/or title of an existing website. The website_id is preserved, existing comments stay anchored via a reconciliation pass over the new DOM, and inlinedata: images in the uploaded HTML are extracted to Moda Files (same pipeline as create_website_from_upload).
Same upload sequence as create_website_from_upload — omit storage_key to keep the current HTML and only rename via title.
Parameters
Supply at least one of
storage_key or title — a call with neither is rejected.
Returns
published_url is null when publish=false — the live URL keeps serving the previously-published version until the user republishes from the editor.