# QuizBase (remote · quizbase.runriva.com)

MCP server for trivia: 1.4M+ questions (EN+PL), 24 categories, 12 tools + 4 prompts, OAuth 2.1.

- Trust score: 82/100 (high trust)
- Change this week: +8
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `quizbase.runriva.com`: 82/100 (this document), [markdown](https://verifymcp.io/servers/com-runriva-quizbase-mcp/quizbase.md), [page](https://verifymcp.io/servers/com-runriva-quizbase-mcp/quizbase)

## Channel facts

- Endpoint: `https://quizbase.runriva.com/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `0.1.1`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 97/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - 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.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 72/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http com-runriva-quizbase-mcp https://quizbase.runriva.com/mcp
```

### Codex

```toml
[mcp_servers.com-runriva-quizbase-mcp]
url = "https://quizbase.runriva.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-runriva-quizbase-mcp": {
      "type": "remote",
      "url": "https://quizbase.runriva.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-runriva-quizbase-mcp --url https://quizbase.runriva.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-runriva-quizbase-mcp:
    url: "https://quizbase.runriva.com/mcp"
```

### Other

```json
{
  "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.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 82, +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.

### 2026-07-31 (score 81, +6)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 75, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 75, +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.

### 2026-07-27 (score 74, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 73)

First indexed and scored.

## MCP tools (12)

### `quizbase_random` (~1456 tokens)

Get random trivia questions

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…

Input parameters:

- `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).

Output parameters:

- `meta` (object): Response metadata: how many questions returned and which language.
- `questions` (array): Array of trivia questions, each carries full per-record attribution.

### `quizbase_list` (~1647 tokens)

Browse questions catalog with cursor pagination

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…

Input parameters:

- `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)

Output parameters:

- `meta` (object): Pagination metadata: count of returned rows, total (exact match count, only when count=exact), nextCursor (null = end), language echoed.
- `questions` (array): Array of trivia questions for the current page, each with full attribution.

### `quizbase_question_by_id` (~223 tokens)

Get a single question by UUID

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.

Input parameters:

- `id` (string, required): 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`.

Output parameters:

- `error` (string): Error code when question is null (e.g. `not_found`).
- `question`: Question object with full attribution and quality flag. Null when not found.

### `quizbase_stats` (~384 tokens)

Get public catalog statistics

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).

Input parameters:

- `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…

Output parameters:

- `byCategory` (array): Top 24 categories with localized names and counts.
- `byDifficulty` (object): Count per difficulty bucket (trivial / easy / medium / hard / expert / unrated).
- `byLanguage` (object): Count per language code.
- `bySource` (object): Count per source database (12 keys).
- `byTag` (array): Top 30 raw tags with localized labels.
- `byTopic` (array): Top 30 curated topics with localized labels.
- `meta` (object): Snapshot metadata: generation timestamp and echoed language.
- `total` (integer): Approved questions count across all supported languages.

### `quizbase_topics` (~298 tokens)

List curated topics with aliases

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).

Input parameters:

- `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`.

Output parameters:

- `meta` (object): Pagination metadata: count returned, total available, cursor for next page.
- `topics` (array): Topics on this page with localized labels, counts, and underlying kind.

### `quizbase_topic_by_slug` (~179 tokens)

Get curated topic detail with facets

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.

Input parameters:

- `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, required): 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`).

Output parameters:

- `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`: Topic detail with metadata. Null if slug not found.

### `quizbase_tags` (~181 tokens)

List raw tags with counts

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).

Input parameters:

- `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.

Output parameters:

- `meta` (object): Pagination metadata: count returned, total available, cursor for next page.
- `tags` (array): Tags on this page with display labels and per-tag question counts.

### `quizbase_subcategories` (~180 tokens)

List raw subcategories with counts

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).

Input parameters:

- `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.

Output parameters:

- `meta` (object): Pagination metadata: count returned, total available, cursor for next page.
- `subcategories` (array): Subcategories on this page with localized labels and per-subcategory counts.

### `quizbase_categories` (~95 tokens)

List all top-level categories

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.

Input parameters:

- `lang` (string): Language for category `name` field (ISO 639-1). Default "en". Supported: en, pl. Slugs are language-agnostic.

Output parameters:

- `categories` (array): All 24 top-level categories with localized names.
- `meta` (object): Response metadata: how many categories returned and which language.

### `quizbase_languages` (~109 tokens)

List supported languages with counts

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.

Input parameters:

- `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.

Output parameters:

- `languages` (array): Supported languages with localized display name and question count per language.
- `meta` (object): Response metadata.

### `quizbase_regions` (~344 tokens)

List region codes (cultural affinity) with counts

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.

Input parameters:

- `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.

Output parameters:

- `meta` (object): Pagination metadata: count returned, total available, cursor for next page.
- `regions` (array): Region codes (cultural affinity) with localized labels, kind (country|cultural), and per-region counts.

### `quizbase_report` (~449 tokens)

Submit a content correction or copyright report

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.

Input parameters:

- `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, required): Report category. `translation` = bad EN→PL or other lang translation. `factual` = incorrect answer / outdated fact. `inappropriate` = offensive content. `attribution` = missing/wrong source credit (C…

Output parameters:

- `ok` (boolean): Always true on success; failures use isError, not this field.
- `reportId` (string): UUID of the recorded report. Use for follow-up references.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-runriva-quizbase-mcp/quizbase#diagnostics

## Score history

- 2026-08-03: 82
- 2026-08-02: 82
- 2026-08-01: 81
- 2026-07-31: 81
- 2026-07-30: 75
- 2026-07-29: 75
- 2026-07-28: 74
- 2026-07-27: 74
- 2026-07-26: 73

## Links

- Remote endpoint: https://quizbase.runriva.com/mcp
- Authorisation metadata: https://quizbase.runriva.com/.well-known/oauth-protected-resource/mcp
- Website: https://quizbase.runriva.com/docs/sdks/mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/com-runriva-quizbase-mcp/quizbase/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-runriva-quizbase-mcp/quizbase/changelog.json
- HTML version of this page: https://verifymcp.io/servers/com-runriva-quizbase-mcp/quizbase
