Asking a human ten questions in a conversation gets you ten paragraphs to parse; here the same ten arrive as typed answers matched to their questions, including the ones left blank. Fetch the schema before building anything — the question types and their required fields are what the runner validates against, and the runner assigns the quiz id itself, so the definition should not carry one. Useful well beyond quizzes: structured interviews, intake forms, and any point where an agent needs a decision from a person in a form rather than in prose.
A way for a model to collect real input from a person. It serves the quiz as a web page on your machine, waits while the human answers, and returns each question paired with what was submitted.
- The JSON Schema for a quiz definition, which is what makes generated quizzes valid on the first attempt rather than after a round of errors
- Ten question types: single choice, multiple choice, short text, long text, dropdown, fill gaps, match, scale, sorting and upload
- A quiz registered with the runner and optionally opened in the user's default browser, returning the assigned id and the URL
- Answers returned as each question paired with its response, projected to the minimum needed to interpret it — options for choice questions, pairs for matching — with unanswered questions returned as null
- The runner shut down explicitly when a session ends early rather than left listening
- The same quiz format usable outside MCP: a standalone runner that loads a definition from a file, a URL or stdin, writes answers to a file, and can post them to a webhook
Node.js 20 or newer, and a browser on the machine — the local server runs as npx -y @quiz-mcp/cli mcp and the person answering has to be at that machine to open the page. A hosted, OAuth-protected version runs on Cloudflare Workers if you would rather install nothing; it exposes the same tools plus per-user quiz management, and signs you in on the first call. On the hosted version, answers are stored in an eventually consistent store, so a read straight after a submission can come back empty — retry after a few seconds rather than treating it as lost.
One command — npx -y @quiz-mcp/cli mcp
