Server definition
- Hash
- sha256:6fef3a8f460513ccb0bc4d0a4e7f89ccd5cd67cffd7c5208ae7221ce5968a625
- What it is
- What a remote MCP server returned when asked what it offers: 12 tools
The blob, as servednamed by its sha256
{
"instructions": "QuizBase exposes a multilingual trivia catalog (1.2M+ questions, English + Polish at launch) through MCP. Discovery methods (initialize, tools/list, prompts/list, resources/list) are anonymous; execution methods (tools/call, prompts/get, resources/read) require an API key — get one free, no card, at https://quizbase.runriva.com/dashboard/keys.\n\nStart with quizbase_categories or quizbase_topics for orientation, then quizbase_random or quizbase_list with filters (lang, category, difficulty, regions, source, quality). Each question carries per-record attribution (source, author, license) — attribution is required when redistributing CC-BY-SA content.\n\nFor multi-step workflows use the prompts: build_quiz (multi-round orchestration), explore_topic (facets + samples), warmup_round (5-question icebreaker), client_mechanics_patterns (9 ID-driven client-side mechanics).",
"tools": [
{
"description": "List of 24 top-level categories with i18n labels. USE WHEN: building a category picker, validating ?category= input. Stable enum (rarely changes). For higher-resolution browsing → quizbase_subcategories or quizbase_topics.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lang": {
"default": "en",
"description": "Language for category `name` field (ISO 639-1). Default \"en\". Supported: en, pl. Slugs are language-agnostic.",
"enum": [
"en",
"pl"
],
"type": "string"
}
},
"type": "object"
},
"name": "quizbase_categories",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"categories": {
"description": "All 24 top-level categories with localized names.",
"items": {
"additionalProperties": {},
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"name"
],
"type": "object"
},
"type": "array"
},
"meta": {
"additionalProperties": {},
"description": "Response metadata: how many categories returned and which language.",
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"language": {
"type": "string"
}
},
"required": [
"count",
"language"
],
"type": "object"
}
},
"required": [
"categories",
"meta"
],
"type": "object"
}
},
{
"description": "Returns supported language whitelist (ISO 639-1) with question counts per language. USE WHEN: showing language picker, validating ?lang= input, deciding fallback. Day 1: en + pl.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lang": {
"default": "en",
"description": "Language for `displayName` of each supported language entry (ISO 639-1). Default \"en\". E.g. with `lang=pl` Polish returns as \"polski\", English as \"angielski\". Codes themselves are language-agnostic.",
"enum": [
"en",
"pl"
],
"type": "string"
}
},
"type": "object"
},
"name": "quizbase_languages",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"languages": {
"description": "Supported languages with localized display name and question count per language.",
"items": {
"additionalProperties": {},
"properties": {
"code": {
"type": "string"
},
"displayName": {
"type": "string"
}
},
"required": [
"code",
"displayName"
],
"type": "object"
},
"type": "array"
},
"meta": {
"additionalProperties": {},
"description": "Response metadata.",
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"language": {
"type": "string"
}
},
"required": [
"count",
"language"
],
"type": "object"
}
},
"required": [
"languages",
"meta"
],
"type": "object"
}
},
{
"description": "Cursor-paginated browse over the catalog. Quality-first: by default excludes questions flagged for review (use quality='all' for full pool).\n\nUSE WHEN: full catalog sync, delta sync (updated_since), exhaustive enumeration by filter. NOT WHEN: you only need N random samples (use quizbase_random) or a single record (use quizbase_question_by_id).\n\nPAGINATION: stable cursor over id UUIDv7 DESC. First call: omit cursor. Next: pass meta.nextCursor. Stop when nextCursor is null.\n\nKEY FILTERS (full parity with REST):\n- lang: ISO 639-1, default \"en\". Supported: en, pl.\n- category (slug), difficulty (trivial|easy|medium|hard|expert — LLM-calibrated), type (multiple|boolean), subcategory (raw slug).\n- tags (AND), tags_any (OR, max 10): raw tag slugs.\n- topic (curated, alias resolver), topics_any (OR over curated): higher precision than tags.\n- regions (cultural affinity, AND): empty = no cultural advantage assumed. Lowercase ISO 3166-1 alpha-2 ('us', 'pl', 'gb') + cultural codes ('jewish', 'christian-catholic', 'islam'). Filter for content statistically more likely known by residents/members. Discover via quizbase_regions.\n- source (array): include only these of 12 (opentdb, opentriviaqa, kqa-pro, entityq, mintaka, mkqa, nq-open, creak, qasc, arc, webq, quizbase).\n- exclude_source (array): drop these sources, e.g. [\"entityq\"]. Applied after source.\n- license (SPDX): e.g. CC-BY-SA-4.0, MIT.\n- quality: 'high' (default) = cleanest, most broadly-useful. 'standard' = broader pool incl. niche/too-specific. 'all' = full pool incl. flagged; when 'all', each question gains a \"quality\" field ('high' or 'needs_review').\n- updated_since (ISO 8601): only questions updated after this — for delta sync caches.\n\nBATCH + TRANSLATION MAPPING:\n- ids (up to 250): fetch those exact records in one call (anti-repeat, deep-links, restoring a saved set). Terminal selector — browse filters and cursor are ignored. Missing ids → meta.missing.\n- content_language (en|pl): with ids, returns each question's sibling in that CONTENT language across the translation chain — the same questions in another language. Distinct from lang (labels only).\n\nPAGINATION + COUNTING:\n- cursor (string): from previous meta.nextCursor. Omit for page 1.\n- limit (1-100, default 20).\n- count: none (default, skip — page via nextCursor) | exact (precise COUNT(*), index-only ~25-90ms).\n\nOUTPUT: { questions: [...], meta: { count, countMode, language, nextCursor, total? } }. Each question carries full per-record attribution (source, author, license, licenseVersion, licenseUrl, sourceId, url, modifications, lastModified) — identical shape to REST /api/v1/questions.\n\nATTRIBUTION REQUIRED if you redistribute. Credit each question using its own attribution object — see license + licenseUrl + modifications fields per record.\n\nCOMMON MISTAKES: not passing the cursor on subsequent calls (you'll re-read page 1); polling without updated_since when doing delta sync.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"category": {
"description": "Top-level category slug (kebab-case) — e.g. `geography`, `history`, `science-and-nature`. 24 total. Use `quizbase_categories` for canonical list with localized names.",
"type": "string"
},
"content_language": {
"description": "With `ids`, returns each question in this CONTENT language (its `text`/answers) by following the translation chain — the same questions in another language, not a re-draw. Distinct from `lang` (which only localizes category/tag labels). Supported: en, pl. Untranslated ids land in `meta.missing`.",
"enum": [
"en",
"pl"
],
"type": "string"
},
"count": {
"default": "none",
"description": "Total count strategy. `none` (default, fastest — page via nextCursor, no total). `exact` (precise COUNT(*), index-only ~25-90ms — when you need the exact number of matches).",
"enum": [
"exact",
"none"
],
"type": "string"
},
"cursor": {
"description": "Opaque pagination cursor from previous `meta.nextCursor`. Omit for page 1; pass last response's `meta.nextCursor` for subsequent pages. Stop when `nextCursor` is null.",
"type": "string"
},
"difficulty": {
"description": "LLM-calibrated 5-level difficulty. trivial=common-knowledge, easy=approachable, medium=requires-thought, hard=needs-domain-context, expert=specialist. Records not yet LLM-rated hold the importer placeholder (mostly \"medium\" for factoid sources).",
"enum": [
"trivial",
"easy",
"medium",
"hard",
"expert"
],
"type": "string"
},
"exclude_source": {
"description": "Exclude these source databases, e.g. `[\"entityq\"]`. Use to drop noisy auto-generated sources. Applied after `source` if both are present.",
"items": {
"enum": [
"arc",
"creak",
"entityq",
"kqa-pro",
"mintaka",
"mkqa",
"nq-open",
"opentdb",
"opentriviaqa",
"qasc",
"quizbase",
"webq"
],
"type": "string"
},
"type": "array"
},
"ids": {
"description": "Batch fetch by id (up to 250). Returns those exact records in one call — anti-repeat, deep-links, reconstructing a saved set. Terminal selector: all browse filters and cursor are ignored. Ids with no result come back in `meta.missing`. Combine with `content_language` to map a set across languages.",
"items": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"maxItems": 250,
"type": "array"
},
"lang": {
"default": "en",
"description": "Question language as ISO 639-1 code. Default \"en\". Supported: en, pl. Translated rows share the same `id` across languages.",
"enum": [
"en",
"pl"
],
"type": "string"
},
"license": {
"description": "SPDX license string (e.g. CC-BY-SA-4.0, MIT). Filter for redistribution-friendly content.",
"enum": [
"CC-BY-SA-4.0",
"CC-BY-SA-3.0",
"CC-BY-4.0",
"MIT",
"proprietary"
],
"type": "string"
},
"limit": {
"default": 20,
"description": "Page size (1-100, default 20). Larger pages reduce round-trips but increase latency.",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"quality": {
"default": "high",
"description": "Quality preset. \"high\" (default) returns only the cleanest, most broadly-useful questions. \"standard\" broadens to the full reviewed pool incl. niche/too-specific. \"all\" includes everything flagged for review — for audit, research, or BY-SA dump.",
"enum": [
"high",
"standard",
"all"
],
"type": "string"
},
"regions": {
"description": "Cultural affinity codes. A question is tagged with a region if residents of that country, or members of that cultural/religious group, are **statistically more likely to know** the answer (NOT geography of the subject). Lowercase ISO 3166-1 alpha-2 (`us`, `pl`, `gb`) plus cultural codes (`jewish`, `christian-catholic`, `islam`). AND-logic. Empty array in DB = universally accessible. Use `quizbase_regions` for the full catalog with counts.",
"items": {
"type": "string"
},
"type": "array"
},
"source": {
"description": "Include only these source databases (one or more of 12): opentdb, opentriviaqa, mkqa, mintaka, kqa-pro, entityq, nq-open, creak, qasc, arc, webq, quizbase. Matches `attribution.source`.",
"items": {
"enum": [
"arc",
"creak",
"entityq",
"kqa-pro",
"mintaka",
"mkqa",
"nq-open",
"opentdb",
"opentriviaqa",
"qasc",
"quizbase",
"webq"
],
"type": "string"
},
"type": "array"
},
"subcategory": {
"description": "Raw subcategory slug (kebab-case). Prefer `topic` for OR + alias resolver.",
"type": "string"
},
"tags": {
"description": "AND-logic: question must have ALL these tag slugs (kebab-case)",
"items": {
"type": "string"
},
"type": "array"
},
"tags_any": {
"description": "OR-logic: question must have AT LEAST ONE of these tag slugs",
"items": {
"type": "string"
},
"type": "array"
},
"topic": {
"description": "Curated topic slug — alias resolver matches subcategories and tags",
"type": "string"
},
"topics_any": {
"description": "OR-logic over curated topic slugs (resolves aliases)",
"items": {
"type": "string"
},
"type": "array"
},
"type": {
"description": "\"multiple\" = 1 correct + 3 distractors. \"boolean\" = True/False.",
"enum": [
"multiple",
"boolean"
],
"type": "string"
},
"updated_since": {
"description": "ISO 8601 timestamp — return only questions updated after this (delta sync)",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"type": "string"
}
},
"type": "object"
},
"name": "quizbase_list",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"meta": {
"additionalProperties": {},
"description": "Pagination metadata: count of returned rows, total (exact match count, only when count=exact), nextCursor (null = end), language echoed.",
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"countMode": {
"enum": [
"exact",
"none"
],
"type": "string"
},
"language": {
"type": "string"
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"count",
"countMode",
"language",
"nextCursor"
],
"type": "object"
},
"questions": {
"description": "Array of trivia questions for the current page, each with full attribution.",
"items": {
"additionalProperties": {},
"properties": {
"id": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"id",
"text"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"questions",
"meta"
],
"type": "object"
}
},
{
"description": "Fetch one question with FULL per-record attribution (source, author, license, modifications, lastModified, sourceId, url) and `quality: \"high\" | \"needs_review\"` (always present — deep-link semantic means full row). USE WHEN: deep link to a question, full provenance lookup for redistribution, cache refresh, moderation inspection. INPUTS: id (UUID), lang (affects category.name and label translations only). 404 returned via {question: null, error: \"not_found\"} — id may be invalid, pending/rejected, canonical-duplicate, or tombstoned.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "Question UUID (v7 format). Stable across language translations — the same UUID may exist in multiple languages with different text but same canonical answer.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"lang": {
"default": "en",
"description": "Language for the response (ISO 639-1). Default \"en\". Supported: en, pl. Affects `text`, `correct`, `incorrect`, plus localized labels in `category.name`, `subcategories[].label`, `tags[].label`.",
"enum": [
"en",
"pl"
],
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "quizbase_question_by_id",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"error": {
"description": "Error code when question is null (e.g. `not_found`).",
"type": "string"
},
"question": {
"anyOf": [
{
"additionalProperties": {},
"properties": {
"id": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"id",
"text"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Question object with full attribution and quality flag. Null when not found."
}
},
"required": [
"question"
],
"type": "object"
}
},
{
"description": "Fetch N random trivia questions matching filters. Quality-first: by default excludes questions flagged for review (use quality='all' to include for audit/research).\n\nUSE WHEN: building a quiz, sampling content for warmup, generating practice sets. NOT WHEN: you need a specific question ID (use quizbase_question_by_id) or want to explore a topic deeply with facets (use quizbase_topic_by_slug).\n\nKEY FILTERS:\n- amount: 1-50, default 10.\n- lang: ISO 639-1. Default \"en\". Supported: en, pl. Strict — unknown language returns 400.\n- category (slug): e.g. geography, history, science-and-nature. Full list via quizbase_categories.\n- difficulty: trivial | easy | medium | hard | expert. LLM-calibrated. Records not yet LLM-rated hold the importer placeholder (mostly \"medium\" for factoid sources).\n- type: multiple | boolean (default both; no text_input in random).\n- regions (cultural affinity, AND): empty in data = no cultural advantage assumed. Lowercase ISO 3166-1 alpha-2 ('us', 'pl', 'gb') + cultural codes ('jewish', 'christian-catholic', 'islam'). Filter for content statistically more likely known by residents/members. Discover via quizbase_regions.\n- source (array): include only these source databases (one or more of 12: opentdb, opentriviaqa, kqa-pro, entityq, mintaka, mkqa, nq-open, creak, qasc, arc, webq, quizbase).\n- exclude_source (array): drop these sources, e.g. [\"entityq\"] for human-curated only. Applied after source.\n- license (SPDX): CC-BY-SA-4.0 | CC-BY-SA-3.0 | MIT | etc. Restrict to redistribution-friendly content.\n- topic (curated slug): higher precision than tags. Alias resolver matches subcategories+tags. List via quizbase_topics.\n- topics_any: OR over curated topics, max 10.\n- tags (AND), tags_any (OR), subcategory: raw taxonomy. Use topic if available.\n- quality: 'high' (default, recommended) = cleanest, most broadly-useful. 'standard' = broader pool incl. niche/too-specific (more volume). 'all' = audit/research, includes flagged — when 'all', each question gains a \"quality\" field ('high' or 'needs_review').\n- exclude (UUIDs, max 250): de-dupe within a quiz session.\n\nOUTPUT: { questions: [...], meta: { count, language } }. Each question carries full per-record attribution (source, author, license, licenseVersion, licenseUrl, sourceId, url, modifications, lastModified) — identical shape to REST /api/v1/questions/random.\n\nATTRIBUTION REQUIRED if you redistribute. CC-BY-SA modifications must be credited per § 3(a)(1)(B) using each question's own attribution object.\n\nCOMMON MISTAKES: forcing lang='pl' for a global audience (use 'en' default); skipping quality (default already excludes flagged content — only pass quality='all' for audit); using tags when a curated topic exists (worse precision).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"amount": {
"default": 10,
"description": "Number of random questions to return. Range 1-50, default 10. Each call samples independently — pass `exclude` with previously-seen UUIDs to avoid duplicates across calls within one session.",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"category": {
"description": "Top-level category slug (kebab-case) — e.g. `geography`, `history`, `science-and-nature`. 24 categories total. Use `quizbase_categories` for the full canonical list with localized names.",
"type": "string"
},
"difficulty": {
"description": "LLM-calibrated 5-level difficulty. trivial=common-knowledge, easy=approachable, medium=requires-thought, hard=needs-domain-context, expert=specialist. Records not yet LLM-rated hold the importer placeholder (mostly \"medium\" for factoid sources).",
"enum": [
"trivial",
"easy",
"medium",
"hard",
"expert"
],
"type": "string"
},
"exclude": {
"description": "List of question UUIDs to exclude from random sampling. Use to de-dupe within a quiz session — pass IDs you already showed the user so they are not repeated. Max 250 IDs per call.",
"items": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"maxItems": 250,
"type": "array"
},
"exclude_source": {
"description": "Exclude these source databases. Use to drop noisy auto-generated sources, e.g. `[\"entityq\"]` for human-curated only. Applied after `source` if both are present.",
"items": {
"enum": [
"arc",
"creak",
"entityq",
"kqa-pro",
"mintaka",
"mkqa",
"nq-open",
"opentdb",
"opentriviaqa",
"qasc",
"quizbase",
"webq"
],
"type": "string"
},
"type": "array"
},
"lang": {
"default": "en",
"description": "Question language as ISO 639-1 code. Default \"en\". Supported: en, pl. Strict — unknown language returns 400. The same `id` may exist in multiple languages (translated rows share `id`).",
"enum": [
"en",
"pl"
],
"type": "string"
},
"license": {
"description": "SPDX license string (e.g. CC-BY-SA-4.0, CC-BY-SA-3.0, MIT). Filter for redistribution-friendly content. Each question carries its own `attribution.license`.",
"enum": [
"CC-BY-SA-4.0",
"CC-BY-SA-3.0",
"CC-BY-4.0",
"MIT",
"proprietary"
],
"type": "string"
},
"quality": {
"default": "high",
"description": "Quality preset. \"high\" (default) returns only the cleanest, most broadly-useful questions. \"standard\" broadens to the full reviewed pool incl. niche/too-specific (more volume). \"all\" includes everything flagged for review too — for audit, research, or BY-SA dump consumption.",
"enum": [
"high",
"standard",
"all"
],
"type": "string"
},
"regions": {
"description": "Cultural affinity codes. A question is tagged with a region if residents of that country, or members of that cultural/religious group, are **statistically more likely to know** the answer (NOT geography of the subject). Lowercase ISO 3166-1 alpha-2 (`us`, `pl`, `gb`) plus cultural codes (`jewish`, `christian-catholic`, `islam`). AND-logic. Empty array in DB = universally accessible (no cultural advantage assumed). Use `quizbase_regions` for the full catalog with counts.",
"items": {
"type": "string"
},
"type": "array"
},
"source": {
"description": "Include only these source databases (one or more of 12: opentdb, opentriviaqa, mkqa, mintaka, kqa-pro, entityq, nq-open, creak, qasc, arc, webq, quizbase). Matches `attribution.source` per question.",
"items": {
"enum": [
"arc",
"creak",
"entityq",
"kqa-pro",
"mintaka",
"mkqa",
"nq-open",
"opentdb",
"opentriviaqa",
"qasc",
"quizbase",
"webq"
],
"type": "string"
},
"type": "array"
},
"subcategory": {
"description": "Raw subcategory slug (kebab-case). Prefer `topic` for OR semantics + alias resolver.",
"type": "string"
},
"tags": {
"description": "AND-logic: question must have ALL these tag slugs (kebab-case)",
"items": {
"type": "string"
},
"type": "array"
},
"tags_any": {
"description": "OR-logic: question must have AT LEAST ONE of these tag slugs",
"items": {
"type": "string"
},
"type": "array"
},
"topic": {
"description": "Curated topic slug — alias resolver matches subcategories and tags",
"type": "string"
},
"topics_any": {
"description": "OR-logic over curated topic slugs (resolves aliases)",
"items": {
"type": "string"
},
"type": "array"
},
"type": {
"description": "\"multiple\" = 1 correct + 3 distractors. \"boolean\" = True/False (Prawda/Fałsz in pl).",
"enum": [
"multiple",
"boolean"
],
"type": "string"
}
},
"type": "object"
},
"name": "quizbase_random",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"meta": {
"additionalProperties": {},
"description": "Response metadata: how many questions returned and which language.",
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"language": {
"type": "string"
}
},
"required": [
"count",
"language"
],
"type": "object"
},
"questions": {
"description": "Array of trivia questions, each carries full per-record attribution.",
"items": {
"additionalProperties": {},
"properties": {
"id": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"id",
"text"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"questions",
"meta"
],
"type": "object"
}
},
{
"description": "Discover region codes used by the catalog. **Cultural affinity** — a question is tagged with a region if residents of that country, or members of that cultural/religious group, are statistically more likely to know the answer (NOT geography of the subject). USE WHEN: planning a quiz targeting users from a specific country or cultural background, exploring \"what regions are represented\". OUTPUT: array of {code, kind, label, count} sorted by count DESC. INPUTS: lang (en|pl), q (substring on code/label), kind (country|cultural), cursor, limit (max 500). Pair with quizbase_random or quizbase_list using `regions:[...]` to fetch matching questions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"description": "Opaque pagination cursor from previous `meta.nextCursor`. Omit for page 1.",
"type": "string"
},
"kind": {
"description": "Filter by region type. `country` returns ISO 3166-1 alpha-2 codes (`us`, `pl`, `gb`...). `cultural` returns cultural/religious affinity codes (`jewish`, `christian-catholic`, `islam`...). Omit for both.",
"enum": [
"country",
"cultural"
],
"type": "string"
},
"lang": {
"default": "en",
"description": "Language for region `label` (ISO 639-1). Default \"en\". Supported: en, pl. Codes themselves language-agnostic.",
"enum": [
"en",
"pl"
],
"type": "string"
},
"limit": {
"default": 100,
"description": "Page size (1-500, default 100). Catalog has ~150 distinct codes per language.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"q": {
"description": "Substring search on region code + label (case-insensitive). E.g. `q=jew` returns `jewish` cultural code.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "quizbase_regions",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"meta": {
"additionalProperties": {},
"description": "Pagination metadata: count returned, total available, cursor for next page.",
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"language": {
"type": "string"
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"total": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"count",
"total",
"language",
"nextCursor"
],
"type": "object"
},
"regions": {
"description": "Region codes (cultural affinity) with localized labels, kind (country|cultural), and per-region counts.",
"items": {
"additionalProperties": {},
"properties": {
"code": {
"type": "string"
},
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"kind": {
"enum": [
"country",
"cultural"
],
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"code",
"kind",
"label",
"count"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"regions",
"meta"
],
"type": "object"
}
},
{
"description": "Submit a content correction, copyright concern, or factual error report. USE WHEN: user (via your interface) flags a wrong answer, broken translation, attribution issue, or DMCA concern. INPUTS: at least one of (questionId UUID, questionText, questionUrl), type (translation|factual|inappropriate|attribution|other), comment (optional, max 2000), reporterEmail (optional). OUTPUT on success: {ok:true, reportId}. On failure the result is marked isError:true with structuredContent {error, message} — error codes: invalid_input, not_found, rate_limit_exceeded (per-IP 5/min), internal_error.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"comment": {
"description": "Free-text explanation of the issue (max 2000 chars). Strongly recommended — bare flag without context is hard to triage. Examples: \"Currency in answer was correct in 2018 but Argentina changed it in 2023\", \"Polish translation reads as gibberish\".",
"maxLength": 2000,
"type": "string"
},
"questionId": {
"description": "Question UUID (v7) being reported. Highest-fidelity identifier — use when you have it. At least one of `questionId`, `questionText`, `questionUrl` is required.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"questionText": {
"description": "Full or partial question text (10-2000 chars) when UUID is not available. Used by moderators to locate the record. Lower fidelity than `questionId`.",
"maxLength": 2000,
"minLength": 10,
"type": "string"
},
"questionUrl": {
"description": "URL referencing the question (e.g. your app deep-link, screenshot host). Useful when question came from a downstream surface and the user clicks \"Report\" without raw text/ID access.",
"format": "uri",
"maxLength": 500,
"type": "string"
},
"reporterEmail": {
"description": "Reporter email for follow-up (optional). Use when you have user consent — we may contact for clarification if the report is unclear.",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
"type": {
"description": "Report category. `translation` = bad EN→PL or other lang translation. `factual` = incorrect answer / outdated fact. `inappropriate` = offensive content. `attribution` = missing/wrong source credit (CC-BY-SA § 3 violation). `other` = anything else (use `comment` to explain).",
"enum": [
"translation",
"factual",
"inappropriate",
"attribution",
"other"
],
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
"name": "quizbase_report",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"ok": {
"const": true,
"description": "Always true on success; failures use isError, not this field.",
"type": "boolean"
},
"reportId": {
"description": "UUID of the recorded report. Use for follow-up references.",
"type": "string"
}
},
"required": [
"ok"
],
"type": "object"
}
},
{
"description": "Public catalog counters with live breakdowns by language, source, category, difficulty, topic, tag.\n\nUSE WHEN: showing catalog overview, picking a category programmatically, building landing copy, deciding \"do we have enough X-content for this quiz\".\n\nOUTPUT FIELDS:\n- total: approved questions in 'en' + 'pl'.\n- byLanguage: { en: N, pl: N }.\n- bySource: { entityq: N, mintaka: N, 'kqa-pro': N, ... } — 12 keys, one per source database.\n- byDifficulty: { trivial: N, easy: N, medium: N, hard: N, expert: N, unrated: N } — null difficulty mapped to 'unrated'. trivial/expert populated by LLM calibration.\n- byCategory: top 24 with localized names.\n- byTopic / byTag: top 30 curated topics + top 30 tags with localized labels.\n- meta: { generatedAt: ISO 8601, language }.\n\nINPUTS: lang (default \"en\") affects byCategory[].name and byTopic[].label / byTag[].label.\n\nDATA FRESHNESS: snapshot regenerated daily (~03:00 UTC) + on demand after batch imports. generatedAt shows when. Counts stable ±0.01% between snapshots.\n\nCOMMON MISTAKES: polling stats every request (cache it on your side; 5-min Redis TTL on ours); treating bySource keys as stable enum (use quizbase_languages / quizbase_categories for canonical input enums).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lang": {
"default": "en",
"description": "Language for localized labels in `byCategory[].name`, `byTopic[].label`, `byTag[].label`. Default \"en\". Supported: en, pl. Numeric counts (total, byLanguage, bySource, byDifficulty) are language-agnostic.",
"enum": [
"en",
"pl"
],
"type": "string"
}
},
"type": "object"
},
"name": "quizbase_stats",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"byCategory": {
"description": "Top 24 categories with localized names and counts.",
"items": {
"additionalProperties": {},
"properties": {
"slug": {
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"type": "array"
},
"byDifficulty": {
"additionalProperties": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"description": "Count per difficulty bucket (trivial / easy / medium / hard / expert / unrated).",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"byLanguage": {
"additionalProperties": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"description": "Count per language code.",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"bySource": {
"additionalProperties": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"description": "Count per source database (12 keys).",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"byTag": {
"description": "Top 30 raw tags with localized labels.",
"items": {
"additionalProperties": {},
"properties": {
"slug": {
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"type": "array"
},
"byTopic": {
"description": "Top 30 curated topics with localized labels.",
"items": {
"additionalProperties": {},
"properties": {
"slug": {
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"type": "array"
},
"meta": {
"additionalProperties": {},
"description": "Snapshot metadata: generation timestamp and echoed language.",
"properties": {
"generatedAt": {
"type": "string"
},
"language": {
"type": "string"
}
},
"required": [
"generatedAt",
"language"
],
"type": "object"
},
"total": {
"description": "Approved questions count across all supported languages.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"total",
"byLanguage",
"bySource",
"byDifficulty",
"byCategory",
"byTopic",
"byTag",
"meta"
],
"type": "object"
}
},
{
"description": "Raw subcategory dump (LLM-organic kebab-case, middle taxonomy layer between category and tags) with display label and count. USE WHEN: navigating between top-level category and individual tags, exploring topic structure. Filter questions via quizbase_random?subcategory=<slug>. INPUTS: q, cursor, limit (max 500).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"description": "Opaque pagination cursor from previous `meta.nextCursor`. Omit for page 1.",
"type": "string"
},
"lang": {
"default": "en",
"description": "Language for subcategory `label` (ISO 639-1). Default \"en\". Supported: en, pl. Slugs language-agnostic.",
"enum": [
"en",
"pl"
],
"type": "string"
},
"limit": {
"default": 100,
"description": "Page size (1-500, default 100).",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"q": {
"description": "Substring search across subcategory slug + label (case-insensitive). Useful for partial discovery.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "quizbase_subcategories",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"meta": {
"additionalProperties": {},
"description": "Pagination metadata: count returned, total available, cursor for next page.",
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"language": {
"type": "string"
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"total": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"count",
"total",
"language",
"nextCursor"
],
"type": "object"
},
"subcategories": {
"description": "Subcategories on this page with localized labels and per-subcategory counts.",
"items": {
"additionalProperties": {},
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"label": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"label",
"count"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"subcategories",
"meta"
],
"type": "object"
}
},
{
"description": "Raw tag dump (10k+ entries) with display label and question count. USE WHEN: building a tag picker, searching \"is X a tag\", running analytics. Curated higher-level groupings → quizbase_topics. INPUTS: q (substring), cursor, limit (max 500).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"description": "Opaque pagination cursor from previous `meta.nextCursor`. Omit for page 1. Stop when null.",
"type": "string"
},
"lang": {
"default": "en",
"description": "Language for tag `label` (ISO 639-1). Default \"en\". Supported: en, pl. Slugs are language-agnostic canonical identifiers.",
"enum": [
"en",
"pl"
],
"type": "string"
},
"limit": {
"default": 100,
"description": "Page size (1-500, default 100).",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"q": {
"description": "Substring search across tag slug + label (case-insensitive). Use to find specific tags by partial name.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "quizbase_tags",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"meta": {
"additionalProperties": {},
"description": "Pagination metadata: count returned, total available, cursor for next page.",
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"language": {
"type": "string"
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"total": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"count",
"total",
"language",
"nextCursor"
],
"type": "object"
},
"tags": {
"description": "Tags on this page with display labels and per-tag question counts.",
"items": {
"additionalProperties": {},
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"label": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"label",
"count"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"tags",
"meta"
],
"type": "object"
}
},
{
"description": "Fetch one curated topic with facets (byCategory, byDifficulty, byLanguage, coOccurringTags, coOccurringSubcategories) and 3 sample questions. USE WHEN: zooming into a topic, deciding multi-round quiz structure. Returns {topic: null, error: \"not_found\"} when slug is unknown.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lang": {
"default": "en",
"description": "Language for `topic.label` and sample question text (ISO 639-1). Default \"en\". Supported: en, pl. Numeric facet counts language-agnostic.",
"enum": [
"en",
"pl"
],
"type": "string"
},
"slug": {
"description": "Curated topic slug (kebab-case) — e.g. `star-wars`, `world-war-ii`, `programming-languages`. List all via `quizbase_topics`. Aliases resolve automatically (e.g. `sw` → `star-wars`).",
"minLength": 1,
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "quizbase_topic_by_slug",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"error": {
"description": "Error code when topic is null (e.g. `not_found`).",
"type": "string"
},
"facets": {
"additionalProperties": {},
"description": "Facet breakdowns: byCategory, byDifficulty, byLanguage, coOccurringTags, coOccurringSubcategories.",
"properties": {},
"type": "object"
},
"meta": {
"additionalProperties": {},
"description": "Response metadata.",
"properties": {
"language": {
"type": "string"
}
},
"required": [
"language"
],
"type": "object"
},
"samples": {
"description": "Up to 3 sample questions matching this topic.",
"items": {
"additionalProperties": {},
"properties": {
"id": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"type": "array"
},
"topic": {
"anyOf": [
{
"additionalProperties": {},
"properties": {
"label": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"label"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Topic detail with metadata. Null if slug not found."
}
},
"required": [
"topic"
],
"type": "object"
}
},
{
"description": "Discover curated topics (2,184 entries with aliases). USE WHEN: planning a multi-round quiz, exploring \"what is available about X\", showing topic browser. Sorted by count DESC, slug ASC. Cursor-paginated. INPUTS: q (substring on label/alias), kind (tag|subcategory), cursor, limit (max 500).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"description": "Opaque pagination cursor from previous `meta.nextCursor`. Omit for page 1; pass last response's `meta.nextCursor` for next pages. Stop when `nextCursor` is null.",
"type": "string"
},
"kind": {
"description": "Filter by underlying taxonomy origin. `tag` returns topics resolving to tag-level slugs (proper nouns, specific entities). `subcategory` returns topics resolving to broader subcategory groupings. Omit for all.",
"enum": [
"tag",
"subcategory"
],
"type": "string"
},
"lang": {
"default": "en",
"description": "Language for `label` field in each topic (ISO 639-1). Default \"en\". Supported: en, pl. Slugs themselves are language-agnostic (canonical).",
"enum": [
"en",
"pl"
],
"type": "string"
},
"limit": {
"default": 100,
"description": "Page size (1-500, default 100). Higher = fewer round-trips.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"q": {
"description": "Substring search across topic label, slug, and aliases (case-insensitive). Use to find a curated topic by partial name — e.g. `q=star` returns `star-wars`, `star-trek`, `stars-and-astronomy`.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"name": "quizbase_topics",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"meta": {
"additionalProperties": {},
"description": "Pagination metadata: count returned, total available, cursor for next page.",
"properties": {
"count": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"language": {
"type": "string"
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"total": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"count",
"total",
"language",
"nextCursor"
],
"type": "object"
},
"topics": {
"description": "Topics on this page with localized labels, counts, and underlying kind.",
"items": {
"additionalProperties": {},
"properties": {
"label": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"label"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"topics",
"meta"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:6fef3a8f460513ccb0bc4d0a4e7f89ccd5cd67cffd7c5208ae7221ce5968a625 | sha256sum