Skip to main content
Poll the Room speaks the Model Context Protocol. Connect the server and an agent can build decks, put polls on slides, look at the result, start a room and read the results, with the same key and the same rules as the REST API.
The server is stateless Streamable HTTP. One JSON-RPC message goes in, one reply comes out, and there is no session to keep. It authenticates with the same bearer key as the API. On connect it hands the agent short instructions on what to do first, and the tools carry the full schema of every widget.
OAuth is coming. Until then every client that can send a header connects today. ChatGPT and the claude.ai connector directory cannot send a key, so they connect once OAuth lands.

Before you start

1

Make a key

Open Settings › API in Poll the Room and make a key. The secret is shown once.
2

Give it only what the agent needs

An agent that builds decks needs decks:read and decks:write. Add rooms:start, which the Pro plan sells, and results:read only when it should run the room and read the answers. See scopes.
3

Keep it out of files you share

Where a client can read the key from an environment variable, the examples below do that. Set it once in your shell profile.

Connect

Pick your client. Every example names the server polltheroom.
--scope user makes it available in every project. Run claude mcp list and the server shows as connected; in a session, /mcp shows the same.To share the server with everyone on a project, put it in .mcp.json at the project root instead. Claude Code fills in the key from each person’s own environment.
Any other client connects the same way if it speaks Streamable HTTP and can send a header. Give it the URL above and the header Authorization: Bearer ptr_YOUR_KEY.

Check that it works

1

Ask for one slide and a look at it

Make a deck called “Q3 kick-off” with one slide. Put the title “Q3 kick-off” on the left, and beside it a multiple-choice card asking “Which bet do we start with?” with New pricing, Mobile app and Partner program. Then show me the slide.
2

Allow the tools

The agent builds the deck with create_deck and the step verbs, then calls get_screenshot. Most clients ask before a tool runs the first time.
3

See what the agent sees

get_screenshot hands the agent a picture, drawn by the same renderer as the room. The agent is told to move a card that covers text or is too small to read, and the reply says so too. Open the deck’s url to see the same slide in the editor.
A slide titled Q3 kick-off, with a multiple-choice card asking which bet to start with in the bottom-right quarter

What get_screenshot hands back for that prompt.

If a step fails, When something fails below names the usual causes.

What the agent does first

On connect the server tells the agent how a session goes. Build a deck with create_deck, attach a PDF with attach_pdf when there is one, put polls on slides with add_overlay, look at every slide it touched with get_screenshot and fix what problems names. Then go live with start_room and hand its presentUrl to the person presenting. That works for a deck with slide pages too; the server draws the pages first. The whole reference is one file at /llms-full.txt.

Tools

Every tool with its arguments, generated from the server’s own list.

Document and widgets

What the tools write. Every widget, its looks, and what it needs before it goes on stage.

When something fails

A tool that cannot do what was asked answers with a result marked isError and a sentence saying what to fix, so the agent can act on it. Only a missing key is refused at the protocol level, with 401.
Connecting and listing the tools need no key, so a client can show every tool while each call answers No usable API key. The header did not arrive. Check that the variable the config reads is set where the client runs. An app opened from the Dock or the Start menu does not see variables from your shell profile, so start it from a terminal or put the key in the config itself.
The server speaks Streamable HTTP and answers only POST. A client set up for the older SSE transport opens the URL with GET, gets 405 and gives up. Pick the HTTP option, which is type: "http" in Claude Code and VS Code, httpUrl in Gemini CLI and serverUrl in Windsurf and Antigravity. Check that the URL ends in /api/mcp.
A client reads the tool list when it connects, and this server does not announce changes. After a new tool ships, reconnect the server or restart the client.
The key lacks the scope that tool needs, or the team’s plan does not sell it. The answer names the scope. Make a new key with that scope under Settings › API, or move the team to Pro for rooms:start.
A key makes 60 requests an hour on the free plan and 1000 on Pro. Every tool call counts, a screenshot too; connecting and listing the tools do not. The answer says how many seconds to wait. An agent that looks at every slide after each small change spends the hour quickly, so ask it to look once per slide when it is done.
mcp-remote runs through npx, which needs Node.js on the machine. Install a current Node.js, then restart Claude Desktop.

Keys and agents

A key acts for the person who made it, inside their team, and reaches the same decks they do. Give each agent its own key, so revoking one stops that agent and nothing else. An agent can bin a deck with delete_deck; it stays in the bin for thirty days, the same as in the app.