MCP Server

Beta

Connect MCP-compatible AI tools to Slides to access your decks and account data.

Create and manage API keys from your API key management page.

MCP is available at mcp.slides.com with Bearer authentication. The server exposes the core deck operations as named tools, with MCP-specific batch slide retrieval, slide screenshots, and an inline presentation viewer.

Authentication

Authorization: Bearer YOUR_API_KEY

Server URL

https://mcp.slides.com/

Transport

Streamable HTTP

Remote HTTP clients can connect directly. Clients that only launch local MCP processes can use a bridge such as mcp-remote.

Claude Desktop Example

{
  "mcpServers": {
    "slides": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "https://mcp.slides.com/",
        "--header",
        "Authorization: Bearer YOUR_API_KEY"
      ]
    }
  }
}

Tools

Tool

list_decks

Returns owned deck summaries ordered by newest first.

Inputs

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 20 Optional

Number of records to return per page, up to a maximum of 100. Range: 1–100.

Returns

Deck summaries are returned in data; meta contains page, per_page, and total.

Tool

list_trashed_decks

Returns owned decks in trash, ordered by the time they were trashed.

Inputs

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 20 Optional

Number of records to return per page, up to a maximum of 100. Range: 1–100.

Returns

Deck summaries are returned in data with trashed_at and without url; meta contains page, per_page, and total.

Tool

get_deck

Returns details for an owned deck.

Inputs

id
Integer Required

ID of the deck.

include_deck_html
Boolean Default false Optional

Whether to include deck_html, which contains the HTML for all slides in the deck.

Example JSON Content (include_deck_html=true)

{
  "id": 456,
  "title": "Quarterly Review",
  "description": "Q1 business update",
  "thumbnail_url": "https://...",
  "url": "https://slides.com/alice/q1-review",
  "urls": {
    "default": "https://slides.com/alice/q1-review",
    "fullscreen": "https://slides.com/alice/q1-review/fullscreen",
    "edit": "https://slides.com/alice/q1-review/edit",
    "present": "https://slides.com/alice/q1-review/live"
  },
  "slug": "q1-review",
  "visibility": "self",
  "slide_count": 12,
  "css": ".slides h1 { color: #ff0000; }",
  "width": 1280,
  "height": 720,
  "margin": 0.05,
  "transition": "slide",
  "background_transition": "slide",
  "rtl": false,
  "loop": false,
  "theme_font": "montserrat",
  "theme_color": "white-blue",
  "language": "en",
  "created_at": "2026-03-01T12:00:00Z",
  "updated_at": "2026-03-05T09:00:00Z",
  "deck_html": "<section>...</section>"
}

Returns

Returns deck details. Read speaker notes through the slide APIs. deck_html is present only when include_deck_html is true.

Tool

view_deck

Returns deck metadata and a short-lived MCP App embed URL for an owned deck, optionally opened at a specific slide.

Inputs

id
Integer Required

ID of the deck.

slide_id
String Optional

Optional ID of the slide to open, returned by list_slides. Use the ID, not the slide number.

MCP Apps

Linked to ui://slides/deck-viewer.html so supported hosts can render the presentation inline.

Example Arguments

{
  "id": 456,
  "slide_id": "a1b2c3d4e5f6"
}

Example Structured Content

{
  "id": 456,
  "title": "Quarterly Review",
  "description": "Q1 business update",
  "thumbnail_url": "https://...",
  "url": "https://slides.com/alice/q1-review",
  "urls": {
    "default": "https://slides.com/alice/q1-review",
    "fullscreen": "https://slides.com/alice/q1-review/fullscreen",
    "edit": "https://slides.com/alice/q1-review/edit",
    "present": "https://slides.com/alice/q1-review/live"
  },
  "slug": "q1-review",
  "visibility": "self",
  "slide_count": 12,
  "width": 1280,
  "height": 720,
  "ephemeral_embed_url": "https://mcp.slides.com/decks/456/embed?embed_token=...",
  "ephemeral_embed_url_expires_at": "2030-08-01T09:40:00Z"
}

Returns

Structured content containing deck summary fields, an ephemeral embed URL, and its expiration.

Tool

create_deck

Read-write API key required

Creates a new deck.

Inputs

title
String Default "deck" Optional

Deck title.

description
String Optional

Deck description.

width
Integer Optional

Canvas width in pixels. Defaults to 1280 on creation. Minimum: 1.

height
Integer Optional

Canvas height in pixels. Defaults to 720 on creation. Minimum: 1.

margin
Number Optional

Viewport margin factor from 0 to 1; defaults to 0.05 (5%). Reserves space around the presentation during scaling, not padding inside the slide. Range: 0–1.

theme_color
String Optional

Presentation color preset. Defaults to white-blue on creation. View color presets. Allowed values: white-blue, sand-blue, beige-brown, silver-green, silver-blue, sky-blue, blue-yellow, cobalt-orange, asphalt-orange, forest-yellow, mint-beige, sea-yellow, yellow-black, coral-blue, grey-blue, black-blue, black-mint, black-orange.

theme_font
String Optional

Presentation font preset. Defaults to montserrat on creation. View font presets. Allowed values: montserrat, league, opensans, josefine, palatino, news, helvetica, merriweather, asul, sketch, quicksand, overpass2.

visibility
String Optional

Deck visibility. Team accounts may also use team visibility. Allowed values: all, self, team.

slides
Array Optional

Initial slides in presentation order. Each object accepts html (one <section>, no nested sections) and optional notes (speaker notes, up to 10,000 characters). Prefer custom HTML for new content; content outside .sl-block elements is wrapped in an editable text block sized to fill the slide and aligned left. Use explicit pixel (px) sizes for text and spacing, based on the deck’s width and height. Preserve content blocks retrieved from existing slides as separate .sl-block elements, keeping their data-block-id values. Each .sl-block must have a supported data-block-type and exactly one direct child element with class .sl-block-content or .sl-block-style. Omit html for a blank slide. Omit slides to create one blank slide; an empty array is not accepted.

Example Arguments

{
  "title": "Quarterly Review",
  "description": "Q1 business update",
  "width": 1280,
  "height": 720,
  "theme_color": "white-blue",
  "theme_font": "montserrat",
  "visibility": "self",
  "slides": [
    {
      "html": "<section><h1>Quarterly Review</h1></section>",
      "notes": "Welcome to the Q1 review."
    },
    {
      "html": "<section><h2>Results</h2><p>Revenue increased by 18%.</p></section>"
    }
  ]
}

Returns

Returns deck metadata and slide_ids in presentation order, without HTML, notes, or CSS. Use the get_slides tool to retrieve content. Validation failures return an error.

Tool

update_deck

Read-write API key required

Updates selected fields on an owned deck.

Inputs

id
Integer Required

ID of the deck.

title
String Optional

Deck title.

description
String Optional

Deck description.

width
Integer Optional

Canvas width in pixels. Defaults to 1280 on creation. Minimum: 1.

height
Integer Optional

Canvas height in pixels. Defaults to 720 on creation. Minimum: 1.

margin
Number Optional

Viewport margin factor from 0 to 1; defaults to 0.05 (5%). Reserves space around the presentation during scaling, not padding inside the slide. Range: 0–1.

theme_color
String Optional

Presentation color preset. Defaults to white-blue on creation. View color presets. Allowed values: white-blue, sand-blue, beige-brown, silver-green, silver-blue, sky-blue, blue-yellow, cobalt-orange, asphalt-orange, forest-yellow, mint-beige, sea-yellow, yellow-black, coral-blue, grey-blue, black-blue, black-mint, black-orange.

theme_font
String Optional

Presentation font preset. Defaults to montserrat on creation. View font presets. Allowed values: montserrat, league, opensans, josefine, palatino, news, helvetica, merriweather, asul, sketch, quicksand, overpass2.

visibility
String Optional

Deck visibility. Team accounts may also use team visibility. Allowed values: all, self, team.

Example Arguments

{
  "id": 456,
  "title": "Updated title",
  "theme_font": "quicksand",
  "visibility": "all"
}

Returns

Returns deck metadata without HTML, notes, or CSS. Use get_deck with include_deck_html to retrieve HTML. Read-only keys and validation failures return an error.

Tool

trash_deck

Read-write API key required

Moves an owned deck to trash without permanently deleting it.

Inputs

id
Integer Required

ID of the deck.

Example JSON Content

{
  "id": 456,
  "trashed": true
}

Returns

JSON content confirming the deck ID and trashed state.

Tool

recover_deck

Read-write API key required

Recovers an owned deck from trash.

Inputs

id
Integer Required

ID of the deck.

Example JSON Content

{
  "id": 456,
  "recovered": true
}

Returns

JSON content confirming the deck ID and recovered state.

Tool

list_slides

Returns slide summaries in presentation order without slide HTML or speaker notes. Use the returned IDs to retrieve, edit, move, or remove slides.

Inputs

deck_id
Integer Required

ID of the deck that owns the slides.

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 50 Optional

Number of records to return per page, up to a maximum of 200. Range: 1–200.

Returns

Slide summaries are returned in data; meta contains page, per_page, and total. Position indexes start at 0. Slides in a vertical group share position.horizontal; position.vertical identifies each slide within the group and is null for ungrouped slides.

Tool

get_slides

Returns selected slides in the requested order and reports IDs that were not found.

Inputs

deck_id
Integer Required

ID of the deck that owns the slides.

slide_ids
Array Required

Slide IDs returned by List slides, in the desired response order. Accepts 1–10 unique IDs.

Example Arguments

{
  "deck_id": 456,
  "slide_ids": [
    "a1b2c3d4e5f6",
    "f6e5d4c3b2a1"
  ]
}

Returns

Returns slides with HTML, speaker notes, and position, plus missing_slide_ids for any IDs not found. Position indexes start at 0. If no IDs are found, slides is an empty array.

Tool

get_slide_screenshot

Returns a JPEG screenshot of a slide in a deck you own. Screenshots are returned directly to your MCP client, without a download URL, and are not saved by Slides. Limited to 60 screenshots per user per hour.

Inputs

deck_id
Integer Required

ID of the deck that owns the slides.

slide_id
String Required

ID of the slide, returned by List slides. Use the ID, not the slide number.

Example Arguments

{
  "deck_id": 456,
  "slide_id": "a1b2c3d4e5f6"
}

Returns

Returns a text metadata block and an image/jpeg content block containing base64-encoded image bytes.

Tool

update_slide

Read-write API key required

Replaces one slide’s HTML, notes, or both while preserving its slide ID. Provide at least one of html or notes.

Inputs

deck_id
Integer Required

ID of the deck that owns the slides.

slide_id
String Required

ID of the slide, returned by List slides. Use the ID, not the slide number.

html
String Optional

Complete replacement HTML for one slide, enclosed in one <section> with no nested <section> elements. Prefer custom HTML for new content; content outside .sl-block elements is wrapped in an editable text block sized to fill the slide and aligned left. Use explicit pixel (px) sizes for text and spacing, based on the deck’s width and height. Preserve content blocks retrieved from existing slides as separate .sl-block elements, keeping their data-block-id values. Each .sl-block must have a supported data-block-type and exactly one direct child element with class .sl-block-content or .sl-block-style. Omit to keep the current HTML.

notes
String or null Optional

Speaker notes for the slide. Use null to clear existing notes, or omit to keep them.

Example Arguments

{
  "deck_id": 456,
  "slide_id": "a1b2c3d4e5f6",
  "notes": "Introduce the results."
}

Returns

Returns the slide ID, deck ID, and position without HTML or notes. Use the get_slides tool to retrieve content. Validation failures leave the deck unchanged.

Tool

add_slide

Read-write API key required

Creates a slide and returns its ID. By default, adds it at the horizontal end of the deck. To choose a position, provide insert_before_slide_id or insert_after_slide_id. If that slide is in a vertical group, the new slide joins the same group.

Inputs

deck_id
Integer Required

ID of the deck that owns the slides.

html
String Default "<section></section>" Optional

HTML for one slide, enclosed in one <section> with no nested <section> elements. Prefer custom HTML for new content; content outside .sl-block elements is wrapped in an editable text block sized to fill the slide and aligned left. Use explicit pixel (px) sizes for text and spacing, based on the deck’s width and height. Preserve content blocks retrieved from existing slides as separate .sl-block elements, keeping their data-block-id values. Each .sl-block must have a supported data-block-type and exactly one direct child element with class .sl-block-content or .sl-block-style. Defaults to an empty <section>.

notes
String or null Optional

Optional speaker notes for the new slide.

insert_before_slide_id
String Optional

Insert before this slide. Cannot be combined with insert_after_slide_id.

insert_after_slide_id
String Optional

Insert after this slide. Cannot be combined with insert_before_slide_id.

Example Arguments

{
  "deck_id": 456,
  "html": "<section><h2>Next steps</h2></section>",
  "insert_after_slide_id": "a1b2c3d4e5f6"
}

Returns

Returns the generated slide ID, deck ID, and position without HTML or notes. Use the get_slides tool to retrieve content.

Tool

move_slides

Read-write API key required

Moves slides in the order given in slide_ids. Provide either insert_before_slide_id or insert_after_slide_id, identifying a slide that is not being moved. If that slide is in a vertical group, the moved slides join the same group; otherwise they become horizontal slides.

Inputs

deck_id
Integer Required

ID of the deck that owns the slides.

slide_ids
Array Required

IDs of the slides to change, returned by List slides. Accepts 1–200 unique IDs.

insert_before_slide_id
String Optional

Move the selected slides before this slide. Cannot be combined with insert_after_slide_id.

insert_after_slide_id
String Optional

Move the selected slides after this slide. Cannot be combined with insert_before_slide_id.

Example Arguments

{
  "deck_id": 456,
  "slide_ids": [
    "f6e5d4c3b2a1",
    "a1b2c3d4e5f6"
  ],
  "insert_after_slide_id": "123456abcdef"
}

Returns

Returns count, the number of moved slides. If some requested IDs are not found, the other slides are moved and missing_slide_ids lists the missing IDs. Returns a not-found error if none of the requested slides exist.

Tool

remove_slides

Read-write API key required

Removes slides and their speaker notes. Requests that would remove every slide are rejected. A vertical group with only one remaining slide becomes a horizontal slide.

Inputs

deck_id
Integer Required

ID of the deck that owns the slides.

slide_ids
Array Required

IDs of the slides to change, returned by List slides. Accepts 1–200 unique IDs.

Example Arguments

{
  "deck_id": 456,
  "slide_ids": [
    "f6e5d4c3b2a1",
    "a1b2c3d4e5f6"
  ]
}

Returns

Returns count, the number of removed slides. If some requested IDs are not found, the other slides are removed and missing_slide_ids lists the missing IDs. Returns a not-found error if none of the requested slides exist.

Tool

list_deck_shares

Pro or Team account required

Returns all private share links for an owned deck, ordered newest first.

Inputs

deck_id
Integer Required

ID of the deck.

Returns

Private share links are returned in data; meta contains total. Each link includes default and fullscreen URLs.

Tool

create_deck_share

Pro or Team account required Read-write API key required

Creates a private share link for an owned private or team-visible deck.

Inputs

deck_id
Integer Required

ID of the deck to create a private share link for.

name
String Default "API Link" Optional

Name identifying the private share link.

password
String Optional

Password recipients must enter before viewing the deck through this link.

expires_at
String or null Optional

ISO 8601 timestamp after which the private share link expires.

notify_on_view
Boolean Default false Optional

Whether to notify the deck owner when the deck is first viewed through this link.

Example Arguments

{
  "name": "Customer review",
  "password": "optional-password",
  "expires_at": "2030-08-01T12:00:00Z",
  "notify_on_view": true,
  "deck_id": 456
}

Returns

Returns the new private share link with default and fullscreen URLs. Passwords are never returned. Each deck is limited to 100 private share links.

Tool

revoke_deck_share

Pro or Team account required Read-write API key required

Revokes a private share link for an owned deck.

Inputs

deck_id
Integer Required

ID of the deck.

id
Integer Required

ID of the private share link to revoke.

Example JSON Content

{
  "id": 789,
  "revoked": true
}

Returns

JSON content confirming the private share link ID and revoked state.

Tool

create_deck_export

Read-write API key required

Starts an asynchronous PDF or ZIP export for an owned deck.

Inputs

deck_id
Integer Required

Deck ID to export.

format
String Required

Export format: pdf or zip. Allowed values: pdf, zip.

margin
Number Default 0.0 PDF only Optional

PDF-only page margin between 0 and 0.2. Range: 0–0.2.

slide_number
Boolean Default false PDF only Optional

PDF-only option that includes slide numbers.

slide_notes
Boolean Default false PDF only Optional

PDF-only option that includes speaker notes.

separate_fragments
Boolean Default false PDF only Optional

PDF-only option that prints fragment steps separately.

Rate limit

Export creation is limited to 10 exports per user per hour. Polling uses the standard API rate limit.

Example Arguments

{
  "format": "pdf",
  "margin": 0.05,
  "slide_number": true,
  "slide_notes": false,
  "separate_fragments": false,
  "deck_id": 456
}

Returns

Returns a pending export; meta contains poll_after_seconds.

Tool

get_deck_export

Returns the current state of a PDF or ZIP export for an owned deck.

Inputs

deck_id
Integer Required

Deck ID that owns the export.

id
Integer Required

Export ID to retrieve.

Polling

Pending responses include poll_after_seconds in meta. Poll again after that interval.

Returns

Returns a pending, completed, or failed export. Completed exports include a temporary download URL and its expiration time.

Tool

list_team_decks

Team admin or owner required

Returns team-visible and public decks from the authenticated user’s team.

Inputs

page
Integer Default 1 Optional

Page number to return. Minimum: 1.

per_page
Integer Default 20 Optional

Number of records to return per page, up to a maximum of 100. Range: 1–100.

Returns

Deck summaries are returned in data; meta contains page, per_page, and total. Every summary includes visibility and deck owner identity.

Tool

get_team_deck

Team admin or owner required

Returns a team-visible or public deck.

Inputs

id
Integer Required

ID of the team deck.

include_deck_html
Boolean Default false Optional

Whether to include deck_html, which contains the HTML for all slides in the deck.

Returns

Returns the same fields as get_deck, plus deck owner identity. deck_html is present only when include_deck_html is true.