MCP Server

Beta

Connect Claude, ChatGPT, and other AI tools to Slides so they can find, create, edit, and share your presentations. Most tools connect in a minute, with no API key required. You need an active Slides subscription.

  1. Copy the Slides server URL.

    https://mcp.slides.com/
  2. Add it as a remote MCP server in your AI tool. Some tools call this a custom connector or app.

  3. Sign in to Slides when prompted, choose Full access or Read-only, and click Allow access.

For step-by-step instructions for Claude, ChatGPT, Claude Code, Codex, and Cursor, see Connect Slides to Claude, ChatGPT, and other AI tools. Review and disconnect tools in Connected apps.

Connect with an API key

For tools that can't sign in with OAuth, create an API key and send it as an Authorization: Bearer header. Choose Full access if the tool should make changes. Tools that only launch local MCP processes can use a bridge such as mcp-remote:

API key configuration

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

Tools

The server exposes the core deck operations as named tools, plus an authoring guide, batch slide retrieval, slide screenshots, and an interactive deck library and presentation viewer for clients that support MCP Apps. Call get_authoring_guide before creating or editing slide HTML.

Tool

get_authoring_guide

Call before creating or editing slide HTML to get supported content blocks, slide attributes, canvas sizing, themes, and examples.

Inputs

No request parameters.

Returns

The complete authoring guide as Markdown text in the tool response.

Tool

browse_decks

Open an interactive library to browse and preview your owned decks. Available with Read-only or Full access.

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.

q
String Optional

Text matched against deck titles, descriptions, and slide HTML; defaults to an empty search.

sort
String Optional

Ordering: updated_desc (default), created_desc, or title_asc. Allowed values: created_desc, updated_desc, title_asc.

MCP Apps

Linked to ui://slides/deck-library.html. Use browse_decks for the interactive library, view_deck for a specific deck, or list_decks for deck summaries without an app.

Example Arguments

{
  "q": "roadmap",
  "sort": "updated_desc"
}

Returns

Structured content containing decks (id, title, thumbnail_url, updated_at, url), pagination, and effective search/sort filters.

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. Supported hosts show an interactive preview that stays in sync with deck changes while live updates are connected. Reuse the open preview after edits.

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

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

create_deck

Requires Full access

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 on creation. 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). Read get_authoring_guide before writing slide HTML. Content outside .sl-block elements is wrapped in a text block that fills the slide. Preserve existing .sl-block elements and their data-block-id values. Each .sl-block needs a supported data-block-type and exactly one direct child 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

Requires Full access

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 on creation. 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

Requires Full access

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

Requires Full access

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 120 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

Requires Full access

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. Read get_authoring_guide before writing slide HTML. Content outside .sl-block elements is wrapped in a text block that fills the slide. Preserve existing .sl-block elements and their data-block-id values. Each .sl-block needs a supported data-block-type and exactly one direct child 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

Requires Full access

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. Read get_authoring_guide before writing slide HTML. Content outside .sl-block elements is wrapped in a text block that fills the slide. Preserve existing .sl-block elements and their data-block-id values. Each .sl-block needs a supported data-block-type and exactly one direct child 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

Requires Full access

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

Requires Full access

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 Requires Full access

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 Requires Full access

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

Requires Full access

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.