QuizBase
REMOTE · QUIZBASE.RUNRIVA.COM · SCANNED AUG 3
MCP server for trivia: 1.4M+ questions (EN+PL), 24 categories, 12 tools + 4 prompts, OAuth 2.1.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security97
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability72
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 5890 tokens (~392/item across 15 items; 12 tools + 3 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · quizbase.runriva.com
claude mcp add --transport http com-runriva-quizbase-mcp https://quizbase.runriva.com/mcp
[mcp_servers.com-runriva-quizbase-mcp] url = "https://quizbase.runriva.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-runriva-quizbase-mcp": {
"type": "remote",
"url": "https://quizbase.runriva.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-runriva-quizbase-mcp --url https://quizbase.runriva.com/mcp --transport streamable-http
mcp_servers:
com-runriva-quizbase-mcp:
url: "https://quizbase.runriva.com/mcp" {
"mcpServers": {
"com-runriva-quizbase-mcp": {
"type": "http",
"url": "https://quizbase.runriva.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Jul 26 +6
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 29 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 73
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://quizbase.runriva.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=runriva.com | CN=YE1,O=Let's Encrypt,C=US | 19 Jul 2026 | 17 Oct 2026 | ECDSA 256 | ECDSA-SHA384 | 55dfea2ff2aeeb53b06b82132c8f1ea9375 |
| SANs: *.runriva.com, runriva.com | ||||||
| CN=YE1,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 5ddd70dd31f801c85c186a7a04b80afe |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
DNSSEC secure
Validation of quizbase.runriva.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| runriva.com. | present | 2371 | 13 | Verified |
| quizbase.runriva.com. | Verified address RRset verified with the apex keys |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer realm="quizbase", resource_metadata="https://quizbase.runriva.com/.well-known/oauth-protected-resource"
Bearer realm="quizbase", resource_metadata="https://quizbase.runriva.com/.well-known/oauth-protected-resource" | Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| x-content-type-options | nosniff |
| x-frame-options | SAMEORIGIN |
| referrer-policy | no-referrer |
| permissions-policy | camera=(), microphone=(), geolocation=(), payment=(self "https://js.stripe.com" "https://checkout.stripe.com"), fullscreen=(self), picture-in-picture=(), interest-cohort=(), browsing-topics=(), attribution-reporting=(), private-state-token-issuance=(), private-state-token-redemption=() |
Protected resource metadata
| Document | https://quizbase.runriva.com/.well-known/oauth-protected-resource |
|---|---|
| Retrieved | Yes |
| Resource | https://quizbase.runriva.com/mcp |
| Authorisation server | https://quizbase.runriva.com |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://quizbase.runriva.com/mcp | Verified | 200 | |
| http (plaintext) | http://quizbase.runriva.com/mcp | HTTPS enforced | 301 | https://quizbase.runriva.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
quizbase_categories List all top-level categories ~95
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.
| Name | Type | Req | Description |
|---|---|---|---|
| lang | string | — | Language for category `name` field (ISO 639-1). Default "en". Supported: en, pl. Slugs are language-agnostic. |
| Name | Type | Req | Description |
|---|---|---|---|
| categories | array | yes | All 24 top-level categories with localized names. |
| meta | object | yes | Response metadata: how many categories returned and which language. |
No examples provided.
quizbase_languages List supported languages with counts ~109
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.
| Name | Type | Req | Description |
|---|---|---|---|
| lang | string | — | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| languages | array | yes | Supported languages with localized display name and question count per language. |
| meta | object | yes | Response metadata. |
No examples provided.
quizbase_list Browse questions catalog with cursor pagination ~1,647
Cursor-paginated browse over the catalog. Quality-first: by default excludes questions flagged for review (use quality='all' for full pool). USE 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). PAGINATION: stable cursor over id UUIDv7 DESC. First call: omit cursor. Next: pass meta.nextCursor. Stop when nextCursor is null. KEY FILTERS (full parity with REST): - lang: ISO 639-1, default "en". Supported: en, pl. - category (slug), difficulty (trivial|easy|medium|hard|expert — LLM-calibrated), type (multiple|boolean), subcategory (raw slug). - tags (AND), tags_any (OR, max 10): raw tag slugs. - topic (curated, alias resolver), topics_any (OR over curated): higher precision than tags. - 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. - source (array): include only these of 12 (opentdb, opentriviaqa, kqa-pro, entityq, mintaka, mkqa, nq-open, creak, qasc, arc, webq, quizbase). - exclude_source (array): drop these sources, e.g. ["entityq"]. Applied after source. - license (SPDX): e.g. CC-BY-SA-4.0, MIT. - 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'). - updated_since (ISO 8601): only questions updated after this — for delta sync caches. BATCH + TRANSLATION MAPPING: - 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. - content_language (en|pl): with ids, returns each question's…
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | — | Top-level category slug (kebab-case) — e.g. `geography`, `history`, `science-and-nature`. 24 total. Use `quizbase_categories` for canonical list with localized names. |
| content_language | string | — | 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… |
| count | string | — | 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). |
| cursor | string | — | 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. |
| difficulty | string | — | 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 plac… |
| exclude_source | array | — | Exclude these source databases, e.g. `["entityq"]`. Use to drop noisy auto-generated sources. Applied after `source` if both are present. |
| ids | array | — | 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… |
| lang | string | — | Question language as ISO 639-1 code. Default "en". Supported: en, pl. Translated rows share the same `id` across languages. |
| license | string | — | SPDX license string (e.g. CC-BY-SA-4.0, MIT). Filter for redistribution-friendly content. |
| limit | integer | — | Page size (1-100, default 20). Larger pages reduce round-trips but increase latency. |
| quality | string | — | 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 fo… |
| regions | array | — | 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 geogra… |
| source | array | — | 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`. |
| subcategory | string | — | Raw subcategory slug (kebab-case). Prefer `topic` for OR + alias resolver. |
| tags | array | — | AND-logic: question must have ALL these tag slugs (kebab-case) |
| tags_any | array | — | OR-logic: question must have AT LEAST ONE of these tag slugs |
| topic | string | — | Curated topic slug — alias resolver matches subcategories and tags |
| topics_any | array | — | OR-logic over curated topic slugs (resolves aliases) |
| type | string | — | "multiple" = 1 correct + 3 distractors. "boolean" = True/False. |
| updated_since | string | — | ISO 8601 timestamp — return only questions updated after this (delta sync) |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | yes | Pagination metadata: count of returned rows, total (exact match count, only when count=exact), nextCursor (null = end), language echoed. |
| questions | array | yes | Array of trivia questions for the current page, each with full attribution. |
No examples provided.
quizbase_question_by_id Get a single question by UUID ~223
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Question UUID (v7 format). Stable across language translations — the same UUID may exist in multiple languages with different text but same canonical answer. |
| lang | string | — | 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`. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | — | Error code when question is null (e.g. `not_found`). |
| question | — | yes | Question object with full attribution and quality flag. Null when not found. |
No examples provided.
quizbase_random Get random trivia questions ~1,456
Fetch N random trivia questions matching filters. Quality-first: by default excludes questions flagged for review (use quality='all' to include for audit/research). USE 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). KEY FILTERS: - amount: 1-50, default 10. - lang: ISO 639-1. Default "en". Supported: en, pl. Strict — unknown language returns 400. - category (slug): e.g. geography, history, science-and-nature. Full list via quizbase_categories. - difficulty: trivial | easy | medium | hard | expert. LLM-calibrated. Records not yet LLM-rated hold the importer placeholder (mostly "medium" for factoid sources). - type: multiple | boolean (default both; no text_input in random). - 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. - 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). - exclude_source (array): drop these sources, e.g. ["entityq"] for human-curated only. Applied after source. - license (SPDX): CC-BY-SA-4.0 | CC-BY-SA-3.0 | MIT | etc. Restrict to redistribution-friendly content. - topic (curated slug): higher precision than tags. Alias resolver matches subcategories+tags. List via quizbase_topics. - topics_any: OR over curated topics, max 10. - tags (AND), tags_any (OR), subcategory: raw taxonomy. Use topic if available. - 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…
| Name | Type | Req | Description |
|---|---|---|---|
| amount | integer | — | 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. |
| category | string | — | 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. |
| difficulty | string | — | 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 plac… |
| exclude | array | — | 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. |
| exclude_source | array | — | 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. |
| lang | string | — | 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`). |
| license | string | — | 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`. |
| quality | string | — | 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 everyth… |
| regions | array | — | 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 geogra… |
| source | array | — | 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. |
| subcategory | string | — | Raw subcategory slug (kebab-case). Prefer `topic` for OR semantics + alias resolver. |
| tags | array | — | AND-logic: question must have ALL these tag slugs (kebab-case) |
| tags_any | array | — | OR-logic: question must have AT LEAST ONE of these tag slugs |
| topic | string | — | Curated topic slug — alias resolver matches subcategories and tags |
| topics_any | array | — | OR-logic over curated topic slugs (resolves aliases) |
| type | string | — | "multiple" = 1 correct + 3 distractors. "boolean" = True/False (Prawda/Fałsz in pl). |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | yes | Response metadata: how many questions returned and which language. |
| questions | array | yes | Array of trivia questions, each carries full per-record attribution. |
No examples provided.
quizbase_regions List region codes (cultural affinity) with counts ~344
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | — | Opaque pagination cursor from previous `meta.nextCursor`. Omit for page 1. |
| kind | string | — | 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 bo… |
| lang | string | — | Language for region `label` (ISO 639-1). Default "en". Supported: en, pl. Codes themselves language-agnostic. |
| limit | integer | — | Page size (1-500, default 100). Catalog has ~150 distinct codes per language. |
| q | string | — | Substring search on region code + label (case-insensitive). E.g. `q=jew` returns `jewish` cultural code. |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | yes | Pagination metadata: count returned, total available, cursor for next page. |
| regions | array | yes | Region codes (cultural affinity) with localized labels, kind (country|cultural), and per-region counts. |
No examples provided.
quizbase_report Submit a content correction or copyright report ~449
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.
| Name | Type | Req | Description |
|---|---|---|---|
| comment | string | — | 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… |
| questionId | string | — | Question UUID (v7) being reported. Highest-fidelity identifier — use when you have it. At least one of `questionId`, `questionText`, `questionUrl` is required. |
| questionText | string | — | Full or partial question text (10-2000 chars) when UUID is not available. Used by moderators to locate the record. Lower fidelity than `questionId`. |
| questionUrl | string | — | 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. |
| reporterEmail | string | — | Reporter email for follow-up (optional). Use when you have user consent — we may contact for clarification if the report is unclear. |
| type | string | yes | Report category. `translation` = bad EN→PL or other lang translation. `factual` = incorrect answer / outdated fact. `inappropriate` = offensive content. `attribution` = missing/wrong source credit (C… |
| Name | Type | Req | Description |
|---|---|---|---|
| ok | boolean | yes | Always true on success; failures use isError, not this field. |
| reportId | string | — | UUID of the recorded report. Use for follow-up references. |
No examples provided.
quizbase_stats Get public catalog statistics ~384
Public catalog counters with live breakdowns by language, source, category, difficulty, topic, tag. USE WHEN: showing catalog overview, picking a category programmatically, building landing copy, deciding "do we have enough X-content for this quiz". OUTPUT FIELDS: - total: approved questions in 'en' + 'pl'. - byLanguage: { en: N, pl: N }. - bySource: { entityq: N, mintaka: N, 'kqa-pro': N, ... } — 12 keys, one per source database. - byDifficulty: { trivial: N, easy: N, medium: N, hard: N, expert: N, unrated: N } — null difficulty mapped to 'unrated'. trivial/expert populated by LLM calibration. - byCategory: top 24 with localized names. - byTopic / byTag: top 30 curated topics + top 30 tags with localized labels. - meta: { generatedAt: ISO 8601, language }. INPUTS: lang (default "en") affects byCategory[].name and byTopic[].label / byTag[].label. DATA FRESHNESS: snapshot regenerated daily (~03:00 UTC) + on demand after batch imports. generatedAt shows when. Counts stable ±0.01% between snapshots. COMMON 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).
| Name | Type | Req | Description |
|---|---|---|---|
| lang | string | — | Language for localized labels in `byCategory[].name`, `byTopic[].label`, `byTag[].label`. Default "en". Supported: en, pl. Numeric counts (total, byLanguage, bySource, byDifficulty) are language-agno… |
| Name | Type | Req | Description |
|---|---|---|---|
| byCategory | array | yes | Top 24 categories with localized names and counts. |
| byDifficulty | object | yes | Count per difficulty bucket (trivial / easy / medium / hard / expert / unrated). |
| byLanguage | object | yes | Count per language code. |
| bySource | object | yes | Count per source database (12 keys). |
| byTag | array | yes | Top 30 raw tags with localized labels. |
| byTopic | array | yes | Top 30 curated topics with localized labels. |
| meta | object | yes | Snapshot metadata: generation timestamp and echoed language. |
| total | integer | yes | Approved questions count across all supported languages. |
No examples provided.
quizbase_subcategories List raw subcategories with counts ~180
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).
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | — | Opaque pagination cursor from previous `meta.nextCursor`. Omit for page 1. |
| lang | string | — | Language for subcategory `label` (ISO 639-1). Default "en". Supported: en, pl. Slugs language-agnostic. |
| limit | integer | — | Page size (1-500, default 100). |
| q | string | — | Substring search across subcategory slug + label (case-insensitive). Useful for partial discovery. |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | yes | Pagination metadata: count returned, total available, cursor for next page. |
| subcategories | array | yes | Subcategories on this page with localized labels and per-subcategory counts. |
No examples provided.
quizbase_tags List raw tags with counts ~181
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).
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | — | Opaque pagination cursor from previous `meta.nextCursor`. Omit for page 1. Stop when null. |
| lang | string | — | Language for tag `label` (ISO 639-1). Default "en". Supported: en, pl. Slugs are language-agnostic canonical identifiers. |
| limit | integer | — | Page size (1-500, default 100). |
| q | string | — | Substring search across tag slug + label (case-insensitive). Use to find specific tags by partial name. |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | yes | Pagination metadata: count returned, total available, cursor for next page. |
| tags | array | yes | Tags on this page with display labels and per-tag question counts. |
No examples provided.
quizbase_topic_by_slug Get curated topic detail with facets ~179
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.
| Name | Type | Req | Description |
|---|---|---|---|
| lang | string | — | Language for `topic.label` and sample question text (ISO 639-1). Default "en". Supported: en, pl. Numeric facet counts language-agnostic. |
| slug | string | yes | 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`). |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | — | Error code when topic is null (e.g. `not_found`). |
| facets | object | — | Facet breakdowns: byCategory, byDifficulty, byLanguage, coOccurringTags, coOccurringSubcategories. |
| meta | object | — | Response metadata. |
| samples | array | — | Up to 3 sample questions matching this topic. |
| topic | — | yes | Topic detail with metadata. Null if slug not found. |
No examples provided.
quizbase_topics List curated topics with aliases ~298
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).
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | — | 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. |
| kind | string | — | 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. Omi… |
| lang | string | — | Language for `label` field in each topic (ISO 639-1). Default "en". Supported: en, pl. Slugs themselves are language-agnostic (canonical). |
| limit | integer | — | Page size (1-500, default 100). Higher = fewer round-trips. |
| q | string | — | 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`. |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | yes | Pagination metadata: count returned, total available, cursor for next page. |
| topics | array | yes | Topics on this page with localized labels, counts, and underlying kind. |
No examples provided.