> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.taktoria.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.taktoria.com/_mcp/server.

# Dory tools

> Dory's MCP tools and skills for running live Q&A and polls: events, hosts, questions, polls, results and analytics.

Dory's MCP server, `https://www.taktoria.com/mcp/<workspace>/dory` (each workspace has its own), lets an assistant run
live Q\&A and polls as the person who connected it. It reaches only the events
that person may run: every event with no host list, the ones whose list names
them or a team they are on (or a team inside one), the ones they created, and
every event for an app admin of Dory. Another event is "not found", exactly as
one in another workspace would be. Everything it changes is recorded in the
workspace's audit log under the person's name, with the assistant beside it,
and in Dory's activity as if they had done it in the app.

## Roles

What a connection may do follows the person's
[role in Dory](/getting-started/authentication#app-roles):

* **An app admin** of Dory (every workspace owner and admin is one) may run
  any event, whoever its host lists name, and is never locked out of one.
* **A member** creates events and runs the ones open to them: those with no
  host list, those whose list names them or a team they are on, and those they
  created.
* **A viewer** reads the events a member would run. Their connection lists
  and accepts only the read tools, whatever it was granted: a write tool
  called anyway is refused (`viewer_only`), and the consent page offers them
  only **Read only**. See [MCP servers](/ai-assistants/mcp-servers#scopes).

A connection granted `dory:read` sees the read tools; `dory:write` adds the
write tools, except for a Viewer of Dory. Attendees' side (joining with a code, asking, upvoting and
answering polls) is not here: attendees hold a code, not a seat.

## Events and phases

An event's times open and close it by themselves: it opens at the earlier of
its start and its questions opening, and ends at the later of its end and its
questions closing. Its `phase` is where it stands: `draft` (Not started: no
time to open at, and its code does not work until a host starts it),
`scheduled`, `live` or `ended`; its `status` says the same as `DRAFT`, `LIVE`
or `ENDED`. Every event a tool
returns carries its join `code` and `joinUrl` for attendees, and `url`,
`settingsUrl`, `analyticsUrl` and `presentUrl` into the app, all on the
workspace's Dory hostname where it has one.

## Tools

| Tool                        | Access | What it does                                                         |
| --------------------------- | ------ | -------------------------------------------------------------------- |
| `whoami`                    | read   | The person, the workspace, and this connection's access              |
| `find_people`               | read   | Members by name or email, with user ids and their Dory seat          |
| `find_teams`                | read   | The workspace's teams by name, with ids and who is on them           |
| `search`                    | read   | Events and questions matching some words                             |
| `list_events`               | read   | Events the person may run, or theirs (`mine`): search, phase, paged  |
| `get_event`                 | read   | One event, with its links and meeting link (`meetingUrl`)            |
| `get_join_qr_code`          | read   | The join link as a QR code (PNG image), with the code and link       |
| `get_calendar_invite`       | read   | Invite text, Google and Outlook links and an .ics file for an event  |
| `get_event_hosts`           | read   | The people and teams who may run an event                            |
| `list_questions`            | read   | An event's questions by status, most upvoted or newest first, paged  |
| `get_question`              | read   | One question                                                         |
| `list_polls`                | read   | An event's polls                                                     |
| `get_poll`                  | read   | One poll                                                             |
| `get_poll_results`          | read   | What the room answered, counted, shaped by the poll's type           |
| `list_participants`         | read   | Who took part, and what each did, paged                              |
| `get_leaderboard`           | read   | Quiz standings                                                       |
| `get_event_stats`           | read   | Headline numbers                                                     |
| `get_event_analytics`       | read   | The numbers page: attendance, capacity, charts, top questions        |
| `get_events_overview`       | read   | Dory's Analytics page: the last days across events, busiest first    |
| `get_presenter_queue`       | read   | The question on the big screen and the ones up next                  |
| `export_questions`          | read   | Every question as CSV text, cut at 100,000 characters with a note    |
| `create_event`              | write  | A new event, owned by the person                                     |
| `update_event`              | write  | Change an event's settings                                           |
| `set_event_status`          | write  | Start, end or reopen                                                 |
| `start_event_now`           | write  | Open a scheduled event now                                           |
| `extend_event`              | write  | Fifteen more minutes before it closes                                |
| `set_event_archived`        | write  | Archive or restore                                                   |
| `duplicate_event`           | write  | A copy with the same setup, meeting link, time zone, hosts and polls |
| `delete_event`              | write  | Delete an event and everything in it (destructive)                   |
| `add_event_host`            | write  | Let a person run an event                                            |
| `add_event_host_team`       | write  | Let a team run an event                                              |
| `remove_event_host`         | write  | Take a person off the host list                                      |
| `remove_event_host_team`    | write  | Take a team off the host list                                        |
| `set_event_hosts`           | write  | Replace both host lists                                              |
| `moderate_question`         | write  | Move a question between pending, approved, answered and dismissed    |
| `answer_question`           | write  | Write an answer and mark it answered                                 |
| `spotlight_question`        | write  | Put a question on the big screen                                     |
| `toggle_question_highlight` | write  | The console's highlight button: on, or off again                     |
| `advance_question_queue`    | write  | The presenter's Next                                                 |
| `create_question`           | write  | Post a question to an event on the hosts' side                       |
| `update_question`           | write  | Reword a question, or set its fields directly                        |
| `dismiss_question`          | write  | Dismiss a question, keeping it and its votes                         |
| `create_poll`               | write  | Add a poll                                                           |
| `set_poll_status`           | write  | Open a poll (closing the open one), close it, or back to draft       |
| `update_poll`               | write  | Change a poll's question or settings                                 |
| `delete_poll`               | write  | Delete a poll and its answers (destructive)                          |

The rules are the app's own, and the REST API's too:

* One poll is live at a time: opening one closes the poll that was open,
  whether `set_poll_status`, `update_poll` or `create_poll` opens it.
* One question is on the big screen at a time: `spotlight_question`,
  `toggle_question_highlight`, `advance_question_queue` and `update_question`
  with `highlighted` take the last one off. A dismissed question is never on
  it: `dismiss_question`, or `DISMISSED` through `moderate_question` or
  `update_question`, takes it off and leaves the screen empty.
* A question keeps the time it was first answered while it stays answered;
  moving it out of `ANSWERED` clears it.
* A poll's limits are the app's: a question of up to 500 characters, at least
  two options (at most 20, each up to 200 characters) for a multiple choice,
  ranking or quiz, and a rating scale of 2 to 10. Anything outside them is
  refused, not adjusted.
* No change to an event's host lists may leave the person making it unable to
  run the event, unless they are an app admin of Dory or its creator: the tool refuses,
  and says to add them, or a team they are on, first.
* Hosts are named by id: `find_people` and `find_teams` find them by name.
  Only somebody with a Dory seat can run an event, which `find_people`'s
  `hasSeat` says.

## Skills

The server also offers ready-made workflows as skills, which an assistant
follows step by step with the tools above. Each is a `SKILL.md` at
`skill://dory/<name>/SKILL.md`, with any files it refers to beside it, and
reaches a client through the Skills extension, as a resource, as a prompt of
the same name, and in the server's instructions (see
[Skills](/ai-assistants/mcp-servers#skills)). A write skill is offered only to
a connection granted `dory:write`.

| Skill               | Access | For                                                                                                                                                |
| ------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `find-anything`     | read   | Searching Dory well: events and questions from a few words                                                                                         |
| `prepare-an-event`  | write  | Setting up an event: dates, audience, hosts and polls in advance                                                                                   |
| `moderate-live-qa`  | write  | Working the question queue during a live event, with a moderation guide (`references/moderation-guide.md`)                                         |
| `brief-the-speaker` | read   | A brief for the speaker: the room's questions grouped into themes, the top ones quoted exactly, with a format guide (`references/brief-format.md`) |
| `run-a-poll`        | write  | Creating a poll, opening it to the room and reading its results                                                                                    |
| `event-recap`       | read   | Summarising an event afterwards: questions, themes, polls and numbers                                                                              |