Deck Operations
Your AI assistant uses these tools to create, find, and manage your presentations. You don't call them directly — just tell your assistant what you need and it handles the rest.
When you connect an AI assistant to Rideful via MCP, it gets access to tools for managing your presentations. A deck is a presentation containing ordered slides. Every deck has a name, an aspect ratio (which determines the canvas size), and optionally a theme with colors and fonts.
This page documents the four deck-level tools your AI assistant uses behind the scenes. Understanding them helps you give better instructions and troubleshoot when something doesn't look right.
Finding Your Presentations
When you ask your AI assistant to “open my Q4 deck” or “show me my presentations,” it uses deck_list to search your decks by name, see how many slides each has, and when they were last updated. This is a read-only operation. It lists the decks you own and the decks others have shared with you.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | number | No | Maximum decks to return (1–100, default 20) |
offset | number | No | Number of decks to skip for pagination (default 0) |
name | string | No | Filter by name (case-insensitive partial match) |
folderId | string | No | Filter to your own decks in this folder. Use folder_list to get folder IDs. Shared decks are never in a folder |
What It Returns
total— total number of matching decksdecks— array of deck summaries (id, name, slideCount, updatedAt, role; folderId and folderName on decks you own)hasMore— whether more results are available beyond the current page
role is owner for your own decks, editor for a shared deck your assistant can change, and viewer for a shared deck it can only read — every write tool on a viewer deck is refused with an access-denied (403) error. Sharing itself is managed in the app, not over MCP.
Example
deck_list({ limit: 10 })
// Response:
// {
// total: 3,
// hasMore: false,
// decks: [
// { id: "deck_abc123", name: "Q4 Business Review",
// slideCount: 8, updatedAt: 1706000000000 },
// { id: "deck_def456", name: "Product Launch",
// slideCount: 12, updatedAt: 1705900000000 },
// { id: "deck_ghi789", name: "Team Standup",
// slideCount: 3, updatedAt: 1705800000000 }
// ]
// }// Filter by name (case-insensitive partial match)
deck_list({ name: "review" })
// Returns only decks with "review" in the nameViewing Deck Details
Before making any changes to a presentation, your AI assistant calls deck_get to understand what it's working with. This returns the canvas size, theme, available layouts, any slide rules to follow, and a summary of every slide and its elements. This is always the first step — it ensures the assistant positions elements correctly and follows your design rules.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
deckId | string | Yes | The ID of the slide deck to retrieve |
What It Returns
A detailed overview of the deck, including:
- Deck info — name, slide count, aspect ratio, last updated
- Origin — whether the deck started blank or came from a template. A blank deck reads theme is yours to choose, so the assistant sets the theme with
deck_update_theme; a template deck names the template and reads theme, master and layouts are the brand's; change them only when the user asks - Theme — heading and body fonts, and every theme color by slot name (
accent1 #2563EB), for the deck master and each other master: whatdeck_update_themeneeds to change one color and keep the rest - Available layouts — layout names and IDs the assistant can use when adding slides
- Slide rules — mandatory content and design rules to follow when working with this deck
- Quick reference — deck ID, canvas size, and a summary of each slide with its elements
Example
deck_get({ deckId: "deck_abc123" })
// Response (formatted markdown):
//
// ## Q4 Business Review
//
// **8 slides** | Aspect: 16:9
// Updated: 2 hours ago
// Origin: blank (Rideful starter) — theme is yours to choose
//
// ### Theme
// - Fonts: Heading: Inter, Body: Inter
// - Colors: dark1 #000000, light1 #FFFFFF, dark2 #1C2833, light2 #F4F6F6, accent1 #2E4053, accent2 #AAB7B8, accent3 …
//
// ### Available Layouts
//
// 1. "Title Slide" (default) — `layout-7Kd2Rm4p`
// Cover slide with centered title and subtitle
//
// 2. "Title and Content" — `layout-Qc9Wb3Xn`
// Standard content with a title and body area
//
// 3. "Blank" — `layout-Ze5Vh8Ta`
// Empty canvas with no placeholders
//
// ### Quick Reference
// - Deck ID: deck_abc123
// - Canvas: 1280 × 720
// - Slides (8):
// 1. slide_001 — Title Slide (3 elements)
// - elem_a text [title]
// - elem_b text [subtitle]
// 2. slide_002 — Title and Content (2 elements)
// ...Creating an Empty Deck
When you need a blank starting point, deck_create creates a new presentation with one empty slide. This is useful when your assistant will build each slide individually with fine-grained control. For most cases, the assistant will use slide_bulk_create (below) instead, which creates a full deck with content in one step.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Name for the new deck (1–200 characters) |
backgroundColor | string | No | Background color for the first slide only, a theme slot such as light1 or a hex (e.g., '#1A1A2E'). Omit it and the slide inherits its layout's background, then the master's. On a blank deck prefer masterBackgroundColor, which every slide inherits. |
backgroundGradient | object | No | Gradient background for the first slide, taking precedence over backgroundColor. Same shape as an element's gradientFill. Picture backgrounds cannot be created over MCP. |
aspectRatio | enum | No | '16:9' (1280×720), '4:3' (1024×768), or '1:1' (1080×1080). Default '16:9'. The deck's actual canvas comes from the starter template for that ratio, so read it back with deck_get |
folderId | string | No | Place the new deck in this folder. Defaults to Shelf if omitted |
themeColors | object | No | Theme palette for the deck — the accents charts and new shapes draw from, and the dark/light pair placeholder text is colored from. All ten base colors are required if provided (accent1–accent6, dark1, dark2, light1, light2). Defaults to the starter's palette |
themeFonts | object | No | { heading, body } font pairing for the deck. Call util_list_fonts first — a family outside the library may not render |
masterBackgroundColor | string | No | Background color for the deck master (hex, e.g., '#0F172A') — inherited by every slide and layout without one of its own. This is the deck-wide background; change it later with deck_update_theme |
What It Returns
id— the new deck's IDname— the deck namecanvas—{ width, height }in pixels
Example
deck_create({
name: "Quarterly Review",
aspectRatio: "16:9",
masterBackgroundColor: "#0F172A", // every slide inherits this
themeFonts: { heading: "Inter", body: "Inter" }
})
// Response:
// {
// id: "deck_abc123",
// name: "Quarterly Review",
// canvas: { width: 1280, height: 720 }
// }Setting the Deck Theme
deck_update_theme is the one deck-level style write: theme colors, theme fonts, and the master background, in a single call. The theme drives the fonts, text color and size every element inherits, chart text color, the editor's color swatches, and the fonts the deck loads. The master background is what every slide and layout inherits, so a deck gets its look from one call rather than from a color repeated on every slide.
Your assistant calls it before building slides on a blank deck. A later call restyles what is already there and cannot be undone: text with no color of its own, table styles, chart series with no color of their own, and every shape, line, icon, image frame, background, text color and chart series that names a theme slot such as accent1 take the new theme at once. Colors stored as a hex keep theirs. On a deck whose deck_get origin names a template, the theme, master, and layouts are the brand's — the assistant changes them only when you ask for that change.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
deckId | string | Yes | The ID of the deck to re-theme |
themeColors | object | No* | Theme palette, the same shape as deck_create's — all ten base colors |
themeFonts | object | No* | { heading, body }. The outgoing pair is swapped out of the deck's font list and the new one in |
masterBackgroundColor | string | null | No* | Master background color, a theme slot or a hex, inherited by every slide and layout without one of its own. Clears any master gradient unless one is passed with it. null removes the master's own color and gradient, so it renders white |
masterBackgroundGradient | object | null | No* | Master background gradient, inherited like the color. Same shape as an element's gradientFill. null removes only the gradient |
* At least one of themeColors, themeFonts, masterBackgroundColor or masterBackgroundGradient must be provided; a call with none of them is rejected.
What It Returns
- The resulting theme — colors and fonts as they now stand, so a colors-only call still reports the fonts it left alone
- The master's effective background — the color or gradient every slide without one of its own now inherits
- The deck's font list — after the swap, so you can see which families the deck loads
- The deck's origin — a re-theme of a template deck says so in the reply
A background image on the master is never touched: clearing the color and the gradient leaves the image owning the background.
Example
deck_update_theme({
deckId: "deck_abc123",
themeColors: {
accent1: "#38BDF8", accent2: "#818CF8", accent3: "#F472B6",
accent4: "#FBBF24", accent5: "#34D399", accent6: "#FB7185",
dark1: "#0F172A", dark2: "#1E293B",
light1: "#F1F5F9", light2: "#CBD5E1"
},
themeFonts: { heading: "Inter", body: "Inter" },
masterBackgroundColor: "#0F172A"
})
// Response:
// Updated deck theme
// - Colors: accent1 #38BDF8, dark1 #0F172A, light1 #F1F5F9
// - Fonts: Heading: Inter, Body: Inter
// - Deck fonts: Inter
// - Master background: #0F172A
//
// Deck ID: deck_abc123
// Existing slides keep the styles already on them; new slides take the theme.
// Hand the master back to white:
deck_update_theme({ deckId: "deck_abc123", masterBackgroundColor: null })Building a Full Presentation
When you say “create a pitch deck” or “make me a 10-slide presentation,” your assistant typically uses slide_bulk_create — the most efficient way to build a presentation. It creates a new deck (or adds to an existing one) with up to 20 slides of content in a single step. Consistency comes from the deck theme — set once with deck_update_theme (or deck_create's theme arguments) before the slides are built. Use masterStyles for the per-role text sizes and families the layout does not give you, then override individual slides as needed.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | No* | Create a new deck with this name (1–200 characters). Mutually exclusive with deckId |
deckId | string | No* | Add slides to this existing deck. Mutually exclusive with name |
aspectRatio | enum | No | '16:9', '4:3', or '1:1'. Only used when creating a new deck. Default '16:9' |
folderId | string | No | Place the new deck in this folder. Only used when creating a new deck (with name). Defaults to Shelf |
masterStyles | object | No | Per-role text style defaults for all slides. Per-slide values override these (see below). Not the deck master — the deck-wide background is deck_update_theme's |
slides | array | Yes | Array of slides to create (1–20 items) |
* Exactly one of name or deckId must be provided.
masterStyles Object
Sets default text styling for all slides in the call. Per-slide values override at the field level — for example, if a slide sets only textColor, it keeps the master's fontSize and fontFamily.
| Property | Type | Description |
|---|---|---|
titleStyle | object | Default style for title placeholders: { textColor, fontSize, fontFamily } |
subtitleStyle | object | Default style for subtitle placeholders: { textColor, fontSize, fontFamily } |
bodyStyle | object | Default style for body placeholders: { textColor, fontSize, fontFamily } |
masterStyles no longer accepts a backgroundColor: the deck-wide background belongs on the master, through deck_update_theme's (or deck_create's) masterBackgroundColor. A call that still sends it is rejected with that message — if your client cached the older tool list, reconnect it to pick up the current schema.
Placeholder color and font come from the deck theme once it is set: a placeholder created on a dark master comes out in the theme's light text color, one on a light master in the dark. Pass a role style only for a size or family the layout does not give you — a literal color written onto the slide is what a later theme change cannot move.
Slide Object Properties
Each item in the slides array can have:
| Property | Type | Description |
|---|---|---|
layoutId | string | Layout ID from deck_get. Omit to use the deck's default layout. An unknown id is rejected with a list of the deck's valid ids |
title | string | Title text. Fills the layout's title placeholder |
subtitle | string | Subtitle text. Fills the layout's subtitle placeholder — any layout that has one, not only title layouts. Reported back as unplaced if the layout has none; it is never written into a body placeholder instead |
body | string | Body text (supports markdown: **bold**, *italic*, - bullets, 1. numbered, <span style="color:#HEX">…</span> for one colored run). Fills the largest body placeholder the layout has — use placeholders to address the others |
placeholders | array | Write text into specific placeholders by id: [{ elementId, text }]. Use this when a layout has more than one placeholder of the same type — title/subtitle/body each fill only one slot and cannot reach the rest. Applied first; the type-matched fields then fill whatever is left. Get ids from layout_list on the deck you are adding slides to — ids read from a template do not carry over to decks created from it |
backgroundColor | string | A background color for this slide alone, a theme slot or a hex. Omit it to inherit the layout's background, then the master's — there is no null here; a slide simply has no background of its own until you give it one |
backgroundGradient | object | Gradient background for this slide, taking precedence over backgroundColor. Same shape as an element's gradientFill. Omit to inherit the layout's gradient |
titleStyle, subtitleStyle, bodyStyle | object | Override styles for this slide. Same shape as masterStyles: { textColor, fontSize, fontFamily } |
What It Returns
deckId,deckName— the deck that was created or appended toisNewDeck— whether a new deck was createdcanvas—{ width, height }in pixelstotalSlideCount— total number of slides in the deck after the operationslides— array of created slides, each withslideId,slideNumber,layoutName, andelementsunassigned— per slide, any content that matched no placeholder, each with thefieldorelementIdit was addressed to and areason. Omitted when everything was placedavailablePlaceholders— the layout's targetable placeholders, attached alongsideunassignedso the ids can be passed straight back inplaceholders. Omitted when the slide was created without a layout
Example — New Deck
slide_bulk_create({
name: "Q4 Business Review",
masterStyles: {
titleStyle: {
textColor: "#1C2833",
fontSize: 40,
fontFamily: "Inter"
},
bodyStyle: {
textColor: "#566573",
fontSize: 16,
fontFamily: "Inter"
}
},
slides: [
{
title: "Q4 Business Review",
subtitle: "January 2026"
},
{
title: "Revenue Highlights",
body: "- Total revenue: $4.2M\n- Growth: +18% QoQ\n- New customers: 340"
},
{
title: "Key Initiatives",
body: "1. Launch enterprise plan\n2. Expand to APAC\n3. Hire 12 engineers",
backgroundColor: "#2E4053"
}
]
})
// Response:
// {
// deckId: "deck_abc123",
// deckName: "Q4 Business Review",
// isNewDeck: true,
// totalSlideCount: 3,
// canvas: { width: 1280, height: 720 },
// slides: [
// { slideId: "slide_001", slideNumber: 1,
// layoutName: "Title Slide", elements: [...] },
// { slideId: "slide_002", slideNumber: 2,
// layoutName: "Title and Content", elements: [...] },
// { slideId: "slide_003", slideNumber: 3,
// layoutName: "Title and Content", elements: [...] }
// ]
// }Example — Add to Existing Deck
// Add slides to an existing deck (use deckId instead of name).
// Layout ids come from deck_get on that deck — omit layoutId for its default.
slide_bulk_create({
deckId: "deck_abc123",
slides: [
{
layoutId: "layout-Qc9Wb3Xn",
title: "Next Steps",
body: "- Finalize roadmap\n- Schedule kickoff\n- Assign owners"
}
]
})Which Approach Will My Assistant Use?
Your AI assistant picks the right tool based on what you ask:
- “Find my Q4 deck” →
deck_listto search by name - “What's in this presentation?” →
deck_getto get the full overview - “Create me a pitch deck about...” →
slide_bulk_createto build all slides at once - “Start a blank presentation” →
deck_createfor an empty starting point - “Add 3 more slides to this deck” →
slide_bulk_createwith the existing deck ID
Related
- Slide Operations — Add, inspect, duplicate, and delete individual slides
- Element Operations — Create and style shapes, text, lines, and images on slides
- Layouts — Where a deck's layouts come from and how to pick one
- Canvas Size — Slide dimensions and the coordinate system
- Create a Presentation with AI — End-to-end guide for building slides with natural language