Tools Reference
Complete reference for all Moda MCP tools — parameters, return types, and usage examples.
The Moda MCP server provides seventeen tools for working with canvas designs. These tools are called automatically by your AI coding agent when it needs design data or wants to create and manage designs.
| Tool | Description | Auth required |
|---|---|---|
set_context | Set your active organization and team | Yes |
get_context | Show your current session context | Yes |
get_moda_design | Fetch semantic pseudo-HTML and design tokens | Public links: No |
get_moda_design_tokens | Extract design tokens only | Public links: No |
list_moda_pages | List pages with dimensions and node counts | Public links: No |
export_design | Export as PNG, JPEG, PDF, or PPTX | Public links: No |
list_my_canvases | Browse your canvases | Yes |
search_canvases | Search canvases by name | Yes |
list_organizations | List your orgs and teams | Yes |
list_brand_kits | List brand kits for a team | Yes |
create_brand_kit | Create brand kit from website URL | Yes |
update_brand_kit | Update brand kit colors, fonts, etc. | Yes |
upload_file | Upload a file from URL for attachments | Yes |
start_design_task | Start an AI design task | Yes |
get_job_status | Get job status and progress | Yes |
list_jobs | List recent design jobs | Yes |
remix_design | Duplicate canvas + optional AI edits | Yes |
Session context
When you first connect, Moda uses your default organization and team. If you belong to multiple organizations, you can switch with set_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.
Your context persists for 24 hours across reconnections. Tools like 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 a url parameter support these formats:
| Format | Example |
|---|---|
| Share link | https://moda.app/s/abc123-token |
| Private canvas URL | https://moda.app/canvas/550e8400-e29b-41d4-a716-446655440000 |
| Raw share token | abc123-token |
| Legacy domain | https://app.moda.so/s/abc123-token |
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
| Parameter | Type | Required | Description |
|---|---|---|---|
org_name | string | Yes | Name of the organization to use (case-insensitive). Use list_organizations to see options. |
team_name | string | No | Name of the team within the org (case-insensitive). Defaults to the org's default team. |
Returns
A confirmation string:
Context set to organization 'Acme Corp' and team 'Design Team'. All subsequent operations will use this workspace.Example usage
# Set org (uses default team)
set_context(org_name="Acme Corp")
# Set org and specific team
set_context(org_name="Acme Corp", team_name="Marketing")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:
Organization: Acme Corp | Team: Design TeamIf no context is set:
No session context set. Call set_context to choose your organization and team.get_moda_design
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
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Moda share URL (https://moda.app/s/...), private canvas URL (https://moda.app/canvas/...), or raw share token |
page_number | integer | null | No | 1-indexed page number. Omit to get all pages. |
Returns
A string containing semantic pseudo-HTML with CSS properties, followed by a design tokens summary.
# Moda Design Export — Canvas Title # Source: https://moda.app/s/abc123 ## Page: Login Screen (1440x900) [page 1]
<section
background="#f3f4f6"
height="900px"
width="1440px"
display="flex"
justify-content="center"
align-items="center"
>
<Card background="#ffffff" border-radius="16px" width="600px" display="flex" flex-direction="column" gap="20px">
<Heading font-size="32px" font-weight="700" color="#111827">Welcome back</Heading>
<Text font-size="14px" color="#6b7280"> Sign in to your account</Text>
<TextInput border="1px solid #d1d5db" border-radius="8px" height="48px" width="520px" />
<button background="#2563eb" border-radius="8px" height="48px" width="520px">Sign in</button>
</Card>
</section>
## Design Tokens - Colors: #111827, #2563eb, #6b7280, #d1d5db, #f3f4f6, #ffffff - Font Inter: weights [400, 700] roles
[body, heading] - Corner radii: 8px, 16pxSemantic tags
The transformer assigns semantic tag names based on visual properties and layer names:
| Tag | When used |
|---|---|
Heading | Text with font-size >= 24px or font-weight >= 600 |
Text | Default text elements |
Button | Rectangle with text, dark fill, and button-like dimensions |
TextInput | Rectangle with light fill, thin border, no text |
Image | Element with an image fill |
Avatar | Small circular element with an image fill |
Card | Group with a background rectangle and content |
Row | Container with flex-direction: row |
Column | Container with flex-direction: column |
Divider | Line element |
Nav, Hero, Footer | Matched from layer names |
Layer names in Moda take priority over visual heuristics. See Naming Layers for best practices.
Example usage
# Fetch all pages
get_moda_design(url="https://moda.app/s/abc123")
# Fetch a specific page
get_moda_design(url="https://moda.app/s/abc123", page_number=2)
# Fetch a private canvas (requires authentication)
get_moda_design(url="https://moda.app/canvas/550e8400-e29b-41d4-a716-446655440000")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_design_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
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Moda share URL, private canvas URL, or raw share token |
page_number | integer | null | No | 1-indexed page number. Omit for all pages. |
Returns
{
"variables": {
"primary": "#2563eb",
"secondary": "#6b7280",
"background": "#f3f4f6"
},
"colors": ["#111827", "#2563eb", "#6b7280", "#d1d5db", "#f3f4f6", "#ffffff"],
"fonts": [
{
"family": "Inter",
"weights": [400, 700],
"roles": ["body", "heading"]
}
],
"radii": ["8px", "16px"],
"dimensions": {
"width": 1440,
"height": 900
}
}| Field | Type | Description |
|---|---|---|
variables | object | Named design variables defined in the canvas (colors, numbers, strings) |
colors | string[] | All unique colors used in the canvas |
fonts | object[] | Font families with weights and inferred roles |
radii | string[] | All unique corner radii used |
dimensions | object | Canvas page dimensions (width and height) |
Example usage
# Extract tokens for theme generation
get_moda_design_tokens(url="https://moda.app/s/abc123")
# Extract tokens from a specific page
get_moda_design_tokens(url="https://moda.app/s/abc123", page_number=1)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_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
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Moda share URL, private canvas URL, or raw share token |
Returns
{
"canvas_name": "Marketing Website",
"total_pages": 3,
"pages": [
{
"page_number": 1,
"name": "Hero Section",
"width": 1440,
"height": 900,
"node_count": 12
},
{
"page_number": 2,
"name": "Features",
"width": 1440,
"height": 1200,
"node_count": 24
}
]
}| Field | Type | Description |
|---|---|---|
canvas_name | string | Name of the canvas |
total_pages | integer | Total number of pages |
pages[].page_number | integer | 1-indexed page number |
pages[].name | string | Page name as set in Moda |
pages[].width | number | Page width in pixels |
pages[].height | number | Page height in pixels |
pages[].node_count | integer | Number of design elements on the page |
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_design
Export a Moda canvas as an image or document file. Pass exactly one of canvas_id or url.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
canvas_id | string | No | — | Canvas UUID to export directly. Preferred after start_design_task returns a new canvas. |
url | string | No | — | Moda share URL, private canvas URL, or raw share token. Use this for share-link or design-to-code workflows. |
format | string | No | "png" | Export format: png, jpeg, pdf, or pptx |
page_number | integer | null | No | null | 1-indexed page number. For image formats, defaults to page 1. For documents, exports all pages. |
Format guide
| Format | Best for |
|---|---|
png | Design-to-code workflows — lossless image, ideal for visual reference |
jpeg | Smaller file size when lossless quality isn't needed |
pdf | Multi-page documents, printing, sharing |
pptx | PowerPoint presentations, slide decks |
Returns
On success:
{
"status": "completed",
"url": "https://storage.googleapis.com/bucket/exports/abc123.png",
"format": "png"
}If a design job is still active for the target canvas:
{
"status": "not_ready",
"reason": "active_design_job",
"retry_after_seconds": 3,
"canvas_id": "550e8400-e29b-41d4-a716-446655440000",
"canvas_url": "https://moda.app/canvas/550e8400-e29b-41d4-a716-446655440000",
"job_id": "990e8400-e29b-41d4-a716-446655440000"
}canvas_id, canvas_url, and job_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.
| Field | Type | Description |
|---|---|---|
status | string | "completed" on success, or "not_ready" for retryable export attempts |
url | string | Signed URL to the exported file (success only) |
format | string | The format that was used for the export (success only) |
reason | string | Retryable not-ready reason: active_design_job or job_status_unavailable |
retry_after_seconds | integer | Suggested delay before retrying when status is "not_ready" |
canvas_id | string | Canvas UUID for the export target (private exports only) |
canvas_url | string | Direct Moda link to the canvas (private exports only) |
job_id | string | Active design job ID (private exports only) |
Example usage
Provide exactly one of canvas_id or url per call:
# Export as PNG for design-to-code (default)
export_design(url="https://moda.app/s/abc123")
# Export directly from a canvas_id returned by start_design_task
export_design(canvas_id="550e8400-e29b-41d4-a716-446655440000", format="pdf")
# Export a specific page as JPEG
export_design(url="https://moda.app/s/abc123", format="jpeg", page_number=2)
# Export all pages as a PDF
export_design(url="https://moda.app/s/abc123", format="pdf")
# Export as a PowerPoint file
export_design(url="https://moda.app/s/abc123", format="pptx")Notes
- Pass exactly one of
canvas_idorurl - For design-generation workflows, prefer
canvas_idfromstart_design_task/get_job_status - Export-before-ready and temporary readiness-check failures are normal retryable MCP states, not tool failures
- The signed URL expires after 7 days
- For image formats (
png,jpeg), only a single page is exported (defaults to page 1) - For document formats (
pdf,pptx), all pages are included by default unlesspage_numberis specified - Screenshots are rendered server-side using a headless browser
list_my_canvases
Returns a paginated list of canvases accessible to the authenticated user. Use this to browse available canvases when you don't have a specific 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit | integer | No | 20 | Number of canvases to return (max 100) |
offset | integer | No | 0 | Number of canvases to skip for pagination |
Returns
{
"canvases": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Marketing Website",
"url": "https://moda.app/canvas/550e8400-e29b-41d4-a716-446655440000",
"updated_at": "2025-03-15T10:30:00Z"
}
],
"total": 42,
"limit": 20,
"offset": 0
}| Field | Type | Description |
|---|---|---|
canvases[].id | string | Canvas UUID |
canvases[].name | string | Canvas name |
canvases[].url | string | Direct canvas URL |
canvases[].updated_at | string | Last update timestamp (ISO 8601) |
total | integer | Total number of canvases |
limit | integer | Page size |
offset | integer | Current offset |
Notes
- Canvases are returned in order of most recently updated
- The
urlfield can be passed directly to other tools likeget_moda_design - The maximum
limitis 100 per request
search_canvases
Searches your canvases by name or content and returns matching results. Use this when you know what you're looking for but 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | — | Search query to match against canvas names and content |
limit | integer | No | 20 | Maximum number of results to return (max 100) |
Returns
[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Marketing Website v2",
"url": "https://moda.app/canvas/550e8400-e29b-41d4-a716-446655440000"
}
]| Field | Type | Description |
|---|---|---|
[].id | string | Canvas UUID |
[].name | string | Canvas name |
[].url | string | Direct canvas URL |
Notes
- The search matches against canvas names and content
- Results are ranked by relevance
- The returned
urlcan be passed directly to other tools likeget_moda_design - 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 call set_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
[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Acme Corp",
"role": "admin",
"teams": [
{
"id": "660e8400-e29b-41d4-a716-446655440000",
"name": "Design Team",
"is_default": true
},
{
"id": "770e8400-e29b-41d4-a716-446655440000",
"name": "Marketing",
"is_default": false
}
]
}
]| Field | Type | Description |
|---|---|---|
[].id | string | Organization UUID |
[].name | string | Organization name |
[].role | string | Your role in the organization (admin or member) |
[].teams | array | Teams you have access to within this org |
[].teams[].id | string | Team UUID |
[].teams[].name | string | Team name |
[].teams[].is_default | boolean | Whether this is the org's default team |
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
list_brand_kits
Returns brand kits for a team. Brand kits contain colors, fonts, logos, and brand guidelines that were extracted from company websites. 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
| Parameter | Type | Required | Description |
|---|---|---|---|
org_id | string | No | Organization UUID. Overrides session context for this call. |
team_id | string | No | Team UUID. Overrides session context for this call. |
If neither is provided, uses your session context or defaults to your primary workspace.
Returns
{
"brand_kits": [
{
"id": "880e8400-e29b-41d4-a716-446655440000",
"title": "Acme Corp",
"is_default": true,
"created_at": "2025-03-15T10:30:00",
"updated_at": "2025-03-16T14:20:00",
"company_name": "Acme Corp",
"company_url": "https://acme.com",
"company_description": "Modern design tools for teams",
"tagline": "Design at scale",
"brand_values": ["innovation", "simplicity"],
"brand_aesthetic": ["modern", "minimal"],
"brand_tone_of_voice": ["professional", "friendly"],
"colors": [
{ "color": "#2563eb", "label": "Primary" },
{ "color": "#111827", "label": "Text" }
],
"fonts": [{ "family": "Inter", "label": "Body", "weight": 400, "supported": true }],
"logos": [
{
"group_name": "Primary Logo",
"images": [{ "name": "logo-dark.svg", "url": "https://..." }]
}
]
}
],
"team_id": "660e8400-e29b-41d4-a716-446655440000"
}Notes
- Uses your session context to determine the workspace. Call
set_contextto switch organizations or teams. - Brand kits are sorted by creation date (most recent first)
- The
is_defaultbrand kit is automatically used bystart_design_taskwhen nobrand_kit_idis specified
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 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
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Website URL or domain (e.g., stripe.com or https://stripe.com) |
org_id | string | No | Organization UUID. Overrides session context for this call. |
team_id | string | No | Team UUID. Overrides session context for this call. |
Returns
Returns the created brand kit in the same format as list_brand_kits entries.
{
"id": "880e8400-e29b-41d4-a716-446655440000",
"title": "Stripe",
"is_default": false,
"company_name": "Stripe",
"company_url": "https://stripe.com",
"company_description": "Financial infrastructure for the internet",
"colors": [
{ "color": "#635bff", "label": "Primary" },
{ "color": "#0a2540", "label": "Dark" }
],
"fonts": [{ "family": "Inter", "label": "Body", "weight": 400, "supported": true }],
"logos": []
}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
| Parameter | Type | Required | Description |
|---|---|---|---|
brand_kit_id | string | Yes | ID of the brand kit to update |
title | string | No | Display title for the brand kit |
colors | array | No | Array of { color, label } objects (replaces all colors) |
fonts | array | No | Array of { family, label, weight } objects |
company_name | string | No | Company name |
company_description | string | No | Company description |
tagline | string | No | Brand tagline |
brand_values | string[] | No | List of brand values |
brand_aesthetic | string[] | No | List of aesthetic descriptors |
brand_tone_of_voice | string[] | No | List of tone descriptors |
Returns
Returns the updated brand kit in the same format as list_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
upload_file
Uploads a file from a URL to Moda's storage. Returns a stable proxy URL that can be used as an attachment in start_design_task. Supports images, PDFs, and PPTX files.
This tool requires authentication via the remote MCP server at mcp.moda.app. It is not
available when using the local stdio server.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
source_url | string | Yes | Public URL of the file to download and store |
filename | string | No | Filename to use. Inferred from URL if omitted. |
org_id | string | No | Organization UUID. Overrides session context for this call. |
team_id | string | No | Team UUID. Overrides session context for this call. |
Returns
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://api.moda.app/api/v2/images/ref/550e8400-e29b-41d4-a716-446655440000?h=abc123",
"filename": "design-reference.png",
"mime_type": "image/png",
"size_bytes": 245760,
"was_duplicate": false,
"message": "File uploaded successfully. Use the 'url' field as an attachment URL in start_design_task."
}| Field | Type | Description |
|---|---|---|
id | string | Unique file identifier (UUID) |
url | string | Stable proxy URL for the uploaded file |
filename | string | Filename of the uploaded file |
mime_type | string | MIME type of the file |
size_bytes | integer | File size in bytes |
was_duplicate | boolean | True if an identical file already existed |
message | string | Human-readable confirmation message |
Example usage
# Upload an image for use as a design reference
upload_file(source_url="https://example.com/mockup.png")
# Upload with a custom filename
upload_file(source_url="https://example.com/file.pdf", filename="brand-guidelines.pdf")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, and PPTX files
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 a canvas_id to edit an existing canvas, or omit it to create a new one. In MCP this tool is always asynchronous: it returns quickly with a job handle, then you poll get_job_status. 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
prompt | string | Yes | — | Design instructions for the AI agent |
canvas_id | string | No | — | Canvas to edit. Omit to create a new canvas. Ignored when resuming a conversation. |
canvas_name | string | No | — | Name for the new canvas (only used when canvas_id is omitted) |
brand_kit_id | string | No | — | Brand kit to apply. Defaults to the team's default brand kit. |
org_id | string | No | — | Organization UUID. Overrides session context for this call. |
team_id | string | No | — | Team UUID. Overrides session context for this call. |
conversation_id | string | No | — | UUID of a previous conversation to resume. The agent will have full context of all prior interactions. Returned in every response — pass it back to continue. |
attachments | array | No | — | List of reference files. Each item is an object with url (required), name (optional), and type ("image", "pdf", "pptx", or "url"). |
reference_canvas_ids | string[] | No | — | List of canvas UUIDs to use as design inspiration. The agent can see these designs and reference their style, layout, or content. |
format_category | string | No | — | Format category — recommended for new designs. "slides" for presentations, "pdf" for documents/reports, "social" for social media posts, "diagram" for flowcharts/diagrams, "ui" for UI mockups, or "other". Without this, the agent may default to an incorrect format. |
format_width | integer | No | — | Canvas width in pixels. Common: 1920x1080 (slides), 1080x1080 (social square), 1080x1920 (social story). |
format_height | integer | No | — | Canvas height in pixels. |
model_tier | string | No | — | AI model tier: "pro_max" (most capable), "pro", "standard", or "lite" (fastest). Defaults to automatic selection. |
Returns
{
"job_id": "990e8400-e29b-41d4-a716-446655440000",
"canvas_id": "550e8400-e29b-41d4-a716-446655440000",
"canvas_url": "https://moda.app/canvas/550e8400-e29b-41d4-a716-446655440000",
"conversation_id": "bb0e8400-e29b-41d4-a716-446655440000",
"status": "queued",
"message": "Design task started. Use get_job_status to check progress.",
"retry_after_seconds": 3
}Example usage
# Create a new design (returns a conversation_id)
start_design_task(prompt="Create a modern SaaS landing page with a hero section, features grid, and pricing table")
# Resume the conversation to make changes (agent remembers previous context)
start_design_task(prompt="Change the color scheme to use blues and grays", conversation_id="bb0e8400...")
# Edit an existing canvas
start_design_task(prompt="Add a footer section", canvas_id="550e8400...")
# Create slides with specific dimensions
start_design_task(prompt="Create a pitch deck", format_category="slides", format_width=1920, format_height=1080)
# Create a PDF document (report, resume, etc.)
start_design_task(prompt="Create a project report", format_category="pdf")
# Provide reference images as attachments
start_design_task(
prompt="Recreate this design in our brand style",
attachments=[{"url": "https://example.com/reference.png", "type": "image"}],
brand_kit_id="880e8400..."
)
# Use existing canvases as design inspiration
start_design_task(
prompt="Create a similar landing page",
reference_canvas_ids=["550e8400...", "660e8400..."]
)
# Canonical MCP flow: start -> poll -> export
job = start_design_task(prompt="Create a sales deck", format_category="slides")
status = get_job_status(job_id=job["job_id"])
while not status["can_export"] and not status["is_terminal"]:
# Wait status["retry_after_seconds"] seconds, then poll again.
status = get_job_status(job_id=job["job_id"])
if status["can_export"]:
export_design(canvas_id=job["canvas_id"], format="pptx")Notes
- This tool is always async in MCP. It returns a job handle immediately.
- Use
retry_after_secondsas the default delay before the firstget_job_status(job_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 returned URL in theattachmentsarray - 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, the agent may default to slides regardless of what the user asked for
get_job_status
Returns the status and progress of a specific design job. Use this to check on jobs started with start_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
| Parameter | Type | Required | Description |
|---|---|---|---|
job_id | string | Yes | ID of the job to check |
Returns
{
"job_id": "990e8400-e29b-41d4-a716-446655440000",
"canvas_id": "550e8400-e29b-41d4-a716-446655440000",
"canvas_url": "https://moda.app/canvas/550e8400-e29b-41d4-a716-446655440000",
"conversation_id": "bb0e8400-e29b-41d4-a716-446655440000",
"status": "running",
"task": "Create a modern SaaS landing page...",
"progress_percent": 45,
"current_step": "Generating hero section",
"is_terminal": false,
"can_export": false,
"retry_after_seconds": 3,
"operations_streamed": 12,
"created_at": "2025-03-15T10:30:00",
"started_at": "2025-03-15T10:30:02",
"completed_at": null,
"error": null
}| Field | Type | Description |
|---|---|---|
job_id | string | Job UUID |
canvas_id | string | Canvas being edited |
canvas_url | string | Direct link to the canvas |
conversation_id | string | Conversation UUID. Pass to start_design_task to resume the conversation. |
status | string | queued, running, completed, failed, or cancelled |
task | string | The original prompt (truncated to 200 characters) |
progress_percent | integer | Estimated progress (0-100), if available |
current_step | string | Description of what the agent is currently doing |
is_terminal | boolean | true when the job is finished and polling can stop |
can_export | boolean | true when the job completed successfully and export_design can be called |
retry_after_seconds | integer | Suggested delay before polling again when the job is still in progress |
operations_streamed | integer | Number of canvas operations applied so far |
created_at | string | Job creation timestamp (ISO 8601) |
started_at | string | When the agent started working (ISO 8601) |
completed_at | string | When the job finished (ISO 8601), or null |
error | string | Error message if the job failed, or null |
Notes
- Use this after
start_design_taskto poll for progress - Poll again after
retry_after_secondswhileis_terminal == false - Call
export_design(canvas_id=..., format=...)oncecan_export == true - Failed or cancelled jobs are terminal, but they do not set
can_export - The
taskfield is truncated to 200 characters for readability
list_jobs
Returns a list of recent design jobs. 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
canvas_id | string | No | — | Filter jobs to a specific canvas |
status | string | No | — | Filter by status (queued, running, completed, failed) |
limit | integer | No | 10 | Number of jobs to return (max 50) |
Returns
{
"jobs": [
{
"job_id": "990e8400-e29b-41d4-a716-446655440000",
"canvas_id": "550e8400-e29b-41d4-a716-446655440000",
"canvas_url": "https://moda.app/canvas/550e8400-e29b-41d4-a716-446655440000",
"conversation_id": "bb0e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"task": "Create a modern SaaS landing page...",
"progress_percent": 100,
"current_step": null,
"operations_streamed": 42,
"created_at": "2025-03-15T10:30:00",
"started_at": "2025-03-15T10:30:02",
"completed_at": "2025-03-15T10:32:15",
"error": null
}
]
}Notes
- Jobs are returned in order of most recently created
- The maximum
limitis 50 per request - Only jobs 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 job handle immediately — poll get_job_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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
canvas_id | string | Yes | — | Canvas to duplicate |
prompt | string | No | — | Design instructions to apply to the copy. Omit for a plain duplicate. |
new_name | string | No | — | Name for the new canvas. Defaults to "<original name> (Remix)". |
brand_kit_id | string | No | — | Brand kit to apply (only used when prompt is provided) |
org_id | string | No | — | Organization UUID. Overrides session context for this call. |
team_id | string | No | — | Team UUID. Overrides session context for this call. |
Returns
Without a prompt (plain duplicate):
{
"canvas_id": "aa0e8400-e29b-41d4-a716-446655440000",
"canvas_url": "https://moda.app/canvas/aa0e8400-e29b-41d4-a716-446655440000",
"canvas_name": "Marketing Website (Remix)",
"source_canvas_id": "550e8400-e29b-41d4-a716-446655440000",
"message": "Canvas duplicated successfully."
}With a prompt (duplicate + design task):
{
"canvas_id": "aa0e8400-e29b-41d4-a716-446655440000",
"canvas_url": "https://moda.app/canvas/aa0e8400-e29b-41d4-a716-446655440000",
"canvas_name": "Marketing Website (Remix)",
"source_canvas_id": "550e8400-e29b-41d4-a716-446655440000",
"job_id": "990e8400-e29b-41d4-a716-446655440000",
"job_status": "queued",
"message": "Design task started. Use get_job_status to check progress.",
"retry_after_seconds": 3
}Example usage
# Plain duplicate
remix_design(canvas_id="550e8400...")
# Duplicate and restyle
remix_design(canvas_id="550e8400...", prompt="Change the color scheme to dark mode")
# Duplicate with new branding
remix_design(canvas_id="550e8400...", prompt="Apply our new brand", brand_kit_id="880e8400...")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 job handle - Poll
get_job_status(job_id)untilcan_export == trueor the job reaches a terminal failure state, same asstart_design_task