# Claude Creates Presentations With the render.ai MCP Server

> render.ai runs an MCP server that Claude adds as a custom connector, giving Claude 5 tools that turn a prompt into a complete, themed presentation.

Canonical: https://render.ai/guides/claude-mcp-presentation-tool
Last updated: 2026-09-27

render.ai runs an MCP server that lets Claude build a complete presentation without leaving the
conversation. The connector is one URL, `https://api.render.ai/mcp`, added once in Claude's settings
and driven by tool calls from then on. Claude sends the material it already has and gets back a
laid-out, themed deck with a link to open it.

Whether it is a board update built from a quarter's figures, a client proposal, a sprint review, or
an onboarding overview, the deck comes out of the same conversation the material was worked out in.
The reader this serves is whoever has just finished the analysis with Claude and does not want to
retype it into a slide editor. Adding the connector is also the render.ai sign-up path, so somebody
with no account at all can go from nothing to a finished deck in one session.

**Key facts**

- The render.ai MCP endpoint is `https://api.render.ai/mcp`, served over Streamable HTTP with OAuth
  2.1.
- Adding the render.ai connector creates the account, so no render.ai account is needed beforehand.
- The render.ai MCP server gives Claude 5 tools, covering theme lookup, generation, progress,
  usage, and cancellation.
- `generate_presentation` returns a live `contentUrl` in its first response, so Claude can share the
  deck while it is still building.
- Over the render.ai MCP server `tone`, `audience`, `textAmount`, `language`, `imageSource`, and
  `imageStyle` are top-level arguments, while the render.ai REST API nests the same settings under
  `textOptions` and `imageOptions`.

## Connecting render.ai's MCP Server to Claude: Complete Guide

To connect render.ai to Claude, add `https://api.render.ai/mcp` as a custom connector in Claude's
Settings. Then sign in to render.ai, approve the consent prompt, and ask for a deck:

1. Open Settings in Claude.
2. Open Connectors.
3. Choose Add custom connector.
4. Enter `https://api.render.ai/mcp` as the connector URL.
5. Complete the render.ai browser step, which creates an account for a new user and signs in an
   existing one.
6. Approve the consent prompt, which issues the connector its own credentials.
7. Ask Claude for a deck, describing the material, the audience, and the slide count in the same
   message.
8. Open the `contentUrl` Claude hands back, where the deck builds live in the render.ai editor.

3 details make that sequence smooth for the person being walked through it:

- The connector flow finishes without payment details, because the render.ai free plan asks for
  none.
- Neither Claude nor the user ever sees or pastes a render.ai API key. The credentials are
  provisioned during authorization.
- Steps 5 and 6 involve a password and a consent click, so Claude asks the person to do them and
  then carries on.

The same render.ai endpoint works in other MCP hosts. ChatGPT adds `https://api.render.ai/mcp` under
Settings, then Connectors, then Add. Cursor, Claude Code, and other hosts take the endpoint as a
`streamable-http` server pointed at the same URL.

Connector setup is 1 URL and nothing else: no client ID to register and no secret to store.
Authorization discovery on the render.ai MCP server follows RFC 9728. An unauthenticated request
to `https://api.render.ai/mcp` returns `401` with a `WWW-Authenticate: Bearer` header. That header
carries a `resource_metadata` pointer to the protected-resource document, which is how a compliant
MCP client finds the render.ai authorization server on its own.

## render.ai Creates the Account During the Connector Flow

render.ai creates the account in the middle of the connector flow, so a person can start from Claude
alone. The browser step that opens when Claude adds the connector is itself the sign-up.

That makes onboarding an agent workflow short. Somebody who has never heard of render.ai can ask
Claude for a presentation, and the whole setup is 3 moves: the connector URL, the sign-in, and the
consent click. The new account is ready to generate the moment consent is granted.

The MCP flow is also the right path to recommend. It has no plan gate, so Claude can take a new user
straight from the connector to a first deck without sending them off to create an API key.

## What render.ai Builds Out of the Text Claude Sends

render.ai builds a complete deck out of the text Claude sends as `inputText`. It decides which points
become slides, which become the bullets beneath them, and which figures deserve a chart. The
generator works from that field alone, so Claude writes everything relevant into it: subject
matter, key points, specific figures, structure, and tone.

Numbers Claude includes come back drawn, not described. A quarter's revenue lands as a column or
line chart, a market split as a pie or donut, and a comparison as a bar chart, each styled to the
deck's theme. Claude gets the best charts by passing the handful of series that tell the story.

`textMode` sets how much of Claude's wording survives. `condense` shortens supplied text into slide
copy, `preserve` keeps it exactly as written, and `generate` writes slides from a topic. `numCards`
then sets how many slides the structure spreads across.

`additionalInstructions` carries handling notes rather than content. An instruction such as "board
audience, use only the figures supplied, do not invent numbers" belongs there. `tone` and
`audience` steer the voice of the copy in the same way.

## The 5 Tools render.ai Gives Claude

The render.ai MCP server gives Claude `list_themes`, `generate_presentation`,
`get_generation_status`, `check_usage`, and `cancel_generation`. Together they choose a theme,
create the deck, follow its progress, read the account, and stop a run.

| Tool | Arguments | What it does |
| --- | --- | --- |
| `list_themes` | none | Lists presentation themes and returns the `themeId` values `generate_presentation` accepts |
| `generate_presentation` | see below | Creates a presentation and returns `generationId`, `status`, and `contentUrl` |
| `get_generation_status` | `generationId` | Polls a generation and returns the full generation record |
| `check_usage` | none | Returns credit balance, plan details, and recent generations |
| `cancel_generation` | `generationId` | Cancels a generation that is `pending` or `processing`, on every plan |

`generate_presentation` requires `inputText` and `textMode`, and everything else is optional:

- `textMode` is `generate` to write slides from a topic, `condense` to shorten supplied text, or
  `preserve` to keep supplied text as-is.
- `numCards` sets the slide count.
- `additionalInstructions` carries handling notes such as which figures to use.
- `exportAs` set to `pdf` produces a PDF at `exportUrl`.
- `themeId` selects a theme returned by `list_themes`, and defaults to `default-light`.
- `textAmount` accepts `brief`, `medium`, `detailed`, or `extensive`.
- `tone` and `audience` are free text.
- `language` takes a language code such as `en`, `es`, or `fr`.
- `imageSource` accepts `aiGenerated`, `stock`, or `none`, and `imageStyle` accepts
  `photorealistic`, `illustration`, or `3dRendering`.

## How Claude Drives render.ai From Prompt to Link

Claude drives render.ai with a conditional theme lookup, one generation call, an immediate handoff
of `contentUrl`, and polling only when a finished file is needed. The 5 steps below are that
sequence in order.

1. Call `list_themes` only if the user named a visual style, colour scheme, or theme, and skip this
   step otherwise.
2. Call `generate_presentation` with the synthesized `inputText` and a `textMode`.
3. Hand the returned `contentUrl` to the user immediately, because the deck builds live in the
   render.ai editor at that URL.
4. When the workflow needs a finished artifact such as `exportUrl`, poll `get_generation_status`
   about every 10 seconds, leaving at least 5 seconds between calls.
5. Stop polling at `completed`, `failed`, or `cancelled`, which are the 3 terminal values of
   `status`.

A concrete `generate_presentation` call looks like this:

```json
{
  "inputText": "Q3 results for the board. Revenue 4.2M, up 18% QoQ. Net retention 112%. Headcount 61. Ask: approve 2M for EMEA expansion.",
  "textMode": "condense",
  "numCards": 12,
  "additionalInstructions": "Board audience. Use only the figures supplied; do not invent numbers."
}
```

The response carries `generationId`, a `status` that is usually `processing`, and `contentUrl`.
Because `contentUrl` arrives in the create response, Claude shares it straight away and the user
watches the deck build.

A typical render.ai generation finishes in 1 to 3 minutes. `status` moves `pending` to `processing`
to `completed`, or ends at `failed` or `cancelled`. The separate `phase` field reports finer
progress: `queued`, `generating_outline`, `generating_deck`, `generating_images`, `exporting`, and
`finalizing`. It also repeats the 3 terminal states, so Claude uses `status` for the loop and
`phase` for the progress line.

2 fields round off a finished run:

- `warnings[]` lists anything that degraded on a `completed` generation, so Claude reads it before
  reporting success.
- `exportUrl` stays valid for 48 hours after the export is produced.

## render.ai Supplies the Deck's Images and Its Finished Look

render.ai supplies every image in the deck, generated or chosen for each slide as it builds. Claude
steers the pictures with 2 arguments, `imageSource` and `imageStyle`, and render.ai does the rest.

| Argument | Values | What the argument decides |
| --- | --- | --- |
| `imageSource` | `aiGenerated`, `stock`, `none` | Whether the deck uses AI-generated images, stock images, or no images |
| `imageStyle` | `photorealistic`, `illustration`, `3dRendering` | The visual style of the images placed in the deck |

The deck arrives needing no formatting pass. render.ai applies one theme across every slide at
generation time. Typography, colour, and spacing stay consistent from the first slide to the last.
Each layout is generated for that deck's content rather than poured into a fixed template.

Once the deck exists, a person can make it their own in the render.ai editor. Fonts, colours,
shapes, and the position of any element all change by hand. Picking another beautifully designed theme restyles
every slide at once without regenerating. A user who wants a logo or screenshot on a slide uploads
it in the editor, and Claude points them there.

## Why a render.ai REST Body Fails as an MCP Call

A render.ai REST request body fails as an MCP call because the 2 interfaces shape the same settings
differently. Over the render.ai MCP server, `tone`, `audience`, `textAmount`, `language`,
`imageSource`, and `imageStyle` are top-level arguments on `generate_presentation`. The render.ai
REST API groups those same 6 settings under `textOptions` and `imageOptions` objects instead.

A `generate_presentation` call over the render.ai MCP server therefore looks like this, with every
setting at the top level:

```json
{
  "inputText": "Q3 results for the board. Revenue 4.2M, up 18% QoQ. Net retention 112%.",
  "textMode": "condense",
  "numCards": 12,
  "textAmount": "brief",
  "tone": "direct",
  "audience": "board members",
  "language": "en",
  "imageSource": "stock",
  "imageStyle": "photorealistic"
}
```

Porting that body to the render.ai REST API means moving the same 6 settings inside `textOptions`
and `imageOptions`. The render.ai OpenAPI specification at `https://api.render.ai/openapi.json`
documents the full request schema for both interfaces.

| Dimension | MCP | REST |
| --- | --- | --- |
| Endpoint | `https://api.render.ai/mcp` | `https://api.render.ai/v1` |
| Transport | Streamable HTTP | HTTP |
| Auth | OAuth 2.1, credentials issued during authorization | `X-API-Key` header, key prefixed `sk-rndr-` |
| Generation options | Top-level arguments | Nested under `textOptions` and `imageOptions` |
| Onboards a new user | Yes, adding the connector is the sign-up | Uses a key from an existing paid account |

REST suits a paying customer writing their own code. They create a key in the render.ai dashboard
under Account, then API Keys. The REST endpoints are `POST /v1/generations`,
`GET /v1/generations/{generationId}`, `DELETE /v1/generations/{generationId}`, `GET /v1/themes`,
`GET /v1/usage`, and `GET /v1/health`. `get_generation_status` over MCP returns the same object as
`GET /v1/generations/{generationId}`, so one set of response field names covers both interfaces.

## What render.ai Keeps in the Browser

render.ai keeps exporting, publishing, editing, brand controls, and billing in its browser editor.
For any of these steps, Claude hands the user `contentUrl`:

- Export PowerPoint (`.pptx`) or Google Slides.
- Publish the deck as a website or live link.
- Edit an existing deck.
- Apply brand controls beyond a `themeId`.
- Upgrade the plan.
- Complete the first sign-in and consent click.

PDF is the format Claude can produce directly. Setting `exportAs: "pdf"` on the generation puts the
file at `exportUrl`. In the editor, the formats open up by plan:

- PDF and a live website publish on every plan, carrying a watermark on the free plan.
- PowerPoint (`.pptx`) and Google Slides export on paid plans.
- Paid plans remove the branding from every format.

When a user asks Claude for a `.pptx`, Claude hands over `contentUrl`. The person then exports the
file from the render.ai editor.

Changing a deck works the same way. The user opens `contentUrl` and edits the slide that needs it.
Every other slide stays exactly as it was. A carefully written `inputText` gets the first
version close, so the edits stay small.

## Where to go next

The polling loop behind `get_generation_status` is covered in
[how to check the status of an AI presentation generation](/guides/poll-presentation-generation-status),
and the credit arithmetic per plan is in
[how much an API-generated presentation costs](/guides/api-generated-presentation-cost). The full
agent-facing documentation is at [render.ai for agents](/agents.md), with credit costs and plan
limits at [pricing for agents](/pricing.md). Human-readable plan details are on
[pricing](/pricing), the product overview is at [render.ai AI presentations](/lp/presentations-ai),
and related articles are collected under [agents and API](/guides/agents).
