MCP

The Model Context Protocol (MCP) is a standard that lets AI models and agents call external tools and APIs. Riddle's MCP exposes our API to AI agents, so any action you can do via the API – such as listing, building, editing, and analyzing Riddles – can be triggered from an AI chat.

How to use

When using the Riddle MCP, you have two options for authentication:

  1. Preferred: Via public MCP URL in Claude (using the CIMD (Client ID Metadata Document) protocol)
  2. Via MCP key embedded in the URL

Via public MCP URL in Claude

  • To add the Riddle MCP to your Claude account, navigate to Settings > Connectors > Add custom connector.
  • To add the Riddle MCP to your Claude organization, navigate to Organization settings > Connectors > Add > Custom > Web connector.

In both cases the following dialogue will show: Claude add custom connector dialogue

Enter the following:

  • Name: Riddle MCP
  • URL: https://www.riddle.com/creator/api/v3/mcp

After clicking on add, you are almost ready to use the MCP in your Claude chats: Click on connect afterwards to link your Riddle account with Claude and if necessary, you'll have to log in. Once you're done with this, you can try asking Claude to list the latest, published Riddles from your account to test the connection. You can also use the whoami tool to verify your account and project access.

Via MCP key

If you wish to use the MCP with an MCP key, create one on the API keys page (see the Authentication guide for details). Please make sure to pick a MCP key – regular API keys will not work and will return an error. Personal MCP keys are best suited: they give you access both to your personal project and to all projects in which you have the corresponding AI permissions. If you can only create normal API keys, your user role is missing the required permissions – ask a project administrator to grant them or to issue an MCP key for you.

Once you have your key, append it to the MCP URL as a path segment: https://www.riddle.com/creator/api/v3/mcp/[MCP_KEY]

Replace [MCP_KEY] with your actual key, then add this URL as a custom connector in Claude (same steps as above).

Please note that accessing the MCP via a configured MCP key is inferior to the CIMD option. It requires you to embed your key in the URL, and it is less flexible: you need to create a new MCP key for every Riddle account you want to access. With CIMD, each user authorizes with their own Riddle account instead, so no account has to be pre-configured in the URL.

Available Tools, Resources & Prompts

Note: You can use standard MCP functionality to list tools and resources available to the model; this will include more verbose information, e.g. API parameters. Below is a short summary, but make sure to fetch the MCP's current capabilities to get the most up-to-date information.

Tools (62)

The 62 tools fall into nine categories:

Utility & Account (2)

Test connectivity and check the context of your API key.

ToolDescription
pingConnectivity and authentication test – simply returns "Pong".
whoamiReturns information about the current API key: the authenticated user (ID, email, name) and the linked project/team, if any. Useful to verify authentication and retrieve your user ID or project ID.

Documentation (1)

ToolDescription
reference_getReads the documentation of the MCP server itself: the block types, form field types, result blocks, palette values, response shapes, per-entity defaults and the concept documents the other tools expect. Every riddle://reference/... URI mentioned in a tool description, a tool response or an error message is a topic of this tool, and the content is identical to reading that URI as an MCP resource, so a client that cannot read resources can read them through this tool instead. Start with riddle://reference/index, which lists every address with its exact size. At most 8 topics per call, and riddleType / blockTypes / fieldTypes narrow the large documents before they are sent; see their sizes.

Projects (3)

List projects and fetch project details.

ToolDescription
project_listPaginated list of the projects this token has access to (25 per page, 100 max), with a pagination object to page through accounts with many projects. If it is a project API token, only the project linked to the token will be returned. Returns a trimmed summary (id, name, image) per project.
project_getFetches a single project by its project ID.
project_get_settingsReturns the default Riddle settings of a project - the settings every new Riddle in it starts from, as defaultRiddleSettings (the draft the project owner edits) and publishedDefaultRiddleSettings (what Riddles actually inherit). A large, deeply nested payload - use project_get for a project's name, image and permissions.

Riddle management (14)

Find, read, and manage existing Riddles.

ToolDescription
riddle_listPaginated list of Riddles from a single project – filterable by type, status, tags, origin (API created vs. created by hand), and search term; sortable. For Riddles across all projects, use riddle_account_list instead.
riddle_account_listPaginated list of Riddles across the entire account – the personal project plus all team projects the user has access to.
riddle_getFetches a single Riddle by its UUID as a build configuration: {uuid, type, modifiedAt, build, nextBlockId, warnings, published, context}. build is the same builder config the builder tools accept, so a Riddle can be read, edited and rebuilt; anything it cannot express is reported in warnings. nextBlockId is the block ID a new block may claim in an edit. published describes the live version: null when never published, {"status": "identical", "isLive": true} when the live Riddle is exactly what build describes, and {"status": "differs", "isLive": ..., "build": ..., "warnings": ...} (spelled out in full) when there are unpublished changes. status compares content, isLive says whether the Riddle is online at all, and the two are independent: unpublishing does not clear published back to null (the last published content stays stored), so an unpublished Riddle answers {"status": "identical", "isLive": false}. Read isLive, not status, for "is this online right now". context adds title, features, origin, published state, the Riddle this one was copied from (duplicated), project and preset information. Reads several Riddles in one call with UUIDs, and omit leaves parts of the response out, the only way to make it smaller.
riddle_renameRenames a Riddle (new title by UUID).
riddle_publishPublishes one Riddle (UUID) or up to 100 at once (UUIDs) – each becomes available via its public URL. For a single Riddle the answer is the same envelope riddle_get returns, with the new state under context.published, and omit shrinks it exactly as it does there; for many it is the bulk envelope {bulk, operation, summary, results} with one entry per Riddle. A bulk publish is not atomic and never gives up early: a Riddle that cannot be published is reported as that entry's error while all others are still published.
riddle_unpublishTakes one Riddle or up to 100 offline – the public URL is no longer reachable. A Leaderboard with active connections cannot be unpublished; use riddle_delete on it instead, which is always allowed and cleans the connections up. Same single/bulk response shapes and the same omit support as riddle_publish.
riddle_deleteDeletes one Riddle (UUID) or up to 100 at once (UUIDs). Only Riddles created via the builder, created from a template with riddleTemplate_use, or generated by the Riddle AI can be deleted – context.origin.apiManageable on riddle_get tells you upfront whether a Riddle qualifies. A bulk delete is not atomic and never gives up early. Order does not matter: a Riddle that another item of the same batch still references (a Leaderboard's connected Quiz, a FormSelect's Form) is retried once automatically after the rest of the batch has run, so only a failure that survives the retry is reported as an error.
riddle_get_embed_codeReturns the HTML embed code of a published Riddle.
riddle_qr_codeGenerates a QR code (base64-encoded SVG) for a published Riddle.
riddle_moveMoves up to 100 Riddles into another project (or into the personal project). All-or-nothing: Riddles that reference each other - a Quiz and its Leaderboard, an embedded Form - have to move together, and the error names the ones to add. Needs the transfer permission in both projects. Tags are re-pointed to the destination scope; a tag left behind in the source scope is removed once nothing - no Riddle, no question bank - uses it there any more. The Riddle keeps its own design: a move does not switch it to the destination project's default preset.
riddle_move_checkThe same check without moving anything: which Riddles are movable, which are blocked and by what, the UUIDs to add, and the projects the whole set could go to.
riddle_tag_listThe tags of a project with their usage count ({id, name, count}) - tags are per project. count only counts Riddles: a tag shared with a question bank can show count: 0 and still be in use there. Gives you the tag IDs the riddle_list filters accept.
riddle_tag_addAdds a tag to one Riddle or up to 100 at once, by tag name (created if the project does not have it yet) or tag ID.
riddle_tag_removeRemoves a tag from one Riddle or up to 100 at once. The tag itself is only deleted from the project once nothing - no Riddle, no question bank - uses it any more.

Builder API (11)

Create and edit Riddles with structured parameters (blocks, results, logic, presets, publish settings).

ToolDescription
riddle_builder_quizBuilds a Quiz – question blocks (SingleChoice/MultipleChoice/TextEntry/Order/Flashcard/TypeRush/GuessIt), results with percentage ranges, optional branching logic and leaderboard connection.
riddle_builder_pollBuilds a Poll – block types include SingleChoice, Matrix, Order, Upvote, NPS, RateIt, Swiper, Reaction, TextEntry, and TierList; optional branching logic.
riddle_builder_formBuilds a Form – FormBuilder blocks with field mapping (e.g. Email, Name); result page with dynamic variables such as %fieldname.
riddle_builder_personalityBuilds a Personality quiz – questions with score arrays per answer, at least 2 personalities with title/description/media.
riddle_builder_predictorBuilds a Predictor – blocks of type PickTheWinner or GuessTheScore, optional leaderboard connection.
riddle_builder_minigameBuilds a Minigame – SlotMachine, WheelSpinner (win/loss/free spin with percentages), or Sudoku.
riddle_builder_leaderboardBuilds a Leaderboard – connects up to 10 Quizzes, Predictors, or Minigames (Name and Email fields required); optional email validation.
riddle_builder_storyBuilds a Story – general content blocks (Content/Ad/Quote), the InteractiveGraphic block and form fields, one optional result page, no questions or scoring; optional linear-only branching logic.
riddle_builder_placeholderBuilds a Placeholder – a Riddle with no content of its own, only a routing rule saying which other Riddle (or which Riddle carrying a given tag) is shown in its place. Needs the Placeholder feature. The rule is stored, not evaluated here, and comes back re-sorted and window-trimmed rather than verbatim.
riddle_builder_updateEdits an existing Riddle of any type as a merge, not a rebuild: only what you send changes. Blocks are addressed by their ID and can be added ("$create": true), removed ("$delete": true) or reordered (blocksOrder); title, result/results, logic, a Personality Test's personalities, a Leaderboard's riddleConnections and a Placeholder's conditions are replaced as a whole when sent and kept when omitted, while preset and publishSettings merge per key, so only the settings you send change. Only Riddles created with the builder or generated by the Riddle AI can be edited - check context.origin.apiManageable from riddle_get first, which is also where the block IDs are. Returns the edited Riddle in the same envelope riddle_get returns. See Editing Riddles.
riddle_builder_validateDry-runs creates and/or edits – 1 to 20 per call, mixed freely – without creating or changing anything: each entry of builds is validated exactly as the real call would validate it, against a scratch Riddle that is discarded before the answer. Nothing is persisted, published or queued. Media URLs are still checked for reachability with a live request (the file is never downloaded), so an unreachable URL is rejected here too. The answer is {valid, summary, items} with one entry per item, in the order sent, each carrying either the build it would end up with or the errors it would be rejected with – one item's outcome never affects another's. Needed plan: Business or Enterprise. See Validating build configurations.

Templates (5)

Reuse a Riddle as the starting point for new ones – your project's own templates and Riddle's public ones. A template is a copy taken at one moment: the Riddle it was made from keeps living its own life.

ToolDescription
riddleTemplate_createStores an existing Riddle as a template of its project (or of you, for a personal Riddle), so new Riddles can be created from it. It copies what the Riddle currently has stored, published or not; later changes to the Riddle do not reach the template. Requires the template-create permission.
riddleTemplate_listThe templates of a project (or your personal ones) – the ones your Riddles were made into, not Riddle's public ones. Filterable by Riddle type. Returned without the build configuration.
riddleTemplate_publicListRiddle's public, ready-made templates, grouped by category – so calling it without arguments is also how you learn which categories exist. Also filterable by type. An unknown category is rejected with an error naming the categories that are actually allowed, rather than silently returning nothing.
riddleTemplate_getA single template including its build configuration – the same build shape riddle_get returns and the builder tools accept. This is how a template is adapted rather than copied: edit the returned build and build it with the riddle_builder_<type> tool of the template's type, passing the template's id as templateId so the new Riddle is still recorded as coming from it (and starts out on the template's whole preset, layout included). A template whose content has no build-configuration equivalent comes back with an empty build and a warning saying so.
riddleTemplate_useCreates a new Riddle from a template as an unchanged copy – content, settings and design preset – in one call, and records the lineage: reading it back reports the template's Riddle under context.duplicated. The new Riddle is a draft, so call riddle_publish to make it live, and it counts as programmatically created, so riddle_builder_update, palette_customize and riddle_delete work on it (context.origin.apiManageable). Requires the template-use permission plus Riddle-create permission in the target project.

Question banks (19)

Manage the reusable question pools a QuestionBank block of a Quiz or Poll draws from. A bank belongs to one project and to one Riddle type, and its items have a draft/published split of their own: a QuestionBank block always draws from a bank's published state, so a bank has to be published before its questions show up in a Riddle. See Question banks.

ToolDescription
questionBank_createCreates a new, empty bank for a Riddle type (Quiz or Poll) in a project. Its id is what a QuestionBank block references as questionBankId.
questionBank_listPaginated list of the banks of a project (12 per page, 50 max), filterable by search term and tags.
questionBank_templateListThe built-in template banks anyone can duplicate to start with real content. A template that was never published reports itemCount: 0 – judge its real size by draftItemCount.
questionBank_getA single bank: title, riddleType, tags, notes, categories/blockTypes and whether it has unpublished changes. Works on a template id too.
questionBank_getItemsThe items (draft content) of a bank, filterable by search term, blockType, category or difficulty range. Returns everything unless you page it – unlike questionBank_list.
questionBank_renameRenames a bank. Title and notes are metadata outside the draft/publish split, so this takes effect immediately.
questionBank_updateNotesReplaces the bank's internal plain-text notes – for its maintainers, never shown to participants.
questionBank_duplicateCopies a bank (or a template) with all of its items into a new, independent bank, optionally in another project.
questionBank_publishMakes every item's draft content its published content – what a QuestionBank block actually draws. Also the moment a pending delete of a published item is purged for good.
questionBank_discardChangesResets every item back to its last published state, undoing pending deletes as well. Irreversible.
questionBank_deleteDeletes a bank and all of its items. A QuestionBank block still referencing the id afterwards simply draws nothing.
questionBank_addItemAdds one question to a bank's draft. Call questionBank_blockTypeColumns first – there is no universal item shape.
questionBank_updateItemReplaces an item's content entirely (blockType, category, difficulty and all columns). blockType is immutable.
questionBank_deleteItemDeletes one item. A never-published item is gone immediately; a published one keeps being drawn live until the next questionBank_publish.
questionBank_blockTypeColumnsEvery blockType valid for a bank of a given Riddle type, with the exact columns shape addItem/updateItem expects for it – a Quiz SingleChoice and a Poll SingleChoice differ.
questionBank_tagListThe bank tags of a project with usage counts – the tag IDs questionBank_list filters by. Separate from Riddle tags.
questionBank_addTagTags a bank by tag name (created if new) or tag ID.
questionBank_removeTagRemoves a tag from a bank; a tag no bank uses any more is deleted from the project.
questionBank_riddleBlockItemsPreviews which items a QuestionBank block of an existing Riddle would draw right now – criteria matching too little inventory are only a pre-publish warning, so this is how to catch it.

Design & palettes (2)

Read and change the design (colors, fonts, buttons, background) of a Riddle.

ToolDescription
palette_getReads the palettes of a Riddle: every palette it can use (including the ones inherited from the account or project default preset) with all values, which palette is selected, which values this Riddle overrides, and the built-in palettes that can be used as a starting point.
palette_customizeChanges the palette of a single Riddle via a path ⇒ value map, e.g. {"bgColor": "#ffffff", "font.name": "Roboto"}. An inherited palette is never changed for other Riddles - the values are stored as an override on this Riddle, and built-in palettes are duplicated into a Riddle-owned copy automatically. A palette change does not update the Riddle's modifiedAt, matching the Riddle Creator, which does not stamp modifiedAt for a design change either. The new design is only visible on the embedded Riddle after publishing it again. Like riddle_delete, this only works on Riddles created via the builder or generated by the Riddle AI.

Statistics (5)

Views, starts, and submissions on user, project, and Riddle level.

ToolDescription
stats_fetchAggregated stats (views, starts, submissions) for a single period – namespace: project, user, or riddle; omit the dates for all-time stats.
stats_overview_fetchStats in daily intervals for a given date range – ideal for dashboards, graphs, and trend analysis.
stats_riddle_breakdownDetailed breakdown for a specific Riddle – titles, answer choices, views, time spent, and submissions.
stats_project_breakdownStats breakdown for a specific project.
stats_user_breakdownStats breakdown for the authenticated user across all accessible projects – requires a user API key (will fail with project API keys).

Resources (67 documents)

Every reference document has an address of the form riddle://reference/..., and each address is readable two ways with identical content: as an MCP resource (resources/read), and through the reference_get tool (topics: ["riddle://reference/..."], up to 8 addresses per call). Most clients do not expose resources to the model, which is what the tool is for.

The catalogue has three parts: an index, twelve single documents, and three families that generate one address per entity.

Start at the index

ResourceURISizeDescription
reference-indexriddle://reference/index4 KB / ~1k tokensEvery address of this server with a one-line summary and its exact size in bytes, the generated per-entity addresses included.

Read it first when you do not know which document you need. It is by far the smallest, its sizes are the same numbers resources/list advertises, and they are measured on the JSON a read actually returns, so a plan made from the index is a plan that holds.

Single documents (12)

One written document each, at a fixed address.

ResourceURISizeDescription
getting-startedriddle://reference/getting-started6 KB / ~1.4k tokensWhat the server is for, the two API key types, the guided prompts, and the addresses of the concept documents. Start here when you do not know which tool to reach for
response-formatriddle://reference/response-format4 KB / ~1k tokensThe {uuid, type, modifiedAt, build, nextBlockId, warnings, published, context} envelope every Riddle-returning tool answers with, and the bulk envelope
riddle-typesriddle://reference/riddle-builder/riddle-types15 KB / ~3.9k tokensAll 9 Riddle types with their required and optional build fields, result structure and scoring settings
block-typesriddle://reference/riddle-builder/block-types48 KB / ~12k tokensEvery question and content block type per Riddle type. The reference for writing blocks
form-field-typesriddle://reference/riddle-builder/form-field-types7 KB / ~1.7k tokensAll 18 form field types of the FormBuilder block
result-blocksriddle://reference/riddle-builder/result-blocks12 KB / ~3k tokensAll 12 result page block types with their properties, format options and styling
palette-fieldsriddle://reference/palette/fields15 KB / ~3.8k tokensEvery palette value palette_customize accepts, where it is used and which CSS variable it renders into
palette-built-inriddle://reference/palette/built-in-palettes22 KB / ~5.6k tokensThe built-in palettes with all of their values, as starting points for a custom one
palette-fontsriddle://reference/palette/fonts6 KB / ~1.4k tokensThe font families available as font.name, plus self-hosted and Google/Typekit fonts
publish-defaultsriddle://reference/publish-defaults3 KB / ~0.8k tokensThe resolved default of every publish.<name> setting a read-back leaves out. One address, because they are the same for every Riddle type
form-field-defaultsriddle://reference/form-field-defaults22 KB / ~5.7k tokensWhat every form field type accepts and defaults to, keyed by field type. fieldTypes narrows it to the ones you are building
question-bank-overviewriddle://reference/question-bank/overview4 KB / ~1.1k tokensWhat a question bank is, its draft/publish model, and the filters a QuestionBank block draws with

Families (3)

A family is a URI template. Replace the {variable} with a member name to get an address, for example riddle://reference/block-defaults/SingleChoice. Every member name and its exact size is listed in the index.

FamilyURI templateAddressesTotal sizeDescription
block-defaultsriddle://reference/block-defaults/{blockType}2746 KBPer block type: the constraint set its build configuration is checked against (types, required properties, enum values, sizes, whether a collection merges by id) and the resolved default of every property a read-back omits. Both generated from the block itself. Members: Ad, Content, Quote, SingleChoice, MultipleChoice, TextEntry, Flashcard, Order, TypeRush, GuessIt, QuestionBank, FormBuilder, FormField, Upvote, Matrix, NetPromoterScore, Swiper, RateIt, Reaction, TierList, ThisOrThat, GuessTheScore, PickTheWinner, SlotMachine, WheelSpinner, Sudoku, InteractiveGraphic
riddle-defaultsriddle://reference/riddle-defaults/{riddleType}928 KBPer Riddle type: the constraint set of the Riddle-level properties, plus their defaults and the defaults of that type's preset. Members: the 9 Riddle types
conceptsriddle://reference/concepts/{concept}19102 KBOne address per subject that is not an entity, so no entity document has to repeat it. Members: tools-by-category, workflows, editing, merge-semantics, defaults, response-envelope, warnings, bulk, common-block-properties, result-pages, form-fields-usage, logic, preset, publish, limits, unknown-properties, move-restrictions, question-bank-items, troubleshooting

Note: The defaults families replaced the single riddle://reference/riddle-builder/block-defaults document, which held every block type of every Riddle type at once. One block type is now one address of 1 to 4 KB instead of a 53 KB read.

These documents are large - read them selectively

The whole catalogue is 339 KB, roughly 85k tokens, which is a substantial part of a model's context window before a single Riddle has been built. It is written to be read one address at a time, not loaded wholesale.

  • Read the index first. It is ~1k tokens and it names the exact cost of everything else. Guessing which document you need and reading the wrong one costs far more than that.
  • Never fetch everything. reference_get accepts at most 8 topics per call and rejects a longer list rather than returning a huge response.
  • block-types is the expensive one at ~12k tokens, followed by form-field-defaults and palette-built-in. riddle-types plus block-types is the usual pair before building. Add form-field-types only for a Riddle with a form, result-blocks only when you style a result page.
  • Read one entity, not a family. For defaults and constraints of the block you are configuring, read that block's own address (riddle://reference/block-defaults/Matrix, ~1.5 KB), never the whole family.
  • Let the server slice the big ones. reference_get takes riddleType, blockTypes and fieldTypes: asking for block-types with riddleType: ["Quiz"] drops every other type's blocks before the document is sent, while the shared conventions are kept. Filtering is far cheaper than receiving all 9 Riddle types and ignoring 8. These filters do not apply to the two defaults families, where the address already is the filter.
  • Prefer the cheaper source when there is one. For defaults of a block you have already built, riddle_get's per-block omittedDefaults costs less than any reference read. For palettes, palette_get returns the Riddle's actual values, so palette-fields is only needed to look up a path you want to write.
  • Fetch once per session. Content changes only when the server is updated, so re-reading the same address in one conversation is pure token cost. The exception is a VALIDATION_ERROR, where re-reading the relevant document is exactly the right move.

Guided workflows (12)

The MCP server also ships prompts: ready-made workflows that chain the tools above in the right order and ask you for the few things they cannot know (brand colors, the URL, which project). Pick one in your MCP client instead of describing the whole job yourself.

PromptWhat it does
build_LeadGenQuizA lead-generation Quiz: entertaining questions, a form block that collects contact data before the result, optional double opt-in, published and ready to embed.
build_LeadFormA standalone lead form (newsletter, registration, contact): the right field types, GDPR consent, double opt-in and a confirmation email.
build_ProductRecommenderA "which one fits me" product or plan recommender as a Personality test - each product is a personality, every result links to its page.
build_GatedContentStoryA gated content Story: teaser sequence, form gate in the middle, the asset behind it.
build_PredictorWithLeaderboardA prediction game with a public ranking: a Predictor for the picks, a connected Leaderboard, and the scoring rules.
build_QuizContestWithLeaderboardA quiz contest (e.g. a daily quiz) with a ranked Leaderboard: timed and scored questions, one entry per participant, a live ranking.
restyle_ToBrandRestyles a Riddle to brand colors and fonts and publishes so the change reaches the embed.
organize_LibraryCleans up the library: find Riddles by filter, tag them, publish or unpublish the set, move them once the move is verified as possible.
localize_RiddleLocalizes a Riddle: read it as a build configuration, create the translated counterpart with the language set, keep the two in sync.
setup_DataLayerTrackingInstruments a Riddle for analytics: tracking networks, which events they fire, dataLayer pushes, publish.
analyze_CampaignPerformanceReports on a campaign: collect its Riddles, pull views/starts/submissions plus the daily trend, turn it into a funnel and next steps.
optimize_RiddleOptimizes a Riddle against its own stats: find the drop-offs, propose fixes, apply them as a merge edit and publish.

Builder capabilities

The riddle_builder_* tools do more than their short descriptions suggest. Beyond the required title and blocks, most builder tools accept optional parameters that unlock the same power available in the Creator:

  • Branching logic (logic): Define a conditional flow over your blocks instead of a fixed linear order – route users to different blocks based on their answers, and merge paths back together. Supported by Quiz, Poll, and Form.
  • Design presets (preset): Base the Riddle on an existing design/preset and override settings such as color palette, language, "remember user", and auto-open/auto-close dates. Supported by all types except Leaderboard.
  • Publish automation (publish): Configure what happens on publish: double opt-in (DOI), email automation, tracking (pixels, analytics), data layer items, showcase visibility, and third-party integrations. Supported by all types except Leaderboard. Not to be confused with the builder tools' own top-level publish boolean, which publishes the Riddle right away.
  • Leaderboard connections (leaderboard / riddleConnections): Attach a Quiz, Predictor, or Minigame to one or more leaderboards on creation, or create a Leaderboard that connects to existing Riddles (which must have Name and Email fields).
  • Publish & queue (publish, queue): Publish the Riddle immediately after creation instead of leaving it as a draft, and/or process the creation asynchronously.
  • Project targeting (project): Create the Riddle in a specific project, in your personal project, or in the currently selected project.
  • Reading Riddles back (riddle_get): Every Riddle - not only the ones created via the API - can be read back as exactly this builder config, so an agent can inspect an existing Riddle, change a detail and rebuild it. What a builder config cannot express is listed in warnings instead of being silently dropped.
  • Editing Riddles (riddle_builder_update): Change an existing Riddle instead of rebuilding it - blocks are addressed by their ID, only what you send changes, and blocks can be added, removed or reordered. Limited to Riddles created with the builder or generated by the Riddle AI (context.origin.apiManageable). See Editing Riddles.
  • Routing instead of content (riddle_builder_placeholder): Build a Placeholder - embed one Riddle and decide by rule, tag or time window which Riddle actually shows.
  • Questions from a bank (QuestionBank block): Instead of authoring questions on the Riddle, let a Quiz or Poll draw them at view time from a question bank - filtered by category and difficulty, and optionally re-drawn on an interval. The bank itself is managed with the questionBank_* tools.
  • Restyling (palette_get / palette_customize): Read the full design of a Riddle and change individual palette values without touching the design of any other Riddle.
  • Checking before building (riddle_builder_validate): Dry-run up to 20 creates and/or edits in one call - the same validation, nothing created or changed - to find out whether a configuration would be accepted, and why not, before spending a real call on it. See Validating build configurations.
  • Starting from a template (riddleTemplate_*): Copy a template as-is with riddleTemplate_use, or read it with riddleTemplate_get and build the edited configuration with the builder tool of its type, passing templateId so the new Riddle keeps the template's preset and its lineage.

Read riddle://reference/riddle-builder/riddle-types and block-types for the fields and formats each of these takes, the block's own riddle://reference/block-defaults/{blockType} address for its constraints and defaults, and riddle://reference/concepts/{concept} for the rules that span tools (editing, merging, presets, publishing, logic, limits). Listing the tools via standard MCP functionality gives you their parameter schemas.

Keeping the context small

An MCP conversation pays for every token it receives, and a few of these tools can answer with a lot. These are the levers – they matter for you in a chat, and they matter much more for an agent that runs unattended over many calls.

  • Leave out what you will not read (omit). Every tool that answers with a Riddle – riddle_get, all riddle_builder_* tools, riddle_publish, riddle_unpublish – accepts omit to drop parts of the answer: build, warnings, nextBlockId, published, context, and build.omittedDefaults. That last one is the big one: the per-block default maps are most of a read-back, so omit: ["build.omittedDefaults"] alone can shrink the response by an order of magnitude. Only fetching a title? omit: ["build", "published", "warnings", "nextBlockId"].
  • Scope the reference documents instead of loading them. The catalogue is ~85k tokens in total. Read riddle://reference/index (~1k tokens) to see what each address costs, then ask reference_get for the one or two the current step needs, narrowed with riddleType / blockTypes / fieldTypes, and read them once per conversation. For a single block type, read its own block-defaults address rather than a big document. See the note above.
  • One call instead of a loop. riddle_get, riddle_publish, riddle_unpublish, riddle_delete and the tag tools take a list (UUIDs, up to 100). One bulk call carries one envelope and one round of tool overhead rather than a hundred.
  • Edit instead of rebuilding. riddle_builder_update is a merge: to fix one question you send that one block, not the whole Riddle. Reading with omit: ["build.omittedDefaults"] and sending back the single block that changed is the cheapest edit loop there is.
  • Dry-run in batches. riddle_builder_validate checks up to 20 configurations in a single call. Twenty real builds that each fail cost twenty error responses – and twenty Riddles to clean up.
  • Filter at the source. riddle_list, riddle_account_list, questionBank_list and questionBank_getItems all take filters, a search term and a page size. Narrowing the query beats fetching a broad list and discarding most of it.
  • Pick the smaller tool for the question. project_get for a project's name and permissions, not project_get_settings (a deeply nested payload). riddle_get's per-block omittedDefaults for the defaults of a block you already have, not a reference read. palette_get for a Riddle's actual design, not the palette reference.
  • Start from a guided workflow. The prompts already chain the tools in the right order, so the model does not have to discover the sequence – and rediscover it after a wrong turn.

Response Format

All responses from the MCP will adhere to the same schema as specified in the API docs for the corresponding endpoint. E.g. the riddle_get tool will return a response with the same schema as the GET /riddle/{riddle_uuid} API endpoint, including all details about the riddle content, design, etc.

Troubleshooting

If you encounter any issues while using the MCP, here are some common troubleshooting steps:

  • API authentication failed: Make sure you are using an MCP key (not a regular API key – re-create if in doubt) and that the URL contains the actual key in place of the [MCP_KEY] placeholder.
  • Missing API permissions: Check if your user role has the necessary AI permissions to access the desired projects and perform the intended actions. If you do not have permission to modify roles, ask your account administrators to grant you the required permissions.

... Still not solved? Please reach out to our support team with details about the issue, either via our support chat or via email, including any error messages received and the steps you have already taken to troubleshoot.

Next steps

Want to continue reading? Read the following API sections to understand the MCP tools in more detail and see example requests and responses for each of them: