# Beautiful.ai MCP tools

> Every Beautiful.ai MCP tool on the Cotlet server: tool names, input schemas, a tools/call example and an example result for each tool.

Source: https://cotlet.dev/docs/mcp/beautiful-ai

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

14 tools for Beautiful.ai on the Cotlet MCP server. Your agent picks them from tools/list.

- MCP server: `https://cotlet.dev/mcp/v1`
- Connects with: Your own Beautiful.ai account (email and password, or Google or Microsoft sign-in)
- Integration page: https://cotlet.dev/integrations/beautiful-ai-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `beautiful-ai_list_presentations` | read | Presentations in your library and shared folders, newest first, with folder, slide count and owner. |
| `beautiful-ai_list_folders` | read | Your folders, including shared workspace folders, with the number of decks in each. |
| `beautiful-ai_get_slides` | read | Every slide in order: layout, text, speaker notes and whether it is skipped. |
| `beautiful-ai_get_presentation_analytics` | read | Viewer and slide analytics for a deck, as the app shows them. |
| `beautiful-ai_list_collaborators` | read | People with access to a presentation and whether they can edit or view. |
| `beautiful-ai_update_slide_text` | write | Replace text on one slide, keeping its Smart Slide layout. |
| `beautiful-ai_set_speaker_notes` | write | Write or replace the speaker notes of a slide. |
| `beautiful-ai_skip_slide` | write | Skip or unskip a slide when presenting. |
| `beautiful-ai_duplicate_presentation` | write | Copy any presentation in your library, as the Duplicate menu item does. |
| `beautiful-ai_move_to_folder` | write | Put a presentation in one of your folders. |
| `beautiful-ai_export_presentation` | write | Export the deck and return a download link. |
| `beautiful-ai_invite_collaborator` | write | Invite someone by email to edit or view a presentation. They get an email. |
| `beautiful-ai_remove_collaborator` | write | Revoke a collaborator's access to a presentation. |
| `beautiful-ai_create_share_link` | write | Share the presentation and return a link to it. |

## List presentations

MCP tool: `beautiful-ai_list_presentations`

Access: read.

Returns decks you can open, newest first. Filter by title keyword or folder. Pass presentation_id from each item to the other tools. Pages hold up to 100 decks.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `query` | string | no | Search titles. |
| `folder` | string | no | Only presentations in this folder. |
| `limit` | integer | no | 1 to 100. Default: 25. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_list_presentations",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentations": [
      {
        "presentation_id": "pres_8f3k2m9q",
        "title": "Q3 QBR",
        "folder": "Sales",
        "slides": 18,
        "owner": "You",
        "updated_at": "2026-10-08T14:20:00Z"
      },
      {
        "presentation_id": "pres_2q7w1x5c",
        "title": "Investor update",
        "folder": null,
        "slides": 12,
        "owner": "You",
        "updated_at": "2026-10-05T09:02:00Z"
      }
    ]
  },
  "isError": false
}
```

## List folders

MCP tool: `beautiful-ai_list_folders`

Access: read.

Returns folders by name with deck counts. Use the name as the folder parameter of list_presentations and move_to_folder.

### Parameters

No parameters.

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_list_folders",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "folders": [
      {
        "name": "Sales",
        "presentations": 14,
        "shared": true
      },
      {
        "name": "Board",
        "presentations": 6,
        "shared": false
      }
    ]
  },
  "isError": false
}
```

## Get slides

MCP tool: `beautiful-ai_get_slides`

Access: read.

Returns the slides of one deck in order, starting at 1. Text is listed in reading order per slide. Use it before update_slide_text so your agent sees what is on each slide.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_get_slides",
    "arguments": {
      "presentation_id": "presentation_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_8f3k2m9q",
    "slides": [
      {
        "slide_number": 1,
        "layout": "Title",
        "text": [
          "Q3 QBR",
          "Sales team"
        ],
        "speaker_notes": "",
        "skipped": false
      },
      {
        "slide_number": 4,
        "layout": "Bullets",
        "text": [
          "FY25 targets",
          "Grow ARR 40%",
          "Launch in two new regions"
        ],
        "speaker_notes": "Mention the EU launch date.",
        "skipped": false
      }
    ]
  },
  "isError": false
}
```

## Get presentation analytics

MCP tool: `beautiful-ai_get_presentation_analytics`

Access: read.

Returns the viewer and slide analytics Beautiful.ai shows for one deck. Availability depends on your plan; without it the call fails with an error that names the plan.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_get_presentation_analytics",
    "arguments": {
      "presentation_id": "pres_8f3k2m9q"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_8f3k2m9q",
    "views": 14,
    "unique_viewers": 9,
    "slides": [
      {
        "slide_number": 1,
        "views": 14
      },
      {
        "slide_number": 4,
        "views": 11
      }
    ]
  },
  "isError": false
}
```

## List collaborators

MCP tool: `beautiful-ai_list_collaborators`

Access: read.

Returns each person with access to the deck, with email and permission. Use the email in remove_collaborator.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_list_collaborators",
    "arguments": {
      "presentation_id": "presentation_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_8f3k2m9q",
    "collaborators": [
      {
        "email": "anna@example.com",
        "permission": "can_edit"
      },
      {
        "email": "tom@example.com",
        "permission": "can_view"
      }
    ]
  },
  "isError": false
}
```

## Update slide text

MCP tool: `beautiful-ai_update_slide_text`

Access: write.

Replaces exact text on one slide and keeps its layout. Returns the number of matches replaced and the slide text after the change. It reaches no one and one call undoes it, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |
| `slide_number` | integer | yes | Slide position in the deck, starting at 1. |
| `find` | string | yes | Exact text to replace. |
| `replace` | string | yes | New text. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_update_slide_text",
    "arguments": {
      "presentation_id": "pres_8f3k2m9q",
      "slide_number": 4,
      "find": "FY25 targets",
      "replace": "FY26 targets"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_8f3k2m9q",
    "slide_number": 4,
    "replaced": 1,
    "slide_text": [
      "FY26 targets",
      "Grow ARR 40%",
      "Launch in two new regions"
    ]
  },
  "isError": false
}
```

## Set speaker notes

MCP tool: `beautiful-ai_set_speaker_notes`

Access: write.

Replaces the speaker notes of one slide with the text you send. An empty string clears them. It reaches no one and one call undoes it, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |
| `slide_number` | integer | yes | Slide position in the deck, starting at 1. |
| `notes` | string | yes | Notes text. Empty string clears them. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_set_speaker_notes",
    "arguments": {
      "presentation_id": "pres_2q7w1x5c",
      "slide_number": 2,
      "notes": "Open with the churn drop. Pause for questions before the pricing slide."
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_2q7w1x5c",
    "slide_number": 2,
    "speaker_notes": "Open with the churn drop. Pause for questions before the pricing slide."
  },
  "isError": false
}
```

## Skip slide

MCP tool: `beautiful-ai_skip_slide`

Access: write.

Marks one slide as skipped, so it is left out when presenting, or shows it again. It reaches no one and one call undoes it, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |
| `slide_number` | integer | yes | Slide position in the deck, starting at 1. |
| `skipped` | boolean | yes | true to skip, false to show it again. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_skip_slide",
    "arguments": {
      "presentation_id": "presentation_8c41d2",
      "slide_number": 1,
      "skipped": true
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_2q7w1x5c",
    "slide_number": 7,
    "skipped": true
  },
  "isError": false
}
```

## Duplicate presentation

MCP tool: `beautiful-ai_duplicate_presentation`

Access: write.

Creates a copy of the deck in your library and returns its ID. The copy is private to you until you share it, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |
| `title` | string | no | Title of the copy. Default: same as the original. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_duplicate_presentation",
    "arguments": {
      "presentation_id": "presentation_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_9k4m6b2v",
    "source_id": "pres_5d9a4r1t",
    "title": "Sales review, November",
    "slides": 16
  },
  "isError": false
}
```

## Move to folder

MCP tool: `beautiful-ai_move_to_folder`

Access: write.

Moves a deck into a folder from list_folders. People with access to that folder can then see it. One call moves it back, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |
| `folder` | string | yes | Folder name from list_folders. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_move_to_folder",
    "arguments": {
      "presentation_id": "presentation_8c41d2",
      "folder": "folder"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_9k4m6b2v",
    "folder": "Sales"
  },
  "isError": false
}
```

## Export presentation

MCP tool: `beautiful-ai_export_presentation`

Access: write.

Exports one deck and returns a download link. Formats follow your Beautiful.ai plan. The export changes nothing in the deck and reaches no one, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |
| `format` | enum | yes | pdf or pptx. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_export_presentation",
    "arguments": {
      "presentation_id": "presentation_8c41d2",
      "format": "pdf"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_2q7w1x5c",
    "format": "pdf",
    "download_url": "https://www.beautiful.ai/export/exp_71c0aa.pdf"
  },
  "isError": false
}
```

## Invite collaborator

MCP tool: `beautiful-ai_invite_collaborator`

Access: write. Confirm: waits for the user's OK before it runs.

Gives one person access to the deck and emails them. Permission is can_edit or can_view. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |
| `email` | string | yes | Email of the person to invite. |
| `permission` | enum | yes | can_edit or can_view. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_invite_collaborator",
    "arguments": {
      "presentation_id": "presentation_8c41d2",
      "email": "jane@example.com",
      "permission": "can_edit"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_8f3k2m9q",
    "email": "anna@example.com",
    "permission": "can_edit",
    "status": "invited"
  },
  "isError": false
}
```

## Remove collaborator

MCP tool: `beautiful-ai_remove_collaborator`

Access: write. Confirm: waits for the user's OK before it runs.

Removes one person from the deck. They lose access at once. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |
| `email` | string | yes | Email from list_collaborators. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_remove_collaborator",
    "arguments": {
      "presentation_id": "presentation_8c41d2",
      "email": "jane@example.com"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_8f3k2m9q",
    "email": "tom@example.com",
    "status": "removed"
  },
  "isError": false
}
```

## Create share link

MCP tool: `beautiful-ai_create_share_link`

Access: write. Confirm: waits for the user's OK before it runs.

Makes the deck viewable through a link and returns the link. Anyone who gets the link can open the deck. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `presentation_id` | string | yes | Presentation ID from list_presentations. |
| `name` | string | no | Link name, to tell links apart. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "beautiful-ai_create_share_link",
    "arguments": {
      "presentation_id": "presentation_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "presentation_id": "pres_8f3k2m9q",
    "name": "Investors",
    "url": "https://www.beautiful.ai/player/pres_8f3k2m9q",
    "status": "shared"
  },
  "isError": false
}
```
