Reference · Model Context Protocol

Quiz Master MCP server — tool reference

Everything a connected AI can call, and what it needs to call it. 17 tools over your quizzes, your question library and your media — remote, OAuth sign-in, no API key.

Updated

Server URLhttps://thequizmaster.app/mcp

Just want it working? The setup guides for Claude and ChatGPT are shorter, and the prompt library shows these tools in use.

The handshake

Connection facts.

What your client negotiates when you paste the URL. You never type any of it — it’s here for the curious and the people writing their own client.

Endpoint

One URL. Tool calls are POSTed to it; GET and DELETE answer 405.

  • https://thequizmaster.app/mcp
Transport

MCP Streamable HTTP, stateless. Every request is served on its own and answered with a plain JSON response — no session id, no server-sent event stream.

Sign-in

OAuth 2.1 authorization-code flow with dynamic client registration, so your client registers itself. PKCE with S256 is required; clients are public, and no client secret is ever issued.

You sign in on a Quiz Master page with your existing account — Google, or email and password — and approve the client.

  • /.well-known/oauth-protected-resource
  • /.well-known/oauth-authorization-server
  • /mcp/register
  • /mcp/authorize
  • /mcp/token
Tokens

Opaque bearer tokens, stored hashed. Access tokens last an hour; refresh tokens 30 days and are replaced each time they’re used. Authorization codes expire after 10 minutes and work once.

Whose data

Yours only. Every read and write is checked against the signed-in account; another host’s quiz or question id simply reads as not found.

Nothing deletes

No tool deletes a quiz, a question or a stored file. Removing a segment takes it out of the running order; removing a round or a question from a round only drops references — the questions stay in your library.

Media import

Images, audio and video only, up to 25 MB, no SVG; the source must be an http(s) URL. YouTube links are rejected by import_media — put the YouTube URL straight on the question’s media.url instead, where the presenter plays it natively.

17 tools · 5 groups

Every tool.

Inputs are validated on the server and a bad call comes back as a readable error the AI can correct itself from. All text fields are language maps — { "en": "…", "de": "…" }.

Quizzes

Quiz templates — the thing you build once and play on many nights.

ToolWhat it doesKey inputs
list_quizzes

Lists your quizzes, newest first: id, title, languages, theme, question count per round and when each was last changed.

None
get_quiz

Returns one quiz in full — settings, metadata and the whole timeline. Questions come back inline, each with the snippetId the question tools need.

  • quizIdfrom list_quizzes
create_quiz

Creates a quiz. Pass a full timeline to import a whole night in one call, or leave it out and build with add_segment. Inline questions are filed into your question library automatically.

A timeline passed here is taken exactly as given — answer-reveal slides are not added for you.

  • titlelanguage map
  • descriptionoptionallanguage map
  • languagesoptionaldefaults to ["en"]
  • primaryLanguageoptionalone of languages
  • themeIdoptionalfrom list_themes; defaults to daylight
  • timelineoptionalarray of segments
  • settingsoptionalsee update_quiz
  • metadataoptionalauthorName, estimatedDurationMin, tags
update_quiz

Patches a quiz’s title, description, theme, languages and settings. Only the fields you pass change; the timeline has its own tools.

Settings include half points and the bilingual display mode (single, or primary-with-subtitle). The builder has no settings panel yet, so this is the way to change them.

  • quizId
  • patchtitle, description, themeId, languages, primaryLanguage, settings, metadata

Timeline segments

The running order: welcome, rules, rounds, reveals, breaks, scores.

ToolWhat it doesKey inputs
add_segment

Adds one segment to a quiz, at the end or at a position. A round’s inline questions go into your library and the round keeps references to them.

Adding a round also adds its answer-reveal right after it, already linked. Pass pairReveal: false to skip that.

  • quizId
  • segmentone of 14 segment types
  • positionoptional0-based; default appends
  • pairRevealoptionaldefault true for rounds
update_segment

Patches one segment’s own fields — a welcome headline, a round title, a break’s length, a reveal’s pacing.

Not for a round’s questions: use add_questions_to_round and remove_question_from_round.

  • quizId
  • segmentId
  • patchonly the fields to change
remove_segment

Takes a segment out of the timeline. Removing a round leaves its questions in your library.

If that leaves an answer-reveal pointing at nothing, the result says so.

  • quizId
  • segmentId
move_segment

Moves a segment to a new position and renumbers the rest.

  • quizId
  • segmentId
  • toIndex0-based

Question library

Every question lives once, in your library; rounds point at it.

ToolWhat it doesKey inputs
search_questions

Searches your library. Filters combine: text matches prompts, answers and sub-questions; tags must all match; type and difficulty match exactly. Returns summaries.

  • textoptionalcase-insensitive
  • tagsoptionalall must match
  • typeoptionalone of 9 question types
  • difficultyoptionaleasy · medium · hard
  • limitoptional1–200, default 50
get_question

Returns one question in full: prompt, answer, media, clue stages, sub-questions and tags.

  • snippetId
create_question

Writes a question into your library without putting it in any quiz.

  • questionprompt, type, matching answer, …
  • tagsoptionallower-cased and de-duplicated
update_question

Patches a question. The change shows up in every quiz that uses it — including quizzes you’ve already played.

Changing the type needs a matching answer in the same patch. Passing tags replaces the whole list.

  • snippetId
  • patchoptionalonly the fields to change
  • tagsoptionalreplaces the list
add_questions_to_round

Adds one or more questions to a round. Each entry is either a new question, written into your library, or { snippetId } to reuse one you already have.

  • quizId
  • roundIdthe round segment’s id
  • questionsat least one
  • positionoptional0-based; default appends
remove_question_from_round

Takes a question out of a round. The question itself stays in your library and in any other quiz.

  • quizId
  • roundId
  • snippetId

Media

Pictures and sound that still load on the night.

ToolWhat it doesKey inputs
import_media

Copies a remote image, audio or video file into Quiz Master’s own storage and returns a permanent URL to put on a question, clue stage or sub-question.

Pass the direct file URL (ending .jpg, .mp3, .mp4…), not a web page. 25 MB cap, no SVG. YouTube is rejected — use the YouTube URL on the question directly.

  • urlhttp(s), direct file
  • kindoptionalimage · audio · video
  • filenameHintoptionalup to 120 characters

Reference

What a client reads before it writes.

ToolWhat it doesKey inputs
get_authoring_guide

Returns the authoring guide: the language-map convention, the running order of a pub quiz, every question shape, how media works, and what makes a good pub-quiz question.

The tool descriptions tell the AI to read this first.

None
list_themes

Lists the presenter themes with a one-line description of each, for create_quiz and update_quiz.

None

Inside the inputs

The shapes, at a glance.

The full schema is what get_authoring_guide returns. These are the lists people ask about.

Question types

Nine. The answer’s type must match the question’s.

  • short-answer
  • multiple-choice
  • true-false
  • numeric
  • ordering
  • multi-part
  • list
  • matching
  • multi-select
Segment types

Fourteen, for add_segment.

  • welcome
  • table-arrangement
  • rules
  • round-intro
  • round
  • answer-reveal
  • round-end
  • swap-answer-sheet
  • break
  • scoreboard
  • media
  • custom-slide
  • final-scores
  • outro
Media

On a question, clue stage or sub-question. kind is inferred from the URL when left out; audio on a YouTube URL plays it hidden until the answer.

  • kind
  • url
  • startSec
  • endSec
  • caption
  • revealOnAnswer
Multi-stage questions

Clue stages are reveals shown before the question; sub-questions are scored separately under one setup card.

  • clueStages
  • subQuestions

On purpose

What’s deliberately not there.

  • No delete tools

    Nothing on the server deletes a quiz, a question or a stored file. The worst a muddled prompt can do is add something you don’t want.

  • No events or scoring — yet

    The connector writes quizzes. Scheduling a night, entering teams and scoring them happens in the app. Event and scoring tools aren’t built.

  • No “move question” tool

    To reorder questions inside a round, remove one and add it back by snippetId at a position. Rounds hold references, so nothing is lost on the way.

  • No flag picking

    The AI can set the Flag theme, but the country is chosen in the app, on the event or in the builder.

Client config

Adding it by hand.

In claude.ai, Claude Desktop and ChatGPT you paste the URL into a connector dialog — see Connect your AI. In a terminal, it’s one line.

Claude Code

One line in a terminal. Claude Code opens a browser for the Quiz Master sign-in.

claude mcp add --transport http quiz-master https://thequizmaster.app/mcp

Claude Code, per project

Or commit it to a repo as .mcp.json so everyone working in it gets the server.

{ "mcpServers": { "quiz-master": { "type": "http", "url": "https://thequizmaster.app/mcp" } } }

You bring the model. We’ll bring the stage.

Sign in once, connect once, and never open a blank quiz again.