> ## Documentation Index
> Fetch the complete documentation index at: https://dev.polltheroom.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tools

> Every tool the MCP server offers, with its arguments. Generated from the server's own tools/list.

<Note>
  This page is generated from the server's `tools/list` at `https://test.polltheroom.com/api/mcp` by `scripts/developers-sync.mjs`. The full input schema of every tool, including every widget, travels with the tool itself.
</Note>

The tools are the API's verbs under the same names. A tool needs the scope its verb needs; a tool that cannot do what was asked answers with a result marked `isError` and a sentence saying what to fix.

### `list_decks`

The decks this key may see: its maker's own plus the team's shared ones. The bin is left out. Needs the "decks:read" scope.

Takes no arguments.

### `create_deck`

This is the verb an agent starts from. Send a whole document, or nothing for a blank deck that opens with the join screen and one empty slide. A deck can be saved half-finished; presenting needs every poll to pass the readiness check. Needs the "decks:write" scope.

| argument   | required | meaning                                                      |
| ---------- | -------- | ------------------------------------------------------------ |
| `title`    | no       | The deck's name                                              |
| `document` | no       | The deck document (see DeckDocument). Omit for a blank deck. |

### `get_deck`

The whole document, the same shape the editor holds. Needs the "decks:read" scope.

| argument | required | meaning       |
| -------- | -------- | ------------- |
| `id`     | yes      | The deck's id |

### `update_deck`

Rename, star, or replace the whole document. A replace, never a merge: send the document as you want it to be. To change one step, use the step verbs instead. Needs the "decks:write" scope.

| argument   | required | meaning                                                                                                                                                            |
| ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id`       | yes      | The deck's id                                                                                                                                                      |
| `title`    | no       | The deck's name                                                                                                                                                    |
| `document` | no       | The whole document, replaced                                                                                                                                       |
| `starred`  | no       |                                                                                                                                                                    |
| `revision` | no       | The deck's revision you read (from get\_deck or the last write). Sent, the write lands only if nobody changed the deck since; left out, it goes through regardless |

### `delete_deck`

Into the bin, the same as the app. Thirty days later it is gone for good. Needs the "decks:write" scope.

| argument | required | meaning       |
| -------- | -------- | ------------- |
| `id`     | yes      | The deck's id |

### `add_step`

Append a slide or a poll step, or insert it before a given index, without resending the document. The join screen is step 0 and there is only one. Needs the "decks:write" scope.

| argument   | required | meaning                                                                                                                                                            |
| ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id`       | yes      | The deck's id                                                                                                                                                      |
| `step`     | yes      | A step, exactly as in the document; ids may be left out                                                                                                            |
| `at`       | no       | Insert before this index. Left out, the step goes at the end                                                                                                       |
| `revision` | no       | The deck's revision you read (from get\_deck or the last write). Sent, the write lands only if nobody changed the deck since; left out, it goes through regardless |

### `replace_step`

Put a new slide or poll step where one is now. Needs the "decks:write" scope.

| argument   | required | meaning                                                                                                                                                            |
| ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id`       | yes      | The deck's id                                                                                                                                                      |
| `index`    | yes      | The step's index. 0 is the join screen and stays put                                                                                                               |
| `step`     | yes      | A step, exactly as in the document; ids may be left out                                                                                                            |
| `revision` | no       | The deck's revision you read (from get\_deck or the last write). Sent, the write lands only if nobody changed the deck since; left out, it goes through regardless |

### `remove_step`

Take a slide or poll step out. The join screen stays. Needs the "decks:write" scope.

| argument   | required | meaning                                                                                                                                                            |
| ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id`       | yes      | The deck's id                                                                                                                                                      |
| `index`    | yes      | The step's index. 0 is the join screen and stays put                                                                                                               |
| `revision` | no       | The deck's revision you read (from get\_deck or the last write). Sent, the write lands only if nobody changed the deck since; left out, it goes through regardless |

### `add_overlay`

Drop a poll onto a slide as a floating card, the way the editor does: send the poll, and optionally where (rect) and how it is drawn (style); what you leave out gets the house default. The slide's other content is untouched. For a poll that fills the screen, use add\_step instead. Needs the "decks:write" scope.

| argument   | required | meaning                                                                                                                                                            |
| ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id`       | yes      | The deck's id                                                                                                                                                      |
| `index`    | yes      | The slide step's index                                                                                                                                             |
| `poll`     | yes      | The poll, as in the document                                                                                                                                       |
| `rect`     | no       | Where the card sits; left out, the bottom-right quarter                                                                                                            |
| `style`    | no       | How the card is drawn; anything left out is the house default                                                                                                      |
| `revision` | no       | The deck's revision you read (from get\_deck or the last write). Sent, the write lands only if nobody changed the deck since; left out, it goes through regardless |

### `get_screenshot`

A PNG of one step as the editor shows it: the slide's page with its cards, text, shapes and images on it, or the full-screen poll. Look before you hand a deck over, the way a person glances at the editor: is the card over the picture and not the text, is it big enough to read. Rendered on the server in a real browser, so it takes a second or two; the same step at the same revision comes straight back. Through MCP the image arrives as an image; over HTTP, read `png` as a data URL or send `Accept: image/png` for the bytes. Needs the "decks:read" scope.

| argument | required | meaning                                              |
| -------- | -------- | ---------------------------------------------------- |
| `id`     | yes      | The deck's id                                        |
| `index`  | yes      | The step's index; the join screen (0) has no preview |

### `attach_pdf`

Put the presenter's own slides behind the deck. The editor renders the pages when the deck is opened, so polls can float on the real slides. With `pages`, and while no slide has a page yet, the blank slides are replaced by one slide per page, in order, after the join screen; polls and paged slides already there are kept. PDF only for now. Needs the "decks:write" scope.

| argument   | required | meaning                                                                                                                                                            |
| ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id`       | yes      | The deck's id                                                                                                                                                      |
| `pdf`      | yes      | The PDF file, base64 encoded (24 MB at most)                                                                                                                       |
| `pages`    | no       | How many pages the PDF has; makes one slide step per page when the deck has none yet                                                                               |
| `revision` | no       | The deck's revision you read (from get\_deck or the last write). Sent, the write lands only if nobody changed the deck since; left out, it goes through regardless |

### `list_rooms`

The team's rooms, newest first, fifty at most. Needs the "rooms:read" scope.

Takes no arguments.

### `start_room`

Open a room for a deck: a six-digit code the audience joins with, and a presenter link that carries the host's key. The room waits in the lobby until the presenter (or `room_action` with `start`) begins. Decks with uploaded slide pages start from the editor for now, because pages are rendered in the browser; decks of blank slides and polls start here. Needs the "rooms:start" scope.

| argument | required | meaning       |
| -------- | -------- | ------------- |
| `deckId` | yes      | The deck's id |

### `room_action`

What the presenter's buttons do: start the session, walk to the next or previous step, close the live poll and reveal, or stop the session. Needs the "rooms:start" scope.

| argument | required | meaning                          |
| -------- | -------- | -------------------------------- |
| `code`   | yes      | The room's six-digit code        |
| `action` | yes      | start, next, prev, close or stop |

### `room_results`

Every poll's results so far, as JSON and as a markdown summary. Works while the room is live and after it ended, for as long as the room is held in memory. Needs the "results:read" scope.

| argument | required | meaning                   |
| -------- | -------- | ------------------------- |
| `code`   | yes      | The room's six-digit code |
