[{"slug":"ZV-2026-0633","server_name":"riddle.com","severity":"breaking","title":"riddle.com: Tool questionBank_addItem was removed.","summary":"[breaking] Tool questionBank_addItem was removed. [breaking] Tool questionBank_addTag was removed. [breaking] Tool questionBank_blockTypeColumns was removed. [breaking] Tool questionBank_delete was removed. [breaking] Tool questionBank_deleteItem was removed. [breaking] Tool questionBank_discardChanges was removed. [breaking] Tool questionBank_duplicate was removed. [breaking] Tool questionBank_get was removed. [breaking] Tool questionBank_getItems was removed. [breaking] Tool questionBank_list was removed. [breaking] Tool questionBank_publish was removed. [breaking] Tool questionBank_removeTag was removed. [breaking] Tool questionBank_rename was removed. [breaking] Tool questionBank_riddleBlockItems was removed. [breaking] Tool questionBank_tagList was removed. [breaking] Tool questionBank_templateList was removed. [breaking] Tool questionBank_updateItem was removed. [breaking] Tool questionBank_updateNotes was removed. [breaking] Tool riddle_account_list was removed. [breaking] Tool riddle_builder_form was removed. [breaking] Tool riddle_builder_leaderboard was removed. [breaking] Tool riddle_builder_minigame was removed. [breaking] Tool riddle_builder_personality was removed. [breaking] Tool riddle_builder_placeholder was removed. [breaking] Tool riddle_builder_poll was removed. [breaking] Tool riddle_builder_predictor was removed. [breaking] Tool riddle_builder_quiz was removed. [breaking] Tool riddle_builder_story was removed. [breaking] Tool riddle_move_check was removed. [breaking] Tool riddle_tag_add was removed. [breaking] Tool riddle_tag_remove was removed. [breaking] Tool riddle_unpublish was removed. [breaking] Tool riddleTemplate_get was removed. [breaking] Tool riddleTemplate_use was removed. [breaking] Tool stats_overview_fetch was removed. [breaking] Tool stats_project_breakdown was removed. [breaking] Tool stats_riddle_breakdown was removed. [breaking] Tool stats_user_breakdown was removed. [safe] Tool media_delete was added. [safe] Tool media_uploa","changes":[{"kind":"tool_removed","tool":"questionBank_addItem","detail":"Tool `questionBank_addItem` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_addTag","detail":"Tool `questionBank_addTag` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_blockTypeColumns","detail":"Tool `questionBank_blockTypeColumns` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_delete","detail":"Tool `questionBank_delete` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_deleteItem","detail":"Tool `questionBank_deleteItem` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_discardChanges","detail":"Tool `questionBank_discardChanges` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_duplicate","detail":"Tool `questionBank_duplicate` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_get","detail":"Tool `questionBank_get` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_getItems","detail":"Tool `questionBank_getItems` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_list","detail":"Tool `questionBank_list` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_publish","detail":"Tool `questionBank_publish` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_removeTag","detail":"Tool `questionBank_removeTag` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_rename","detail":"Tool `questionBank_rename` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_riddleBlockItems","detail":"Tool `questionBank_riddleBlockItems` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_tagList","detail":"Tool `questionBank_tagList` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_templateList","detail":"Tool `questionBank_templateList` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_updateItem","detail":"Tool `questionBank_updateItem` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"questionBank_updateNotes","detail":"Tool `questionBank_updateNotes` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_account_list","detail":"Tool `riddle_account_list` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_builder_form","detail":"Tool `riddle_builder_form` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_builder_leaderboard","detail":"Tool `riddle_builder_leaderboard` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_builder_minigame","detail":"Tool `riddle_builder_minigame` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_builder_personality","detail":"Tool `riddle_builder_personality` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_builder_placeholder","detail":"Tool `riddle_builder_placeholder` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_builder_poll","detail":"Tool `riddle_builder_poll` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_builder_predictor","detail":"Tool `riddle_builder_predictor` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_builder_quiz","detail":"Tool `riddle_builder_quiz` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_builder_story","detail":"Tool `riddle_builder_story` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_move_check","detail":"Tool `riddle_move_check` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_tag_add","detail":"Tool `riddle_tag_add` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_tag_remove","detail":"Tool `riddle_tag_remove` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddle_unpublish","detail":"Tool `riddle_unpublish` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddleTemplate_get","detail":"Tool `riddleTemplate_get` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"riddleTemplate_use","detail":"Tool `riddleTemplate_use` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"stats_overview_fetch","detail":"Tool `stats_overview_fetch` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"stats_project_breakdown","detail":"Tool `stats_project_breakdown` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"stats_riddle_breakdown","detail":"Tool `stats_riddle_breakdown` was removed.","severity":"breaking"},{"kind":"tool_removed","tool":"stats_user_breakdown","detail":"Tool `stats_user_breakdown` was removed.","severity":"breaking"},{"kind":"tool_added","tool":"media_delete","detail":"Tool `media_delete` was added.","severity":"safe"},{"kind":"tool_added","tool":"media_upload_link","detail":"Tool `media_upload_link` was added.","severity":"safe"},{"kind":"tool_renamed","tool":"questionBank_create","after":"question_bank_create","before":"questionBank_create","detail":"Tool `questionBank_create` was renamed to `question_bank_create`.","severity":"breaking"},{"kind":"tool_added","tool":"question_bank_delete","detail":"Tool `question_bank_delete` was added.","severity":"safe"},{"kind":"tool_added","tool":"question_bank_discard_changes","detail":"Tool `question_bank_discard_changes` was added.","severity":"safe"},{"kind":"tool_added","tool":"question_bank_get","detail":"Tool `question_bank_get` was added.","severity":"safe"},{"kind":"tool_added","tool":"question_bank_get_items","detail":"Tool `question_bank_get_items` was added.","severity":"safe"},{"kind":"tool_added","tool":"question_bank_item","detail":"Tool `question_bank_item` was added.","severity":"safe"},{"kind":"tool_added","tool":"question_bank_list","detail":"Tool `question_bank_list` was added.","severity":"safe"},{"kind":"tool_added","tool":"question_bank_manage","detail":"Tool `question_bank_manage` was added.","severity":"safe"},{"kind":"tool_added","tool":"question_bank_tag","detail":"Tool `question_bank_tag` was added.","severity":"safe"},{"kind":"tool_added","tool":"riddle_builder_create","detail":"Tool `riddle_builder_create` was added.","severity":"safe"},{"kind":"tool_added","tool":"riddle_tag","detail":"Tool `riddle_tag` was added.","severity":"safe"},{"kind":"tool_renamed","tool":"riddleTemplate_create","after":"riddle_template_create","before":"riddleTemplate_create","detail":"Tool `riddleTemplate_create` was renamed to `riddle_template_create`.","severity":"breaking"},{"kind":"tool_added","tool":"riddle_template_get","detail":"Tool `riddle_template_get` was added.","severity":"safe"},{"kind":"tool_renamed","tool":"riddleTemplate_list","after":"riddle_template_list","before":"riddleTemplate_list","detail":"Tool `riddleTemplate_list` was renamed to `riddle_template_list`.","severity":"breaking"},{"kind":"tool_renamed","tool":"riddleTemplate_publicList","after":"riddle_template_public_list","before":"riddleTemplate_publicList","detail":"Tool `riddleTemplate_publicList` was renamed to `riddle_template_public_list`.","severity":"breaking"},{"kind":"tool_added","tool":"riddle_template_use","detail":"Tool `riddle_template_use` was added.","severity":"safe"},{"kind":"description_changed","tool":"palette_customize","after":"Changes the palette (colors, fonts, button styles, background) of ONE Riddle, as a path => value map, e.g. {\"bgColor\": \"#ffffff\", \"font.name\": \"Roboto\"} - the paths are palette_get's or riddle://reference/palette/fields. Never affects another Riddle: a palette inherited from the account/project default preset is not changed for the others, the values are stored as an override on this one. A built-in palette (\"default:*\") is stored nowhere and is therefore duplicated into a Riddle-owned copy automatically; newPaletteName always works on a copy. Two things to know. The new design only reaches the embedded (live) Riddle after another riddle_publish. And only Riddles created by the riddle_builder_* tools or the Riddle AI can be restyled - one the user built by hand in the Creator is rejected, so check context.origin.apiManageable on riddle_get (or \"origin\" on riddle_list) rather than finding out from the error. A palette write does NOT move modifiedAt/modifiedBy (the Creator does not stamp them for a design change either), so polling those will not notice it: the detector is riddle_get's context.modified.hasChanges, true from the preset side. context.preset.drifted usually moves too but is not reliable alone - it means \"diverged from the PARENT preset\", so on a Riddle whose context.preset.parentId is null it stays false however much you change; read it only alongside parentId.","before":"Changes the palette (colors, fonts, button styles, background) of a single Riddle. Values are given as a path => value map, e.g. {\"bgColor\": \"#ffffff\", \"font.name\": \"Roboto\"} - call palette_get or read riddle://reference/palette/fields for all available paths. Only ever affects the given Riddle: a palette inherited from the account / project default preset is not changed for other Riddles, the new values are stored as an override on this Riddle. Built-in palettes (\"default:*\") are not stored anywhere, so they are duplicated into a Riddle-owned copy automatically; pass newPaletteName to always work on a copy. Two things to know: the new design is only visible on the embedded (live) Riddle after publishing it again with riddle_publish, and only Riddles that were created via the Riddle Builder tools (riddle_builder_*) or generated by the Riddle AI can be restyled - Riddles the user created manually in the Creator are rejected. Check context.origin.apiManageable on riddle_get (or \"origin\" on riddle_list/riddle_account_list) beforehand to know whether a given Riddle qualifies, instead of finding out from the error. A palette write does NOT change the Riddle's modifiedAt/modifiedBy - the Creator itself does not stamp them for a design change either, so a client polling modifiedAt for changes will not notice this. What DOES move is riddle_get's context.preset.drifted (turns true once the Riddle preset diverges from its parent) and context.modified.hasChanges (also true from the preset side) - check those, not modifiedAt, to detect an unpublished design change.","detail":"Description of `palette_customize` changed (38% word delta).","severity":"risky","descriptionDelta":0.375},{"kind":"description_changed","tool":"palette_get","after":"Reads the palettes - colors, fonts, button styles, background settings - of a Riddle: every palette it can use (the ones inherited from the account/project default preset included) with all of their values, which one is selected, which values this Riddle overrides, and the built-in palettes to start from. What each value does is riddle://reference/palette/fields. Mind the size: ~30 values per palette and an account preset can contribute palettes that have nothing to do with this Riddle, so the full response runs into thousands of tokens. Cut it with \"omit\" - omit: [\"paletteValues\"] lists the palettes by uuid and name only, which is how you find WHICH one you want (paletteUUID then returns that one in full), and \"builtInPalettes\"/\"customizedValues\"/\"hints\" drop those keys. To read just the design in effect, pass the selectedPaletteUuid from such a listing as paletteUUID.","before":"Reads the palettes - colors, fonts, button styles and background settings - of a Riddle. Returns every palette the Riddle can use (including the ones inherited from the account / project default preset) with all of its values, which palette is currently selected, which values this Riddle overrides, and the built-in palettes that can be used as a starting point. See riddle://reference/palette/fields for what each value does. Mind the size: a palette carries around 30 values and an account preset can contribute several palettes that have nothing to do with this Riddle, so the full response is easily thousands of tokens. Use \"omit\" to cut it down - omit: [\"paletteValues\"] lists the palettes by uuid and name only, which is how you find out WHICH palette you want (paletteUUID then returns that one in full), and \"builtInPalettes\"/\"customizedValues\"/\"hints\" drop those keys. To just read the design in effect, pass the selectedPaletteUuid from such a listing as paletteUUID.","detail":"Description of `palette_get` changed (19% word delta).","severity":"safe","descriptionDelta":0.19444444444444442},{"kind":"description_changed","tool":"project_get","after":"Returns one project by id - id, name, image and the authenticated user's permission matrix for it. The id comes from project_list or from the \"team\" of riddle_get. The project's default Riddle settings are NOT included; they are a large nested tree with its own tool, project_get_settings.","before":"Returns a single project by its project ID: id, name, image and the permission matrix of the authenticated user for it. The project ID can either be obtained through the project list tool or by taking the \"team\" property of the riddle_get tool. The project's default Riddle settings are NOT included - they are a large nested configuration tree that is rarely what a caller wants from this tool; use project_get_settings for them.","detail":"Description of `project_get` changed (41% word delta).","severity":"risky","descriptionDelta":0.4137931034482759},{"kind":"description_changed","tool":"project_get_settings","after":"Returns the default Riddle settings every new Riddle of the project starts from - PUBLISHED and ENABLED only: \"publishSettings\" (privacy/DOI/OTP, email automation, tracking, data layer, ...) and \"embedSettings\" (iframe sizing, auto-scroll, ...), each holding only the areas whose \"isDefaultEnabled\"/\"isEnabled\" was on in the last published version. Never-published drafts and disabled areas are deliberately left out - this is what applies to Riddles right now, not a way to inspect unpublished or disabled defaults. Internal \"_ids\" bookkeeping (counters for repeatable items) is stripped, meaning nothing outside the Creator. Both fields are always objects keyed by settings area - a project with nothing enabled gets {}, never an empty list. Read it to know what a project forces onto its Riddles before creating or editing one there; project_get is the cheap call for name, image and permissions.","before":"Returns the project's default Riddle settings that every new Riddle in it starts from - PUBLISHED and ENABLED only: \"publishSettings\" (privacy/DOI/OTP, email automation, tracking, data layer, ...) and \"embedSettings\" (iframe sizing, auto-scroll, ...), each containing only the areas the project owner has switched on (\"isDefaultEnabled\"/\"isEnabled\" toggled on) in the last published version. Draft changes that were never published and disabled areas are deliberately left out - this tool is not a way to inspect unpublished or disabled defaults, only what actually applies to Riddles right now. Internal \"_ids\" bookkeeping (ID counters for repeatable items like data layer entries) is stripped since it means nothing outside the Creator UI. Both fields are objects keyed by settings area and are always objects - a project with nothing enabled gets {}, never an empty list. Use this to understand what settings a project forces onto its Riddles before creating or editing one in it; project_get is the cheap way to get a project's name, image and permissions instead.","detail":"Description of `project_get_settings` changed (26% word delta).","severity":"risky","descriptionDelta":0.256},{"kind":"description_changed","tool":"project_list","after":"Lists the projects this token has access to as {items, page, pageSize, total, hasMore} - the paging every listing of this server answers with (riddle://reference/concepts/response-envelope), here 25 per page, 100 max, so an account with many projects can be paged through; a project API token only ever returns its own project. Each entry is a trimmed summary (id, name, image): project_get adds your permissions on one, project_get_settings its default Riddle settings. An invalid page/pageSize (zero, negative, or over 100) is rejected rather than silently clamped.","before":"Returns a paginated list of projects this token has access to (25 per page by default, 100 max), with a sibling \"pagination\" object ({page, pageSize, total, hasMore}) to page through accounts with many projects. If it is a project API token, only the project linked to the token will be returned. Each project is a trimmed summary (id, name, image) - use project_get for a single project incl. your permissions on it, and project_get_settings for its default Riddle settings. An invalid page/pageSize (zero, negative, or a pageSize over 100) is rejected outright rather than silently clamped - the same contract as questionBank_list/questionBank_getItems.","detail":"Description of `project_list` changed (45% word delta).","severity":"risky","descriptionDelta":0.44791666666666663},{"kind":"description_changed","tool":"questionBank_create","after":"Creates a new, empty question bank for the given Riddle type (\"Quiz\" or \"Poll\"). Add items with question_bank_item(action: \"add\"), then reference the returned \"id\" as \"questionBankId\" on a QuestionBank block of a riddle_builder_create call of the matching \"type\" - a bank created for \"Quiz\" can only be referenced from a Quiz, never a Poll, and vice versa. A bank lives in one project and can only be referenced from Riddles of that same project, so pass the projectId of the project the Riddle belongs to; omitting it creates the bank in the project the API key is scoped to.","before":"Creates a new, empty question bank for the given Riddle type (\"Quiz\" or \"Poll\"). Add items with questionBank_addItem, then reference the returned \"id\" as \"questionBankId\" on a QuestionBank block of a matching riddle_builder_quiz/riddle_builder_poll call - a bank created for \"Quiz\" can only be referenced from a Quiz, never a Poll, and vice versa. A bank lives in one project and can only be referenced from Riddles of that same project, so pass the projectId of the project the Riddle belongs to; omitting it creates the bank in the project the API key is scoped to.","detail":"Description of `questionBank_create` changed (10% word delta).","severity":"safe","descriptionDelta":0.09523809523809523},{"kind":"description_changed","tool":"reference_get","after":"Read this server's own documentation: the block types, form field types, result blocks, palette values and response shapes the other tools expect. Every \"riddle://reference/...\" URI named in a tool description, a response or an error message is a topic of this tool - pass it here to read that document. These are the authoritative parameter reference for the riddle_builder_* and palette_* tools: read the relevant one BEFORE the first call instead of guessing property names, and re-read it when a call fails with a VALIDATION_ERROR. Up to 3 topics per call, and only the ones you need - most are long. Which topics exist, and what each one holds, is the \"topics\" parameter's own enum and description - not repeated here.\n\n\"riddleType\", \"blockTypes\" and \"fieldTypes\" narrow a document to your own material, and are ignored - whole document returned, stated in the response - on one that has no such split. block-types is never returned unscoped: {\"riddleType\": [\"Quiz\"]} is still all thirteen of a Quiz's block types (~20 KB), so name the ones you are about to build in \"blockTypes\" (a Quiz filtered to [\"SingleChoice\"]: ~5.5 KB, and it says everything about that block the wide read does). Decide the blocks first, then read only those. \"fieldTypes\" does the same for form-field-types and form-field-defaults, so reading both of them with {\"fieldTypes\": [\"Dropdown\"]} is the complete reference for one field type and nothing else. The per-entity families need no filter at all - riddle://reference/block-defaults/SingleChoice IS the filtered read.","before":"Read the documentation of this MCP server: the block types, form field types, result blocks, palette values and response shapes the other tools expect. Every \"riddle://reference/...\" URI mentioned in another tool's description, in a tool response or in an error message is a topic of this tool - pass it here to read that document. These documents are the authoritative parameter reference for the riddle_builder_* and palette_* tools: read the relevant one BEFORE the first call instead of guessing property names, and re-read it when a call fails with a VALIDATION_ERROR. Available topics: \n- riddle://reference/index: every document this server has, including the two families below, with exact sizes in bytes. Read this one first when you do not know which of the others you need - it is by far the smallest.\n- riddle://reference/getting-started: what this server is for, the authentication model, the guided prompts it offers, and the addresses of the concept documents (tools by category, workflows, bulk, move restrictions, editing, publish) that hold the rules themselves. Start here when unsure which tool to use.\n- riddle://reference/response-format: the {uuid, type, modifiedAt, build, nextBlockId, warnings, published, context} envelope every tool returning a Riddle answers with, plus the bulk envelope.\n- riddle://reference/riddle-builder/riddle-types: all 9 Riddle types with their required/optional build fields and result structure.\n- riddle://reference/riddle-builder/block-types: every question and content block type per Riddle type - the reference for the \"blocks\" of a riddle_builder_* call.\n- riddle://reference/concepts/defaults: how the per-entity defaults documents below work - what a read-back leaves out for still being at its default, and how to read a property name. Read this once; the documents themselves each state their own defaults completely.\n- riddle://reference/block-defaults/{blockType} (a family, one address per block type, e.g. riddle://reference/block-defaults/SingleChoice): the default of every property a riddle_get read-back omits from a block of that type for still being at it. Read the one block type you are configuring; see riddle://reference/index for the exact member names.\n- riddle://reference/form-field-defaults: what every form field type of the FormBuilder block accepts and defaults to, keyed by field type - one document, since a Form is built with several field types at once; pass \"fieldTypes\" to get only the ones you need.\n- riddle://reference/publish-defaults: the resolved default of every publish setting (\"publish.<name>\") a read-back leaves out - one address, since they are the same for every Riddle type that has them.\n- riddle://reference/riddle-defaults/{riddleType} (a family, one address per Riddle type, e.g. riddle://reference/riddle-defaults/Quiz): the Riddle-level, preset and publish defaults of a Riddle of that type.\n- riddle://reference/riddle-builder/form-field-types: all 18 form field types of the FormBuilder block.\n- riddle://reference/riddle-builder/result-blocks: all 12 result page block types with their format and styling options.\n- riddle://reference/palette/fields: every palette value palette_customize accepts, and where it is used in a published Riddle.\n- riddle://reference/palette/built-in-palettes: the built-in palettes usable as a starting point for a custom one.\n- riddle://reference/palette/fonts: the font families available as the palette font.\n- riddle://reference/question-bank/overview: what a question bank is, its draft/publish model, and how its items relate to a QuestionBank block - read before the first questionBank_create.\n\nRequest only the documents you actually need - most are long. Up to 8 at a time, which is the size of the full Riddle Builder set (riddle-types + block-types + form-field-types + result-blocks) plus a handful of the entity addresses above.\n\n\"riddleType\" and \"blockTypes\" narrow riddle-types and block-types down to one Riddle type's (or one block type's) own material - e.g. {\"topics\": [\"riddle://reference/riddle-builder/block-types\"], \"riddleType\": [\"Quiz\"]} drops every other type's question blocks. \"fieldTypes\" does the same for form-field-types, e.g. {\"topics\": [\"riddle://reference/riddle-builder/form-field-types\"], \"fieldTypes\": [\"Dropdown\"]} returns that one field type plus the property sets it refers to. All three are ignored (whole document returned) on a topic without that split, which every response says explicitly rather than silently returning everything. The block-defaults and riddle-defaults documents have nothing left to filter this way - they are already one address per entity, so reading riddle://reference/block-defaults/SingleChoice IS the filtered result, with no parameter needed. \"fieldTypes\" narrows form-field-defaults the same way it narrows form-field-types, so {\"topics\": [\"riddle://reference/riddle-builder/form-field-types\", \"riddle://reference/form-field-defaults\"], \"fieldTypes\": [\"Dropdown\"]} is the complete reference for one field type - what it is for, what it accepts, what it defaults to - and nothing else.","detail":"Description of `reference_get` changed (60% word delta).","severity":"risky","descriptionDelta":0.5971223021582734},{"kind":"description_changed","tool":"riddle_builder_update","after":"Edits an existing Riddle of any type with the same build configuration riddle_builder_create takes - but as a merge, not a rebuild: only the fields you send are touched, an omitted one is left exactly as it is. Blocks are addressed by their \"id\", added with \"$create\": true, removed with \"$delete\": true and reordered with \"$blocksOrder\"; the same grammar edits a block's \"items\"/\"fields\" and a Personality Test's \"personalities\", while a Placeholder's \"conditions\" is replaced as a whole (see each field). Read the Riddle with riddle_get first: what it returns under \"build\" is exactly the shape this takes, block IDs included. Only Riddles created by the riddle_builder_* tools or by the Riddle AI can be edited here - one built manually in the Creator can hold content this build config cannot express, and is rejected; check context.origin.apiManageable on riddle_get (\"origin\" on riddle_list) beforehand. Returns the compact build-configuration envelope of riddle_get (riddle://reference/response-format).","before":"Edits an existing Riddle of any type with the same build configuration the riddle_builder_<type> tools take - but as a merge, not a rebuild: only what you send is changed. Blocks are addressed by their ID and can be added with \"$create\": true, removed with \"$delete\": true (see the \"blocks\" field) or reordered with \"$blocksOrder\" - and so are the entries of a block's \"items\"/\"fields\" and, for a Personality Test, its \"personalities\" (which cannot be reordered, see that field); a Placeholder's \"conditions\" is replaced as a whole though (see that field). Read the Riddle with riddle_get first to get its block IDs and current build configuration - what it returns under \"build\" is exactly the shape this takes, so it can be fed straight back in. Only Riddles that were created via the Riddle Builder tools (riddle_builder_*) or generated by the Riddle AI can be edited here - a Riddle the user built manually in the Creator can hold content this build config cannot express (riddle_get reports it as \"warnings\"), so editing it from here would mean editing around content you never saw, and it is rejected. Check context.origin.apiManageable on riddle_get (or \"origin\" on riddle_list/riddle_account_list) beforehand instead of finding out from the error; reading such a Riddle keeps working. Returns the edited Riddle in the same compact build-configuration envelope riddle_get returns ({uuid, type, modifiedAt, build, nextBlockId, warnings, published, context}). To replace a Riddle wholesale instead, build a new one with the riddle_builder_<type> tool of its type.","detail":"Description of `riddle_builder_update` changed (39% word delta).","severity":"risky","descriptionDelta":0.3851351351351351},{"kind":"description_changed","tool":"riddle_builder_validate","after":"Dry-runs one or many Riddle Builder creates and/or edits without creating or changing anything: per entry of \"builds\", the same validation the real call would apply, run against a scratch/deep-copied Riddle that is discarded before this returns - never persisted, never published, no event dispatched. A media URL in the build IS still checked for reachability with a live HEAD request (no content fetched or stored), so an unreachable one is rejected here too (INVALID_MEDIA) instead of at flush/publish time. An entry is {type, build} for a would-be creation or {UUID, build} for an edit; the answer is the {validate, valid, summary, items} envelope of riddle://reference/concepts/bulk, one item per entry in the order sent - a single config is items[0]. Use it to see why a config would be rejected before spending a real create/edit on it, and to pre-flight a set of similar Riddles in one call. PASS \"project\" whenever a build references anything project-scoped (a Form behind FormSelect, a tag, a project ad slot), set to the project you will actually create in: creating entries are dry-run inside it, and without it they run in the personal project, where such a reference is invisible and comes back as \"You are not authorized to access ...\" for a build a real create would accept. Catches nothing that only happens once a Riddle is really flushed or published - a database constraint violation, queue-worker behaviour. Per-type build shapes: riddle://reference/riddle-builder/riddle-types.","before":"Dry-runs one or many Riddle Builder creates and/or edits without creating or changing anything: per entry of $builds, the same validation the real call would apply, against a scratch/deep-copied Riddle that is discarded before this returns - never persisted, never published, no event dispatched. Any media URL in the build IS still checked for reachability with a live HEAD request (no file content is fetched or stored) exactly as a real call would, so an unreachable URL is rejected here too (INVALID_MEDIA) - this is not deferred to flush/publish time. Each entry is {type, build} for a creation or {UUID, build} for an edit; the answer is {valid, summary, items: [{index, type, UUID?, valid, build|errors, warnings?, internalError?}]} - one entry per item, in the order they were sent, so a single config means one entry and items[0]. \"internalError\" is only present, and only true, when checking that one item ran into an error on OUR side rather than a rejection: that item's outcome is unknown and has been reported to us, and it does not affect the other items in the same call (a real call with that config would answer a 500). Use this to check a build config, or to see why one would be rejected, before spending a real create/edit on it - and to pre-flight a set of similar Riddles in one call. Needed subscription plan: Business or Enterprise. Does NOT catch anything that only happens once a Riddle is actually flushed or published: a database constraint violation or queue-worker behaviour. See riddle://reference/riddle-builder/riddle-types for per-type build shapes and riddle://reference/response-format for the \"build\"/\"warnings\" shape this echoes back.","detail":"Description of `riddle_builder_validate` changed (41% word delta).","severity":"risky","descriptionDelta":0.41145833333333337},{"kind":"input_property_removed","path":"inputSchema.properties.omit","tool":"riddle_builder_validate","before":{"type":"array","items":{"enum":["build.omittedDefaults"],"type":"string"},"default":null,"description":"Leaves the per-block \"omittedDefaults\" maps out of every echoed-back build config, for a much smaller answer: omit: [\"build.omittedDefaults\"]. The same defaults are stated in riddle://reference/riddle-defaults/<riddle type> and riddle://reference/block-defaults/<block type>, so nothing is lost - what you must not do either way is resend those values. Omit the parameter to keep them. The other values of riddle_get's \"omit\" do not apply here: this envelope has no sections to drop.","uniqueItems":true},"detail":"Field `omit` was removed from `riddle_builder_validate` input; consumers still sending it may be rejected or silently ignored.","severity":"breaking"},{"kind":"input_property_added","path":"inputSchema.properties.project","tool":"riddle_builder_validate","after":{"type":["null","integer"],"default":null,"description":"The project to dry-run the CREATING entries in - riddle_builder_create's own parameter, and it must be the project you intend to create in: the scratch Riddle is built inside it, and anything project-scoped the build REFERENCES (a Form behind FormSelect, a tag, a project ad slot) is only resolvable from there. Without it such a build is evaluated in the personal project and rejected with \"You are not authorized to access Form <UUID>\" - a scope problem wearing a permissions error, and a false negative for a build a real create would accept. NULL means the personal project, omitted the currently selected one. Ignored by editing entries ({UUID, build}), always evaluated in their own Riddle's project."},"detail":"Optional field `project` was added to `riddle_builder_validate`; may shift model behaviour.","severity":"risky"},{"kind":"description_changed","tool":"riddle_delete","after":"Deletes one or many Riddles. Only Riddles created through the riddle_builder_* tools or generated by the Riddle AI can be deleted - the ones a user built by hand in the Creator cannot, so check \"origin.apiManageable\" (riddle_get's context.origin, or riddle_list's \"origin\") beforehand rather than learning it from the error. Pass UUID for one, or UUIDs (max 100) to clean up several at once - e.g. everything riddle_list returned with origin: \"api\". A bulk delete is not atomic and never gives up early: a Riddle that cannot be deleted is that entry's \"error\" and every other Riddle is still deleted (riddle://reference/concepts/bulk). A Riddle another item of the same batch still references (a Leaderboard's connected Quiz/Predictor/Minigame, a FormSelect's Form) is retried once after the rest of the batch, so the order of the list does not matter; only a failure that survives the retry is reported. DRY RUN: pass dryRun: true and NOTHING is deleted - the call runs the same validation a real delete runs and answers {dryRun, deletable, summary, items, addUUIDs} per Riddle. Do this first whenever the set was not created by you; then act on \\\"addUUIDs\\\" to delete the referencing Riddles along with their targets. Every field, the batch effect and which blockers no addition to the call can lift: riddle://reference/concepts/bulk.","before":"Deletes one or many Riddles. Only Riddles that were created via the Riddle Builder tools (riddle_builder_*) or generated by the Riddle AI can be deleted - use this to clean up Riddles you created for testing. Riddles the user created manually in the Creator cannot be deleted. Check context.origin.apiManageable on riddle_get (or \"origin\" on riddle_list/riddle_account_list) beforehand to know whether a given Riddle qualifies, instead of finding out from the error. Pass UUID to delete a single Riddle, or UUIDs (array of Riddle UUID strings, max 100) to clean up several at once - e.g. everything riddle_list returned with origin: \"api\". A bulk delete is not atomic and never gives up early: a Riddle that cannot be deleted is reported as that entry's \"error\" in the {bulk, operation, summary, results} envelope, and every other Riddle in the list is still deleted. A Riddle another item of the same batch still references (a Leaderboard's connected Quiz/Predictor/Minigame, a FormSelect's Form) is retried once automatically after the rest of the batch has run, so listing the referenced Riddle before its referencer no longer requires a second call - only a failure that survives that retry is reported as an error.","detail":"Description of `riddle_delete` changed (44% word delta).","severity":"risky","descriptionDelta":0.44311377245508987},{"kind":"input_property_added","path":"inputSchema.properties.dryRun","tool":"riddle_delete","after":{"type":"boolean","default":false,"description":"true reports whether each Riddle could be deleted and deletes nothing. Works for one UUID and for UUIDs."},"detail":"Optional field `dryRun` was added to `riddle_delete`; may shift model behaviour.","severity":"risky"},{"kind":"description_changed","tool":"riddle_get","after":"Reads one Riddle - or several, with UUIDs - as the compact build-configuration envelope {uuid, type, modifiedAt, build, nextBlockId, warnings, published, context}. \"build\" is the DRAFT and is exactly what the riddle_builder_* tools accept back; \"published\" is the live version visitors see (null = never published, {\"status\": \"identical\"} = the live version matches the draft, {\"status\": \"differs\", \"build\": ...} = unpublished edits, and \"isLive\" on either says whether it is on the web right now). Content the build config cannot express never fails the call - it is reported in \"warnings\" instead. A property still at its block type's default is left out rather than returned: riddle://reference/block-defaults/<block type> and riddle://reference/riddle-defaults/<Riddle type> state what it is, and it must NOT be resent as a property, since many build properties enable a feature by being present at all. \"context\" holds what sits around the config: title, image, tags, notes, viewUrl, features, origin (whether riddle_delete/riddle_builder_update/palette_customize work on this Riddle), publish/unpublish/modify state, project and preset identity. Make the response smaller with \"omit\"; bigger with omittedDefaults or includeRiddleData, both off by default and both large. Field by field: riddle://reference/concepts/response-envelope, plus /warnings, /publish and /bulk.","before":"Gets one Riddle - or several, with UUIDs - as a compact build-configuration envelope: {uuid, type, modifiedAt, build, nextBlockId, warnings, published, context}. \"build\" is the same build config POST /riddle-builder accepts (see the riddle_builder_* tools) - everything the Riddle contains which cannot be expressed there is left out of \"build\" and reported in \"warnings\" instead; this never fails on content it cannot express. A property that is simply still at its block type's default is left out too, but never silently: each block carries an \"omittedDefaults\" map of those properties with the value each one is at - so \"not in the config\" does not mean \"unknown\". Read those values, do not resend them: many build properties enable a feature by being present at all, whatever their value. Pass omit: [\"build.omittedDefaults\"] to leave those maps out for a much smaller response - riddle://reference/block-defaults/<block type> states the same defaults without a Riddle in hand. \"id\" and \"type\" are always present on every block and never omitted, and a property the block cannot accept in its current configuration is not listed either. \"build\" always describes the DRAFT - the version you edit; \"published\" describes the live version visitors see: null if never published, {\"status\": \"identical\"} if the live version is exactly what \"build\" shows, or {\"status\": \"differs\", \"build\": ..., \"warnings\": ...} with the live version in full when the draft has unpublished changes; unpublished changes the build config cannot express show up as {\"status\": \"identical\", \"hasUnpublishedChanges\": true, ...}. Every non-null \"published\" carries \"isLive\" - whether that version is online right now; it is false after riddle_unpublish, which leaves the last published version stored. Either way, call riddle_publish to make \"build\" live. \"context\" adds the extra fields an MCP client typically needs next to the build config: title, image (the Riddle's thumbnail), tags, notes, viewUrl (the public URL the Riddle is reachable under - null when it is not published or its landing page is turned off, with \"viewUrlUnavailable\": {reason, message} saying which of the two), features (incl. hasIntegration, consistent with riddle_list/riddle_account_list), origin (builder/aiGenerated/apiManageable - whether riddle_delete, riddle_builder_update and palette_customize will work on this Riddle, consistent with riddle_list/riddle_account_list), published/unpublished/modified state (both timestamps set = the Riddle was published and then taken offline again), duplicated (the Riddle this one was copied from, if any), project/team identity, and the preset relationship (id/parentId, whether it is merged from a parent preset and whether it has since drifted from it). Pass includeRiddleData=true to additionally receive the full stored Riddle under \"riddle\" - a large payload, rarely needed. Use \"omit\" to leave parts of all this out when you do not need them (see that parameter - it is the only way to make this call smaller), and UUIDs to read several Riddles in one call (see that parameter for its own, lower size budget).","detail":"Description of `riddle_get` changed (61% word delta).","severity":"risky","descriptionDelta":0.6070038910505837},{"kind":"input_property_added","path":"inputSchema.properties.omittedDefaults","tool":"riddle_get","after":{"type":"boolean","default":null,"description":"Whether every block should additionally carry its \"omittedDefaults\" map: the properties it left at that block type's default, with the value each is at. Off by default - measured, those maps are 85-90% of a read-back, and riddle://reference/block-defaults/<block type> states the same defaults without a Riddle in hand. Ask for them only to learn what THIS Riddle left at its default, and read them, never resend them."},"detail":"Optional field `omittedDefaults` was added to `riddle_get`; may shift model behaviour.","severity":"risky"},{"kind":"description_changed","tool":"riddle_list","after":"Returns a paginated list of Riddles. With the default scope \"project\" they come from a single project - use projectId to name it, or omit it for the personal project. With scope \"account\" they come from the entire account instead: the personal project and every team project the user has access to, in one list - the account-wide listing is this scope, not a tool of its own; projectId and notType do not apply there and are rejected rather than ignored. Every other filter works the same in both scopes. Answers with {items, page, pageSize, total, hasMore}, where \"total\" is how many Riddles match the filters in total and \"hasMore\" whether another page follows.","before":"Returns a paginated list of Riddles from a single project. Use projectId to specify the project, or omit it to list from the personal project. For Riddles across all projects, use riddle_account_list instead.","detail":"Description of `riddle_list` changed (75% word delta).","severity":"risky","descriptionDelta":0.7532467532467533},{"kind":"input_property_added","path":"inputSchema.properties.scope","tool":"riddle_list","after":{"enum":["project","account"],"type":"string","default":null,"description":"What to list: \"project\" (default) for the Riddles of a single project, \"account\" for every Riddle of the account at once."},"detail":"Optional field `scope` was added to `riddle_list`; may shift model behaviour.","severity":"risky"},{"kind":"description_changed","tool":"riddle_move","after":"Moves one or many Riddles into another project or into the personal project - and, given no destination, reports whether it could instead of moving anything. Pass UUID for one Riddle or UUIDs (max 100) for several. CHECK MODE (the move check - a mode of this tool, not a tool of its own): leave projectId out (or pass dryRun: true alongside one) and NOTHING is changed - the call runs the very same validation a real move runs and answers {canMoveAll, movable, blocked, addUUIDs, canMoveToPersonal, projects}. Do this first whenever the Riddles were not all created by you, or to explain to a user why a move is impossible. MOVE MODE: pass projectId (a project/team ID from project_list, or the string \"personal\") and the Riddles move, answering {bulk, operation, summary, results} with the new project per Riddle. Unlike the other bulk tools this one is atomic - it validates the whole set first and moves nothing if any Riddle is rejected - because Riddles that reference each other (a Quiz and the Leaderboard it reports to, a Form embedded in another Riddle) can only move together. So pass exactly the set you intend to move: the same Riddle can be blocked on its own and movable inside a larger call. When something is blocked, act on the top-level \"addUUIDs\" (or a blocked entry's \"resolveByAddingUUIDs\"), add those to UUIDs and check again until canMoveAll is true - connections chain, and blocking travels along them, so never read an empty \"missingUUIDs\" as \"this one is fine\" or a blocked Riddle as having a problem of its own. A move drops project-specific ad blocks tied to the old project and updates the published version along with the draft, but it does not adopt the new project's design. Every field of the check answer, why \"projects\" can be shorter than project_list and when a blocker cannot be resolved at all: riddle://reference/concepts/move-restrictions.","before":"Moves one or many Riddles into another project, or into the personal project when projectId is omitted. Pass UUID for a single Riddle or UUIDs (array of Riddle UUID strings, max 100) for several at once; use project_list to find the target projectId, and riddle_list/riddle_account_list to find the Riddles. Unlike the other bulk tools this validates the whole set BEFORE moving anything and moves nothing at all if any Riddle is rejected, because Riddles that reference each other (a Quiz and the Leaderboard it reports to, a Form embedded in another Riddle) can only move together: not every Riddle can be moved on its own, and the error names both the rejected Riddles and the exact connected Riddles to add to UUIDs, which is all it takes to make the same call work. Call riddle_move_check first (same UUIDs, changes nothing) to see which Riddles are blocked, which connected Riddles are missing from the set, and which projects the whole set can go to at all. Moving also requires the transfer permission in both the source and the target project; it does not adopt the new project's design - the Riddle keeps its current preset/look as-is - but it does drop project-specific ad blocks tied to the old project, and the published version is updated along with the draft. Returns {bulk, operation, summary, results} with the new project per Riddle.","detail":"Description of `riddle_move` changed (56% word delta).","severity":"risky","descriptionDelta":0.5603864734299517},{"kind":"input_property_added","path":"inputSchema.properties.dryRun","tool":"riddle_move","after":{"type":"boolean","default":false,"description":"true runs the movability check against the given projectId and changes nothing. Pointless without projectId, which already only checks."},"detail":"Optional field `dryRun` was added to `riddle_move`; may shift model behaviour.","severity":"risky"},{"kind":"input_type_changed","path":"inputSchema.properties.projectId","tool":"riddle_move","after":"null|integer|string","before":"null|integer","detail":"Type of `projectId` on `riddle_move` changed null|integer → null|integer|string.","severity":"breaking"},{"kind":"description_changed","tool":"riddle_publish","after":"Publishes one or many Riddles, or takes them off the web again with publish: false - unpublishing is this tool, there is no separate unpublish tool. A published Riddle is live at https://www.riddle.com/view/[RIDDLEID]. With UUID the response is the riddle_get envelope with the new state under \"context.published\" (\"omit\" shrinks it the same way); with UUIDs (max 100) it is the bulk envelope, one compact entry per Riddle instead of a build configuration - not atomic and never giving up early, so a Riddle that cannot be (un)published is reported as that entry's \"error\" while the rest still go through (riddle://reference/concepts/bulk). PUBLISHING: a refusal is error \"RIDDLE_PUBLISH_VALIDATE\" carrying \"validationErrors\", one {message, code} per reason (\"MIN_ONE_BLOCK\", \"MIN_ONE_RESULT\", \"REDIRECT_RESULT_WITHOUT_URL\", \"LOGIC_DEAD_ENDS\", ...) - fix them all and publish again. Non-blocking findings arrive as \"validationWarnings\" on a FAILED and on a SUCCESSFUL publish alike (the Riddle is live either way): report them, do not retry. Only a publish produces either list - riddle_builder_validate dry-runs a build configuration, not a publish. UNPUBLISHING: a LIVE Leaderboard with active Riddle connections is refused (\"RIDDLE_UNPUBLISH\", same list naming what is in the way) - riddle_delete it instead, which is always allowed and cleans up the connected Riddles. Unpublishing a Riddle that is not live is a no-op that says so in a \"message\" - read it before reporting a Riddle as taken offline, because \"context.published.at\" is null whether it was never published or already offline. Codes and the draft-vs-live model: riddle://reference/concepts/publish.","before":"Publishes one or many Riddles; meaning each Riddle will be available via https://www.riddle.com/view/[RIDDLEID]. Pass UUID for a single Riddle - the response is then the same compact build-configuration envelope riddle_get returns, with the new published state under \"context.published\"; use \"omit\" to shrink it the same way as riddle_get. Pass UUIDs (array of Riddle UUID strings, max 100) to publish several at once; the response is then the bulk envelope {bulk: true, operation, summary: {total, succeeded, failed}, results: [...]} with one entry per Riddle, each carrying its new state (title, viewUrl, published, modified) instead of a full build configuration - call riddle_get for the ones you want to inspect in detail. 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 other Riddles are still published. A Riddle that fails publish validation says exactly why: the call fails with error \"RIDDLE_PUBLISH_VALIDATE\" (for a bulk, that entry's \"error\") carrying \"validationErrors\" - one {message, code, ...} entry per reason, e.g. code \"MIN_ONE_BLOCK\", \"MIN_ONE_RESULT\", \"REDIRECT_RESULT_WITHOUT_URL\" or \"LOGIC_DEAD_ENDS\" - so fix those and publish again. Non-blocking findings arrive as \"validationWarnings\" in the same shape, on a FAILED and on a SUCCESSFUL publish alike (the Riddle is live either way; e.g. \"NO_DOMAINS\" or \"USES_OLD_LAYOUT\") - report them to the user instead of retrying. Warnings are only stated when there are any. Publish validation only runs on a publish: riddle_builder_validate dry-runs a build configuration, not a publish, so there is no way to see these lists without calling this tool.","detail":"Description of `riddle_publish` changed (53% word delta).","severity":"risky","descriptionDelta":0.5349999999999999},{"kind":"input_property_added","path":"inputSchema.properties.publish","tool":"riddle_publish","after":{"type":"boolean","default":true,"description":"true (the default) publishes the Riddles, false takes them off the web again."},"detail":"Optional field `publish` was added to `riddle_publish`; may shift model behaviour.","severity":"risky"},{"kind":"description_changed","tool":"riddle_tag_delete","after":"Deletes the TAG ITSELF from a project - the label, for good - and no Riddle, no question bank and no assignment. Rarely needed: untagging the last carrier already removes a tag (riddle_tag action \"remove\"), so this is for a leftover from before that cleanup existed. It detaches nothing on the way, so a tag any Riddle or question bank still carries is rejected with a message naming how many of each - check with riddle_tag_list first, where a tag is free only when count AND bankCount are 0, and untag the carriers before calling this. Permanent, and ids are not reused, so a stored riddle_list filter on the old id stops matching a tag of the same name created later.","before":"Deletes a tag itself from a project - the label, not its application to a Riddle. Use this for a tag that is left over: normally a tag disappears on its own as soon as nothing uses it any more (riddle_tag_remove, questionBank_removeTag, and deleting a tagged Riddle or question bank all do that), so the only tags that need deleting by hand are ones that survived from before that cleanup existed. The tag must be unused: this never untags anything on the way, so a tag any Riddle or question bank still carries is rejected with a message naming how many of each still use it - remove it there first (riddle_tag_list shows the Riddle count, questionBank_tagList the bank count; the two share one set of tags, so a \"count\": 0 in riddle_tag_list does not mean unused). Deleting is permanent and IDs are not reused: a tag of the same name created later gets a new id, so any stored filter referring to the old id stops matching. Returns {deleted: true, tag: {id, name}, scope}.","detail":"Description of `riddle_tag_delete` changed (55% word delta).","severity":"risky","descriptionDelta":0.5546875},{"kind":"description_changed","tool":"riddle_tag_list","after":"Lists the tags of a project as {items: [{id, name, count, bankCount}]}, unpaginated - the labels the Creator shows and riddle_list's \"tags\" filter selects by, and where the ids that filter takes come from. Riddle tags and question bank tags are ONE set per project (question_bank_tag is the bank side of the same tags, with the same ids), and a tag belongs to a project: \"Campaign 2026\" in one project is a different tag from the one of that name in another. \"count\" counts RIDDLES and \"bankCount\" question banks, so \"count\": 0 alone never means unused - a tag is free of carriers only when both are 0, which is what riddle_tag_delete requires. Read this before riddle_tag(action: \"add\"), which creates a tag it does not find, to tag with the name a project already has rather than a second one beside it.","before":"Lists the tags of a project together with how many Riddles use each of them: [{id, name, count}]. Tags are per project - a tag of one project cannot be applied to a Riddle of another - so pass the projectId of the project whose Riddles you are tagging; omitting it returns the tags of the project the API key is scoped to (your personal tags for a user API key). Use this to find the tag \"id\" values riddle_list/riddle_account_list accept in their \"tags\" filter, and to check whether a tag already exists before riddle_tag_add creates a new one. \"count\" counts RIDDLES only, and Riddle tags and question bank tags are ONE set per project (the same tag can be applied to both and has the same id in either): a tag with \"count\": 0 therefore means \"no Riddle uses this tag\", not \"nothing uses it\" - question banks may well be using it, see questionBank_tagList. A tag is deleted automatically as soon as neither a Riddle nor a bank uses it any more - by untagging its last carrier, and by deleting that carrier - so a tag listed here is either in use somewhere or a leftover from before that cleanup existed, which riddle_tag_delete removes.","detail":"Description of `riddle_tag_list` changed (67% word delta).","severity":"risky","descriptionDelta":0.6712328767123288},{"kind":"description_changed","tool":"riddleTemplate_create","after":"Stores an existing Riddle as a template of its project (or of the user, for a personal Riddle), so new Riddles can be created from it with riddle_template_use. The template is a copy taken at this moment - the Riddle keeps living its own life and later changes to it do not reach the template. It copies what the Riddle currently has stored, published or not. Returns the created template: {id, title, type, category, isPublic, isQuickCreate, blocksCount, image, icon, createdAt, riddle}. Requires the template-create permission in the Riddle's project.","before":"Stores an existing Riddle as a template of its project (or of the user, for a personal Riddle), so new Riddles can be created from it with riddleTemplate_use. The template is a copy taken at this moment - the Riddle keeps living its own life and later changes to it do not reach the template. It copies what the Riddle currently has stored, published or not. Returns the created template: {id, title, type, category, isPublic, isQuickCreate, blocksCount, image, icon, createdAt, riddle}. Requires the template-create permission in the Riddle's project.","detail":"Description of `riddleTemplate_create` changed (3% word delta).","severity":"safe","descriptionDelta":0.03076923076923077},{"kind":"description_changed","tool":"riddleTemplate_list","after":"Lists the templates of a project (or your personal ones) - the ones made from your own Riddles with riddle_template_create, NOT Riddle's public ones, which riddle_template_public_list returns. Quick-create templates (isQuickCreate: true) are included alongside the regular ones; there is no separate listing for them. \"type\" filters by Riddle type. Returns {items: [{id, title, type, blocksCount, image, icon, createdAt, riddle, isPublic, isQuickCreate}], total} - not paginated, so \"total\" is simply how many there are - without the build configuration - read that with riddle_template_get, or hand the id straight to riddle_template_use.","before":"Lists the templates of a project (or your personal ones) - the ones made from your own Riddles with riddleTemplate_create, NOT Riddle's public ones, which riddleTemplate_publicList returns. Includes quick-create templates (riddleTemplate_create with isQuickCreate: true) alongside regular ones - there is no separate way to list those here. Filter by \"type\" to get only the templates of one Riddle type. Returns {count, templates: [{id, title, type, blocksCount, image, icon, createdAt, riddle, isPublic, isQuickCreate}]} without the build configuration - call riddleTemplate_get with the id of the one you picked to read that, or hand the id straight to riddleTemplate_use to create a Riddle from it unchanged.","detail":"Description of `riddleTemplate_list` changed (43% word delta).","severity":"risky","descriptionDelta":0.4285714285714286},{"kind":"description_changed","tool":"riddleTemplate_publicList","after":"Lists Riddle's public templates - the ready-made ones every account has, as opposed to riddle_template_list's own ones. They are grouped by category (the tag the Creator sorts them by), so calling this without arguments is also how you learn which categories exist; \"category\" and \"type\" narrow it. Returns {categories: {<category>: [{id, title, type, blocksCount, image, icon, createdAt, riddle, isPublic}]}, total} - the one listing here that is grouped rather than a flat \"items\" - and without the build configuration, which is riddle_template_get (or hand the id straight to riddle_template_use).","before":"Lists Riddle's public templates - the ready-made ones available to every account, as opposed to riddleTemplate_list, which returns the ones your project made itself. They are grouped by category (the tag the Creator sorts them by), so calling this without arguments is also how you learn which categories exist; pass \"category\" to get only one of them and \"type\" to get only one Riddle type. Returns {count, categories: {<category>: [{id, title, type, blocksCount, image, icon, createdAt, riddle, isPublic}]}} without the build configuration - call riddleTemplate_get with the id of the one you picked to read that, or hand the id straight to riddleTemplate_use to create a Riddle from it unchanged.","detail":"Description of `riddleTemplate_publicList` changed (37% word delta).","severity":"risky","descriptionDelta":0.367816091954023},{"kind":"description_changed","tool":"stats_fetch","after":"Views/starts/submissions of one entity - \"namespace\" plus \"entityId\" says which (a project, a user, or a Riddle by UUID), \"view\" how deeply. \"totals\": one aggregate for the period. The response IS the entity's stats document: metrics sit in \"core_metrics\" under \"global_stats\" (a Riddle) or under \"stats\" (a user/project aggregate, or an old Riddle) - read only \"stats\" and a Riddle with real traffic looks unmeasured. A Riddle also carries one \"block_<blockId>_stats\" per block, keyed by riddle_get's ids. \"timeseries\": those numbers per consecutive interval - {intervalDays, intervalCount, intervals}, each {from, to, days, stats} inclusive of both ends. Up to 31 days give one interval per day; a longer range is grouped into at most 31 equal intervals whose \"stats\" is the interval TOTAL, not a daily number - divide by \"days\", and never read the shorter final interval as a drop. \"breakdown\" is per namespace: \"riddle\" gives one Riddle down to its blocks, choices and fields, every \"id\" being the stored block id riddle_get's \"build\" exposes, so a weak question can be fixed directly; \"project\" gives that tree for every Riddle in it - prefer a short range, or one Riddle, on a big project; \"user\" gives NOT a deep breakdown but the account-wide summary: one row per Riddle plus the totals over every Riddle in scope, ranked by sortBy, 25 per page (\"hasMore\" says whether another follows), narrowed with projectIds rather than paged on a big account, requires a USER API key, takes no entityId. Two kinds of \"no data\": an empty response ({}, always an object, never a list) means nothing was recorded - report \"no stats recorded\", never 0 - while a missing key inside a POPULATED \"core_metrics\" is a genuine zero (no \"finish\" beside a \"view\" means no submissions). A \"breakdown\" signals nothing by shape: a Riddle nobody opened still answers with its full tree at 0, so confirm it was published then (riddle_get's \"published\": null means it never was) before reading zeros as a finding.","before":"Returns aggregated statistics (views, starts, submissions) for a single period. Omit dateFrom/dateTo for alltime stats, provide both for a specific date range, or only provide one of them for an open-ended date range (e.g. dateFrom only for stats since a specific date, dateTo only for stats until a specific date).","detail":"Description of `stats_fetch` changed (93% word delta).","severity":"risky","descriptionDelta":0.9303482587064676},{"kind":"input_property_added","path":"inputSchema.properties.page","tool":"stats_fetch","after":{"type":["null","integer"],"default":null,"description":"Page number of the account-wide summary, 1-indexed (default: 1). Zero or negative is rejected with a VALIDATION_ERROR, not clamped to page 1 - the same contract as riddle_list/project_list. That view only."},"detail":"Optional field `page` was added to `stats_fetch`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.projectIds","tool":"stats_fetch","after":{"type":["array","null"],"default":null,"description":"Narrow the account-wide summary to these project IDs (array of integers, from project_list). Omit to cover the whole account, including the personal project. Passing a project the user cannot view stats of is an error, not a silently skipped project. That view only."},"detail":"Optional field `projectIds` was added to `stats_fetch`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.sortBy","tool":"stats_fetch","after":{"enum":["views","starts","submissions","timeActive"],"type":"string","default":null,"description":"Metric the account-wide summary's Riddles are ranked by before the page is cut: \"views\" (default), \"starts\", \"submissions\" or \"timeActive\". Sorting always spans the whole account (or the projects given), so page 1 is genuinely the top of the account. That view only."},"detail":"Optional field `sortBy` was added to `stats_fetch`; may shift model behaviour.","severity":"risky"},{"kind":"input_required_added","path":"inputSchema.properties.view","tool":"stats_fetch","after":{"enum":["totals","timeseries","breakdown"],"type":"string","description":"How deeply to measure: \"totals\" (one aggregate for the period), \"timeseries\" (that aggregate per consecutive interval, requires dateFrom and dateTo) or \"breakdown\" (the per-block detail, or the per-Riddle summary for namespace \"user\")."},"detail":"New required field `view` on `stats_fetch`; requests without it will fail.","severity":"breaking"},{"kind":"input_required_removed","path":"inputSchema.required.entityId","tool":"stats_fetch","detail":"Field `entityId` on `stats_fetch` is no longer required.","severity":"safe"},{"kind":"input_type_changed","path":"inputSchema.properties.entityId","tool":"stats_fetch","after":"null|string","before":"string","detail":"Type of `entityId` on `stats_fetch` changed string → null|string.","severity":"breaking"},{"kind":"default_changed","path":"inputSchema.properties.entityId","tool":"stats_fetch","after":null,"detail":"Default of `entityId` on `stats_fetch` changed unset → null.","severity":"risky"},{"kind":"description_changed","tool":"whoami","after":"Reports the current API key: the authenticated user (\"userEmail\"/\"userName\", the latter null if never set), the project/team on a project-scoped key, and the account's plan in \"subscription\" ({plan, period, active, created, termEnd, isFreeTrial, daysLeft} - on a free trial \"termEnd\" is when the trial ends and \"daysLeft\" what is left of it, null on a paid plan). The plan is informational: every tool here works on every plan, free trial included, and no call is refused for it. Mind which id is which: the response's own \"id\" is the API KEY row, the user id (what the stats tools want as \"entityId\" for namespace \"user\") is \"user\", and \"team\" is the project id on a project key. A Riddle's own \"plan\" in riddle_get is a different thing - the plan level the features used in THAT Riddle need, not the account's.","before":"Returns information about the current API key: the authenticated user (email, name - \"userEmail\"/\"userName\", \"userName\" is null if the user never set one) and the associated project/team if using a project API key. Useful to verify authentication and retrieve your user ID or project ID. Note the response's own \"id\" is the API KEY's row ID, not the user - the user ID (what stats_fetch/stats_* tools want as \"entityId\" for namespace \"user\") is the \"user\" field; \"team\" is the project ID if this is a project-scoped key.","detail":"Description of `whoami` changed (67% word delta).","severity":"risky","descriptionDelta":0.6666666666666667},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Crosswords","after":"riddle://reference/block-defaults/Crosswords","detail":"Resource `riddle://reference/block-defaults/Crosswords` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Minesweeper","after":"riddle://reference/block-defaults/Minesweeper","detail":"Resource `riddle://reference/block-defaults/Minesweeper` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/SpotTheDifference","after":"riddle://reference/block-defaults/SpotTheDifference","detail":"Resource `riddle://reference/block-defaults/SpotTheDifference` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/TapAndFind","after":"riddle://reference/block-defaults/TapAndFind","detail":"Resource `riddle://reference/block-defaults/TapAndFind` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/analyze_CampaignPerformance","after":"riddle://reference/prompts/analyze_CampaignPerformance","detail":"Resource `riddle://reference/prompts/analyze_CampaignPerformance` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/build_GatedContentStory","after":"riddle://reference/prompts/build_GatedContentStory","detail":"Resource `riddle://reference/prompts/build_GatedContentStory` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/build_LeadForm","after":"riddle://reference/prompts/build_LeadForm","detail":"Resource `riddle://reference/prompts/build_LeadForm` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/build_LeadGenQuiz","after":"riddle://reference/prompts/build_LeadGenQuiz","detail":"Resource `riddle://reference/prompts/build_LeadGenQuiz` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/build_PredictorWithLeaderboard","after":"riddle://reference/prompts/build_PredictorWithLeaderboard","detail":"Resource `riddle://reference/prompts/build_PredictorWithLeaderboard` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/build_ProductRecommender","after":"riddle://reference/prompts/build_ProductRecommender","detail":"Resource `riddle://reference/prompts/build_ProductRecommender` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/build_QuizContestWithLeaderboard","after":"riddle://reference/prompts/build_QuizContestWithLeaderboard","detail":"Resource `riddle://reference/prompts/build_QuizContestWithLeaderboard` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/localize_Riddle","after":"riddle://reference/prompts/localize_Riddle","detail":"Resource `riddle://reference/prompts/localize_Riddle` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/optimize_Riddle","after":"riddle://reference/prompts/optimize_Riddle","detail":"Resource `riddle://reference/prompts/optimize_Riddle` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/organize_Library","after":"riddle://reference/prompts/organize_Library","detail":"Resource `riddle://reference/prompts/organize_Library` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/restyle_ToBrand","after":"riddle://reference/prompts/restyle_ToBrand","detail":"Resource `riddle://reference/prompts/restyle_ToBrand` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/prompts/setup_DataLayerTracking","after":"riddle://reference/prompts/setup_DataLayerTracking","detail":"Resource `riddle://reference/prompts/setup_DataLayerTracking` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/question-bank/block-type-columns","after":"riddle://reference/question-bank/block-type-columns","detail":"Resource `riddle://reference/question-bank/block-type-columns` was added.","severity":"safe"}],"published_at":"2026-09-02T13:06:13.058Z"},{"slug":"ZV-2026-0338","server_name":"riddle.com","severity":"breaking","title":"riddle.com: Tool riddle_qr_code was removed.","summary":"[breaking] Tool riddle_qr_code was removed. [safe] Tool riddle_tag_delete was added. [risky] Description of palette_get changed (49% word delta). [risky] Optional field omit was added to palette_get; may shift model behaviour. [safe] Description of questionBank_delete changed (10% word delta). [safe] Description of questionBank_removeTag changed (15% word delta). [risky] Optional field includeAvailableTopics was added to reference_get; may shift model behaviour. [safe] Description of riddle_move_check changed (19% word delta). [safe] Description of riddle_tag_list changed (22% word delta). [safe] Description of riddle_tag_remove changed (18% word delta). [safe] Description of riddle_unpublish changed (21% word delta). [safe] Description of riddleTemplate_use changed (14% word delta). [risky] Optional field omit was added to riddleTemplate_use; may shift model behaviour. [risky] Description of stats_project_breakdown changed (88% word delta). [risky] Description of stats_user_breakdown changed (75% word delta). [risky] Optional field page was added to stats_user_breakdown; may shift model behaviour. [risky] Optional field projectIds was added to stats_user_breakdown; may shift model behaviour. [risky] Optional field sortBy was added to stats_user_breakdown; may shift model behaviour.","changes":[{"kind":"tool_removed","tool":"riddle_qr_code","detail":"Tool `riddle_qr_code` was removed.","severity":"breaking"},{"kind":"tool_added","tool":"riddle_tag_delete","detail":"Tool `riddle_tag_delete` was added.","severity":"safe"},{"kind":"description_changed","tool":"palette_get","after":"Reads the palettes - colors, fonts, button styles and background settings - of a Riddle. Returns every palette the Riddle can use (including the ones inherited from the account / project default preset) with all of its values, which palette is currently selected, which values this Riddle overrides, and the built-in palettes that can be used as a starting point. See riddle://reference/palette/fields for what each value does. Mind the size: a palette carries around 30 values and an account preset can contribute several palettes that have nothing to do with this Riddle, so the full response is easily thousands of tokens. Use \"omit\" to cut it down - omit: [\"paletteValues\"] lists the palettes by uuid and name only, which is how you find out WHICH palette you want (paletteUUID then returns that one in full), and \"builtInPalettes\"/\"customizedValues\"/\"hints\" drop those keys. To just read the design in effect, pass the selectedPaletteUuid from such a listing as paletteUUID.","before":"Reads the palettes - colors, fonts, button styles and background settings - of a Riddle. Returns every palette the Riddle can use (including the ones inherited from the account / project default preset) with all of its values, which palette is currently selected, which values this Riddle overrides, and the built-in palettes that can be used as a starting point. See riddle://reference/palette/fields for what each value does.","detail":"Description of `palette_get` changed (49% word delta).","severity":"risky","descriptionDelta":0.4901960784313726},{"kind":"input_property_added","path":"inputSchema.properties.omit","tool":"palette_get","after":{"type":"array","items":{"enum":["paletteValues","builtInPalettes","customizedValues","hints"],"type":"string"},"default":null,"description":"Leaves parts of the response out - the way to keep this call small. \"paletteValues\" lists every palette as {uuid, name} instead of with its ~30 values (then read the one you want with paletteUUID); \"builtInPalettes\", \"customizedValues\" and \"hints\" drop those keys entirely. Omit the parameter for the full response. Whatever you leave out is echoed back under \"omittedFields\", so a missing key never means the Riddle has none of it.","uniqueItems":true},"detail":"Optional field `omit` was added to `palette_get`; may shift model behaviour.","severity":"risky"},{"kind":"description_changed","tool":"questionBank_delete","after":"Deletes a question bank and every one of its items. Rejected with a QUESTION_BANK_INTERDEPENDENCY error if a Riddle in this bank's own project still references it, and BOTH VERSIONS OF A RIDDLE COUNT: the reference tracking is refreshed on every write - a publish, a duplicate, a template-use, an edit in the Creator, or a draft edit through the Builder API (riddle_builder_update and the riddle_builder_* tools) - and it looks at the draft AND, while the Riddle is published, at the live version. So adding a QuestionBank block pointing at this id is enough to protect the bank without (re)publishing, and removing that block from the draft of a published Riddle does NOT release it: the live version keeps pulling the bank until the Riddle is republished or unpublished. A successful delete therefore does mean no Riddle in the project references the bank. Two things the guard still does not cover: a validate-only call (riddle_builder_validate) writes nothing and so registers no reference, and the guard is scoped to this bank's OWN project. If the delete IS rejected, find the referencing Riddles with riddle_list/riddle_get, then either remove the QuestionBank block or repoint it at a different bank via riddle_builder_update - questionBank_riddleBlockItems can preview a specific block you already found. Irreversible once it succeeds. Tags the bank carried are cleaned up like questionBank_removeTag does it: one that nothing else uses any more is deleted from the project, one a Riddle or another bank still uses stays. Rejected for a public template id, see questionBank_templateList.","before":"Deletes a question bank and every one of its items. Rejected with a QUESTION_BANK_INTERDEPENDENCY error if a Riddle in this bank's own project still references it, and BOTH VERSIONS OF A RIDDLE COUNT: the reference tracking is refreshed on every write - a publish, a duplicate, a template-use, an edit in the Creator, or a draft edit through the Builder API (riddle_builder_update and the riddle_builder_* tools) - and it looks at the draft AND, while the Riddle is published, at the live version. So adding a QuestionBank block pointing at this id is enough to protect the bank without (re)publishing, and removing that block from the draft of a published Riddle does NOT release it: the live version keeps pulling the bank until the Riddle is republished or unpublished. A successful delete therefore does mean no Riddle in the project references the bank. Two things the guard still does not cover: a validate-only call (riddle_builder_validate) writes nothing and so registers no reference, and the guard is scoped to this bank's OWN project. If the delete IS rejected, find the referencing Riddles with riddle_list/riddle_get, then either remove the QuestionBank block or repoint it at a different bank via riddle_builder_update - questionBank_riddleBlockItems can preview a specific block you already found. Irreversible once it succeeds. Rejected for a public template id, see questionBank_templateList.","detail":"Description of `questionBank_delete` changed (10% word delta).","severity":"safe","descriptionDelta":0.10447761194029848},{"kind":"description_changed","tool":"questionBank_removeTag","after":"Removes a tag from a question bank by tagId. Once nothing uses a tag any more, the tag itself is deleted from the project - \"nothing\" includes Riddles, which share one set of tags with question banks: a tag a Riddle still uses survives its last bank and simply stops being listed by questionBank_tagList. Deleting a tagged bank outright (questionBank_delete) cleans its tags up the same way. Rejected for a public template id, see questionBank_templateList.","before":"Removes a tag from a question bank by tagId. Once nothing uses a tag any more, the tag itself is deleted from the project - \"nothing\" includes Riddles, which share one set of tags with question banks: a tag a Riddle still uses survives its last bank and simply stops being listed by questionBank_tagList. Rejected for a public template id, see questionBank_templateList.","detail":"Description of `questionBank_removeTag` changed (15% word delta).","severity":"safe","descriptionDelta":0.14814814814814814},{"kind":"input_property_added","path":"inputSchema.properties.includeAvailableTopics","tool":"reference_get","after":{"type":"boolean","default":null,"description":"Whether the response should carry the full \"availableTopics\" catalogue. Omit it: the first reference_get of a session gets the catalogue, every call after it gets a one-line pointer back to it instead of repeating ~2.5 KB you already have - which on a small document is several times the document itself. Pass true to get it again (a fresh conversation on an existing session, or after losing it), false to never pay for it."},"detail":"Optional field `includeAvailableTopics` was added to `reference_get`; may shift model behaviour.","severity":"risky"},{"kind":"description_changed","tool":"riddle_move_check","after":"Checks, without changing anything, whether a set of Riddles can be moved and which projects they can be moved to - the same check riddle_move runs before it moves anything. Pass exactly the UUID/UUIDs you intend to hand to riddle_move, because the answer depends on the whole set: a Riddle that is connected to another one (a Form embedded into another Riddle as a form select, a Quiz reporting into a Leaderboard) can only be moved when everything it is connected to moves with it, so the same Riddle can be blocked on its own and movable as part of a larger call. Returns {canMoveAll, movable, blocked, addUUIDs, canMoveToPersonal, projects}: \"blocked\" names, per Riddle, \"missingRiddles\" (the exact connected Riddles that are not part of the set, each with uuid, title, type and relation: \"dependent\" for a Riddle reporting into it, \"embedded\" for a Riddle it embeds), \"missingUUIDs\" as the bare UUIDs to add, \"connectedRiddles\" as the unfiltered picture of everything it is connected to, \"inaccessibleConnections\" as the number of connected Riddles in projects you cannot access, \"blockedByRiddlesInThisCall\" as the Riddles of this very call that hold it back because they are blocked themselves, \"resolveByAddingUUIDs\" as what to add so THIS Riddle can move, and \"resolvable\" telling you whether adding UUIDs can fix it at all. Blocking travels along connections, so act on \"resolveByAddingUUIDs\" (or simply on the top-level \"addUUIDs\"), never on an empty \"missingUUIDs\": a Riddle whose connections are all in the set already has nothing of its own to add and is still blocked while the Riddle it is tied to is - \"resolvable\" is therefore shared by all Riddles that can only move together, and false only when one of them is connected to a Riddle you cannot reach at all. \"addUUIDs\" is the deduplicated union of every missingUUIDs - add it to UUIDs and check again, repeating until canMoveAll is true, because connections chain (a Quiz you add for one Leaderboard can report into a second one) - and \"projects\" is the intersection of the projects EVERY Riddle of the set can go to - a project you may lack the transfer permission in, or that does not support something one of the Riddles uses, is not in it. Use this before riddle_move whenever the Riddles were not all created by you, or to explain to the user why a move is not possible.","before":"Checks, without changing anything, whether a set of Riddles can be moved and which projects they can be moved to - the same check riddle_move runs before it moves anything. Pass exactly the UUID/UUIDs you intend to hand to riddle_move, because the answer depends on the whole set: a Riddle that is connected to another one (a Form embedded into another Riddle as a form select, a Quiz reporting into a Leaderboard) can only be moved when everything it is connected to moves with it, so the same Riddle can be blocked on its own and movable as part of a larger call. Returns {canMoveAll, movable, blocked, addUUIDs, canMoveToPersonal, projects}: \"blocked\" names, per Riddle, \"missingRiddles\" (the exact connected Riddles that are not part of the set, each with uuid, title, type and relation: \"dependent\" for a Riddle reporting into it, \"embedded\" for a Riddle it embeds), \"missingUUIDs\" as the bare UUIDs to add, \"connectedRiddles\" as the unfiltered picture of everything it is connected to, \"inaccessibleConnections\" as the number of connected Riddles in projects you cannot access, and \"resolvable\" telling you whether adding UUIDs can fix it at all; \"addUUIDs\" is the deduplicated union of every missingUUIDs - add it to UUIDs and check again, repeating until canMoveAll is true, because connections chain (a Quiz you add for one Leaderboard can report into a second one) - and \"projects\" is the intersection of the projects EVERY Riddle of the set can go to - a project you may lack the transfer permission in, or that does not support something one of the Riddles uses, is not in it. Use this before riddle_move whenever the Riddles were not all created by you, or to explain to the user why a move is not possible.","detail":"Description of `riddle_move_check` changed (19% word delta).","severity":"safe","descriptionDelta":0.1863354037267081},{"kind":"description_changed","tool":"riddle_tag_list","after":"Lists the tags of a project together with how many Riddles use each of them: [{id, name, count}]. Tags are per project - a tag of one project cannot be applied to a Riddle of another - so pass the projectId of the project whose Riddles you are tagging; omitting it returns the tags of the project the API key is scoped to (your personal tags for a user API key). Use this to find the tag \"id\" values riddle_list/riddle_account_list accept in their \"tags\" filter, and to check whether a tag already exists before riddle_tag_add creates a new one. \"count\" counts RIDDLES only, and Riddle tags and question bank tags are ONE set per project (the same tag can be applied to both and has the same id in either): a tag with \"count\": 0 therefore means \"no Riddle uses this tag\", not \"nothing uses it\" - question banks may well be using it, see questionBank_tagList. A tag is deleted automatically as soon as neither a Riddle nor a bank uses it any more - by untagging its last carrier, and by deleting that carrier - so a tag listed here is either in use somewhere or a leftover from before that cleanup existed, which riddle_tag_delete removes.","before":"Lists the tags of a project together with how many Riddles use each of them: [{id, name, count}]. Tags are per project - a tag of one project cannot be applied to a Riddle of another - so pass the projectId of the project whose Riddles you are tagging; omitting it returns the tags of the project the API key is scoped to (your personal tags for a user API key). Use this to find the tag \"id\" values riddle_list/riddle_account_list accept in their \"tags\" filter, and to check whether a tag already exists before riddle_tag_add creates a new one. \"count\" counts RIDDLES only, and Riddle tags and question bank tags are ONE set per project (the same tag can be applied to both and has the same id in either): a tag with \"count\": 0 therefore means \"no Riddle uses this tag\", not \"nothing uses it\" - question banks may well be using it, see questionBank_tagList. Such a tag is not removed automatically; a tag is only deleted once neither a Riddle nor a bank uses it.","detail":"Description of `riddle_tag_list` changed (22% word delta).","severity":"safe","descriptionDelta":0.2192982456140351},{"kind":"description_changed","tool":"riddle_tag_remove","after":"Removes a tag from one or many Riddles. Identify the tag either by tagName or by tagId from riddle_tag_list, and the Riddles either by UUID (a single one) or by UUIDs (array of Riddle UUID strings, max 100). Nothing is ever created here: a tag the Riddle's project does not have, or a tag the Riddle does not actually carry, is an error for that Riddle - with UUIDs it is reported as that entry's \"error\" in the {bulk, operation, summary, results} envelope while the other Riddles are still untagged. Once nothing uses a tag any more, the tag itself is deleted from the project - \"nothing\" includes question banks, which share one set of tags with Riddles: a tag a bank still uses survives its last Riddle and stays listed by riddle_tag_list with \"count\": 0. Deleting a tagged Riddle outright (riddle_delete) cleans its tags up the same way, so a tag never lingers at zero carriers; riddle_tag_delete is only for leftovers from before that. Returns the removed tag plus the Riddle's remaining tags.","before":"Removes a tag from one or many Riddles. Identify the tag either by tagName or by tagId from riddle_tag_list, and the Riddles either by UUID (a single one) or by UUIDs (array of Riddle UUID strings, max 100). Nothing is ever created here: a tag the Riddle's project does not have, or a tag the Riddle does not actually carry, is an error for that Riddle - with UUIDs it is reported as that entry's \"error\" in the {bulk, operation, summary, results} envelope while the other Riddles are still untagged. Once nothing uses a tag any more, the tag itself is deleted from the project - \"nothing\" includes question banks, which share one set of tags with Riddles: a tag a bank still uses survives its last Riddle and stays listed by riddle_tag_list with \"count\": 0. Returns the removed tag plus the Riddle's remaining tags.","detail":"Description of `riddle_tag_remove` changed (18% word delta).","severity":"safe","descriptionDelta":0.18000000000000005},{"kind":"description_changed","tool":"riddle_unpublish","after":"Unpublishes one or many Riddles; meaning each Riddle will no longer be available via https://www.riddle.com/view/[RIDDLEID]. A LIVE Leaderboard with active Riddle connections cannot be unpublished - use riddle_delete on it instead, which is always allowed and cleans up the connected Riddles automatically. Unpublishing a Riddle that is not live in the first place is not an error but a no-op, and it says so: the response carries a \"message\" stating that nothing was taken offline, either because the Riddle was never published (its content is then not checked for conflicts at all - that refusal only applies while a Riddle is live) or because it was already offline. Read that \"message\" before reporting a Riddle as \"taken offline\"; \"context.published.at\" is null in all of these cases and cannot tell them apart. Pass UUID for a single Riddle - the response is then the same compact build-configuration envelope riddle_get returns, with the cleared published state under \"context.published\"; use \"omit\" to shrink it the same way as riddle_get. Pass UUIDs (array of Riddle UUID strings, max 100) to unpublish several at once; the response is then the bulk envelope {bulk: true, operation, summary, results: [...]} with the new state per Riddle. A bulk unpublish is not atomic and never gives up early: a Riddle that cannot be unpublished (e.g. a Leaderboard with active connections) is reported as that entry's \"error\" while all other Riddles are still unpublished. A refusal says which content stands in the way: it fails with error \"RIDDLE_UNPUBLISH\" and a \"validationErrors\" list of {message, code, ...} entries - the same two-list failure shape riddle_publish uses, see riddle://reference/response-format (\"errors\").","before":"Unpublishes one or many Riddles; meaning each Riddle will no longer be available via https://www.riddle.com/view/[RIDDLEID]. A Leaderboard with active Riddle connections cannot be unpublished - use riddle_delete on it instead, which is always allowed and cleans up the connected Riddles automatically. Pass UUID for a single Riddle - the response is then the same compact build-configuration envelope riddle_get returns, with the cleared published state under \"context.published\"; use \"omit\" to shrink it the same way as riddle_get. Pass UUIDs (array of Riddle UUID strings, max 100) to unpublish several at once; the response is then the bulk envelope {bulk: true, operation, summary, results: [...]} with the new state per Riddle. A bulk unpublish is not atomic and never gives up early: a Riddle that cannot be unpublished (e.g. a Leaderboard with active connections) is reported as that entry's \"error\" while all other Riddles are still unpublished. A refusal says which content stands in the way: it fails with error \"RIDDLE_UNPUBLISH\" and a \"validationErrors\" list of {message, code, ...} entries - the same two-list failure shape riddle_publish uses, see riddle://reference/response-format (\"errors\").","detail":"Description of `riddle_unpublish` changed (21% word delta).","severity":"safe","descriptionDelta":0.20666666666666667},{"kind":"description_changed","tool":"riddleTemplate_use","after":"Creates a new Riddle from a template, as an unchanged copy of it - content, settings and design preset - and records it as a copy of the template's Riddle (riddle_get reports that as context.duplicated). Use this whenever the template is what you want; to adapt it first, read it with riddleTemplate_get and build the edited configuration with a riddle_builder_<type> tool instead. The new Riddle is a draft: call riddle_publish to make it live. Returns the created Riddle in the standard build-configuration envelope - the same shape riddle_get returns, and it takes the same \"omit\" parameter to shrink it (omit: [\"build.omittedDefaults\"] alone cuts most of it). Requires the template-use permission, plus the Riddle-create permission in the target project.","before":"Creates a new Riddle from a template, as an unchanged copy of it - content, settings and design preset - and records it as a copy of the template's Riddle (riddle_get reports that as context.duplicated). Use this whenever the template is what you want; to adapt it first, read it with riddleTemplate_get and build the edited configuration with a riddle_builder_<type> tool instead. The new Riddle is a draft: call riddle_publish to make it live. Returns the created Riddle in the standard build-configuration envelope. Requires the template-use permission, plus the Riddle-create permission in the target project.","detail":"Description of `riddleTemplate_use` changed (14% word delta).","severity":"safe","descriptionDelta":0.14084507042253525},{"kind":"input_property_added","path":"inputSchema.properties.omit","tool":"riddleTemplate_use","after":{"type":"array","items":{"enum":["build","warnings","nextBlockId","published","context","build.omittedDefaults"],"type":"string"},"default":null,"description":"Same \"omit\" parameter as riddle_get's, applied to the returned envelope (see riddle_get for the full description). Reach for omit: [\"build.omittedDefaults\"] here as well - the created Riddle is a copy of the template, so its per-block default maps are the biggest part of this response and state nothing riddle://reference/block-defaults/<block type> does not.","uniqueItems":true},"detail":"Optional field `omit` was added to `riddleTemplate_use`; may shift model behaviour.","severity":"risky"},{"kind":"description_changed","tool":"stats_project_breakdown","after":"Returns the full stats breakdown of a single project: every Riddle in it, down to blocks, choices and form fields. This is the drill-down from stats_user_breakdown's account-wide summary. It is bounded by the size of the project, so on a project with a lot of Riddles prefer a shorter dateFrom/dateTo range, or stats_riddle_breakdown for the individual Riddles the summary pointed at.","before":"Returns a stats breakdown for a specific project.","detail":"Description of `stats_project_breakdown` changed (88% word delta).","severity":"risky","descriptionDelta":0.8775510204081632},{"kind":"description_changed","tool":"stats_user_breakdown","after":"Returns an account-wide stats summary for the authenticated user: one row per Riddle with its views, starts, submissions and active time, plus the totals across every Riddle in scope. Ranked by sortBy and returned 25 Riddles per page (\"hasMore\" says whether another page exists). This is intentionally a summary, not a deep breakdown - for a Riddle's blocks, choices and form fields call stats_riddle_breakdown with its ID, and for one project's full breakdown call stats_project_breakdown. On accounts with many projects, narrow the scope with projectIds. Requires a user API key — will fail with project API keys.","before":"Returns a stats breakdown for the authenticated user across all accessible projects. Requires a user API key — will fail with project API keys. Use stats_project_breakdown for single-project stats instead.","detail":"Description of `stats_user_breakdown` changed (75% word delta).","severity":"risky","descriptionDelta":0.7466666666666666},{"kind":"input_property_added","path":"inputSchema.properties.page","tool":"stats_user_breakdown","after":{"type":["null","integer"],"default":null,"description":"Page number, 1-indexed (default: 1). Zero or negative is rejected with a VALIDATION_ERROR, not clamped to page 1 - the same contract as riddle_list/project_list."},"detail":"Optional field `page` was added to `stats_user_breakdown`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.projectIds","tool":"stats_user_breakdown","after":{"type":["array","null"],"default":null,"description":"Narrow the summary to these project IDs (array of integers, from project_list). Omit to cover the whole account, including the personal project. Passing a project the user cannot view stats of is an error, not a silently skipped project."},"detail":"Optional field `projectIds` was added to `stats_user_breakdown`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.sortBy","tool":"stats_user_breakdown","after":{"enum":["views","starts","submissions","timeActive"],"type":"string","default":null,"description":"Metric the Riddles are ranked by before the page is cut: \"views\" (default), \"starts\", \"submissions\" or \"timeActive\". Sorting always spans the whole account (or the projects given), so page 1 is genuinely the top of the account."},"detail":"Optional field `sortBy` was added to `stats_user_breakdown`; may shift model behaviour.","severity":"risky"}],"published_at":"2026-08-24T14:14:15.101Z"},{"slug":"ZV-2026-0333","server_name":"riddle.com","severity":"breaking","title":"riddle.com: Resource riddle://reference/riddle-builder/block-defaults was removed, consumers reading it will break.","summary":"[safe] Tool project_get was added. [safe] Tool project_get_settings was added. [safe] Tool project_list was added. [safe] Tool reference_get was added. [safe] Tool riddle_builder_placeholder was added. [safe] Tool riddle_builder_update was added. [safe] Tool riddle_builder_validate was added. [safe] Tool stats_fetch was added. [safe] Tool stats_overview_fetch was added. [safe] Tool stats_project_breakdown was added. [safe] Tool stats_riddle_breakdown was added. [safe] Tool stats_user_breakdown was added. [safe] Description of questionBank_delete changed (16% word delta). [safe] Description of riddle_get changed (4% word delta). [breaking] Resource riddle://reference/riddle-builder/block-defaults was removed, consumers reading it will break. [safe] Resource riddle://reference/block-defaults/Ad was added. [safe] Resource riddle://reference/block-defaults/Content was added. [safe] Resource riddle://reference/block-defaults/Flashcard was added. [safe] Resource riddle://reference/block-defaults/FormBuilder was added. [safe] Resource riddle://reference/block-defaults/FormField was added. [safe] Resource riddle://reference/block-defaults/GuessIt was added. [safe] Resource riddle://reference/block-defaults/GuessTheScore was added. [safe] Resource riddle://reference/block-defaults/InteractiveGraphic was added. [safe] Resource riddle://reference/block-defaults/Matrix was added. [safe] Resource riddle://reference/block-defaults/MultipleChoice was added. [safe] Resource riddle://reference/block-defaults/NetPromoterScore was added. [safe] Resource riddle://reference/block-defaults/Order was added. [safe] Resource riddle://reference/block-defaults/PickTheWinner was added. [safe] Resource riddle://reference/block-defaults/QuestionBank was added. [safe] Resource riddle://reference/block-defaults/Quote was added. [safe] Resource riddle://reference/block-defaults/RateIt was added. [safe] Resource riddle://reference/block-defaults/Reaction was added. [safe] Resource riddle://reference","changes":[{"kind":"tool_added","tool":"project_get","detail":"Tool `project_get` was added.","severity":"safe"},{"kind":"tool_added","tool":"project_get_settings","detail":"Tool `project_get_settings` was added.","severity":"safe"},{"kind":"tool_added","tool":"project_list","detail":"Tool `project_list` was added.","severity":"safe"},{"kind":"tool_added","tool":"reference_get","detail":"Tool `reference_get` was added.","severity":"safe"},{"kind":"tool_added","tool":"riddle_builder_placeholder","detail":"Tool `riddle_builder_placeholder` was added.","severity":"safe"},{"kind":"tool_added","tool":"riddle_builder_update","detail":"Tool `riddle_builder_update` was added.","severity":"safe"},{"kind":"tool_added","tool":"riddle_builder_validate","detail":"Tool `riddle_builder_validate` was added.","severity":"safe"},{"kind":"tool_added","tool":"stats_fetch","detail":"Tool `stats_fetch` was added.","severity":"safe"},{"kind":"tool_added","tool":"stats_overview_fetch","detail":"Tool `stats_overview_fetch` was added.","severity":"safe"},{"kind":"tool_added","tool":"stats_project_breakdown","detail":"Tool `stats_project_breakdown` was added.","severity":"safe"},{"kind":"tool_added","tool":"stats_riddle_breakdown","detail":"Tool `stats_riddle_breakdown` was added.","severity":"safe"},{"kind":"tool_added","tool":"stats_user_breakdown","detail":"Tool `stats_user_breakdown` was added.","severity":"safe"},{"kind":"description_changed","tool":"questionBank_delete","after":"Deletes a question bank and every one of its items. Rejected with a QUESTION_BANK_INTERDEPENDENCY error if a Riddle in this bank's own project still references it, and BOTH VERSIONS OF A RIDDLE COUNT: the reference tracking is refreshed on every write - a publish, a duplicate, a template-use, an edit in the Creator, or a draft edit through the Builder API (riddle_builder_update and the riddle_builder_* tools) - and it looks at the draft AND, while the Riddle is published, at the live version. So adding a QuestionBank block pointing at this id is enough to protect the bank without (re)publishing, and removing that block from the draft of a published Riddle does NOT release it: the live version keeps pulling the bank until the Riddle is republished or unpublished. A successful delete therefore does mean no Riddle in the project references the bank. Two things the guard still does not cover: a validate-only call (riddle_builder_validate) writes nothing and so registers no reference, and the guard is scoped to this bank's OWN project. If the delete IS rejected, find the referencing Riddles with riddle_list/riddle_get, then either remove the QuestionBank block or repoint it at a different bank via riddle_builder_update - questionBank_riddleBlockItems can preview a specific block you already found. Irreversible once it succeeds. Rejected for a public template id, see questionBank_templateList.","before":"Deletes a question bank and every one of its items. Rejected with a QUESTION_BANK_INTERDEPENDENCY error if a Riddle in this bank's own project still references it, and DRAFTS COUNT: the reference tracking is refreshed on every write, whether that is a publish, a duplicate, a template-use, an edit in the Creator, or a draft edit through the Builder API (riddle_builder_update and the riddle_builder_* tools). So adding a QuestionBank block pointing at this id is enough to protect the bank - the Riddle does not have to be (re)published for the guard to see it. A successful delete therefore does mean no Riddle in the project references the bank. Two things the guard still does not cover: a validate-only call (riddle_builder_validate) writes nothing and so registers no reference, and the guard is scoped to this bank's OWN project. If the delete IS rejected, find the referencing Riddles with riddle_list/riddle_get, then either remove the QuestionBank block or repoint it at a different bank via riddle_builder_update - questionBank_riddleBlockItems can preview a specific block you already found. Irreversible once it succeeds. Rejected for a public template id, see questionBank_templateList.","detail":"Description of `questionBank_delete` changed (16% word delta).","severity":"safe","descriptionDelta":0.16129032258064513},{"kind":"description_changed","tool":"riddle_get","after":"Gets one Riddle - or several, with UUIDs - as a compact build-configuration envelope: {uuid, type, modifiedAt, build, nextBlockId, warnings, published, context}. \"build\" is the same build config POST /riddle-builder accepts (see the riddle_builder_* tools) - everything the Riddle contains which cannot be expressed there is left out of \"build\" and reported in \"warnings\" instead; this never fails on content it cannot express. A property that is simply still at its block type's default is left out too, but never silently: each block carries an \"omittedDefaults\" map of those properties with the value each one is at - so \"not in the config\" does not mean \"unknown\". Read those values, do not resend them: many build properties enable a feature by being present at all, whatever their value. Pass omit: [\"build.omittedDefaults\"] to leave those maps out for a much smaller response - riddle://reference/block-defaults/<block type> states the same defaults without a Riddle in hand. \"id\" and \"type\" are always present on every block and never omitted, and a property the block cannot accept in its current configuration is not listed either. \"build\" always describes the DRAFT - the version you edit; \"published\" describes the live version visitors see: null if never published, {\"status\": \"identical\"} if the live version is exactly what \"build\" shows, or {\"status\": \"differs\", \"build\": ..., \"warnings\": ...} with the live version in full when the draft has unpublished changes; unpublished changes the build config cannot express show up as {\"status\": \"identical\", \"hasUnpublishedChanges\": true, ...}. Every non-null \"published\" carries \"isLive\" - whether that version is online right now; it is false after riddle_unpublish, which leaves the last published version stored. Either way, call riddle_publish to make \"build\" live. \"context\" adds the extra fields an MCP client typically needs next to the build config: title, image (the Riddle's thumbnail), tags, notes, viewUrl (the public URL the Riddle is reachable under - null when it is not published or its landing page is turned off, with \"viewUrlUnavailable\": {reason, message} saying which of the two), features (incl. hasIntegration, consistent with riddle_list/riddle_account_list), origin (builder/aiGenerated/apiManageable - whether riddle_delete, riddle_builder_update and palette_customize will work on this Riddle, consistent with riddle_list/riddle_account_list), published/unpublished/modified state (both timestamps set = the Riddle was published and then taken offline again), duplicated (the Riddle this one was copied from, if any), project/team identity, and the preset relationship (id/parentId, whether it is merged from a parent preset and whether it has since drifted from it). Pass includeRiddleData=true to additionally receive the full stored Riddle under \"riddle\" - a large payload, rarely needed. Use \"omit\" to leave parts of all this out when you do not need them (see that parameter - it is the only way to make this call smaller), and UUIDs to read several Riddles in one call (see that parameter for its own, lower size budget).","before":"Gets one Riddle - or several, with UUIDs - as a compact build-configuration envelope: {uuid, type, modifiedAt, build, nextBlockId, warnings, published, context}. \"build\" is the same build config POST /riddle-builder accepts (see the riddle_builder_* tools) - everything the Riddle contains which cannot be expressed there is left out of \"build\" and reported in \"warnings\" instead; this never fails on content it cannot express. A property that is simply still at its block type's default is left out too, but never silently: each block carries an \"omittedDefaults\" map of those properties with the value each one is at - so \"not in the config\" does not mean \"unknown\". Read those values, do not resend them: many build properties enable a feature by being present at all, whatever their value. Pass omit: [\"build.omittedDefaults\"] to leave those maps out for a much smaller response - riddle://reference/riddle-builder/block-defaults states the same defaults without a Riddle in hand. \"id\" and \"type\" are always present on every block and never omitted, and a property the block cannot accept in its current configuration is not listed either. \"build\" always describes the DRAFT - the version you edit; \"published\" describes the live version visitors see: null if never published, {\"status\": \"identical\"} if the live version is exactly what \"build\" shows, or {\"status\": \"differs\", \"build\": ..., \"warnings\": ...} with the live version in full when the draft has unpublished changes; unpublished changes the build config cannot express show up as {\"status\": \"identical\", \"hasUnpublishedChanges\": true, ...}. Either way, call riddle_publish to make \"build\" live. \"context\" adds the extra fields an MCP client typically needs next to the build config: title, image (the Riddle's thumbnail), tags, notes, viewUrl (the public URL the Riddle is reachable under - null when it is not published or its landing page is turned off, with \"viewUrlUnavailable\": {reason, message} saying which of the two), features (incl. hasIntegration, consistent with riddle_list/riddle_account_list), origin (builder/aiGenerated/apiManageable - whether riddle_delete, riddle_builder_update and palette_customize will work on this Riddle, consistent with riddle_list/riddle_account_list), published/unpublished/modified state (both timestamps set = the Riddle was published and then taken offline again), duplicated (the Riddle this one was copied from, if any), project/team identity, and the preset relationship (id/parentId, whether it is merged from a parent preset and whether it has since drifted from it). Pass includeRiddleData=true to additionally receive the full stored Riddle under \"riddle\" - a large payload, rarely needed. Use \"omit\" to leave parts of all this out when you do not need them (see that parameter - it is the only way to make this call smaller), and UUIDs to read several Riddles in one call (see that parameter for its own, lower size budget).","detail":"Description of `riddle_get` changed (4% word delta).","severity":"safe","descriptionDelta":0.04255319148936165},{"kind":"resource_removed","tool":"riddle://reference/riddle-builder/block-defaults","before":"riddle://reference/riddle-builder/block-defaults","detail":"Resource `riddle://reference/riddle-builder/block-defaults` was removed, consumers reading it will break.","severity":"breaking"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Ad","after":"riddle://reference/block-defaults/Ad","detail":"Resource `riddle://reference/block-defaults/Ad` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Content","after":"riddle://reference/block-defaults/Content","detail":"Resource `riddle://reference/block-defaults/Content` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Flashcard","after":"riddle://reference/block-defaults/Flashcard","detail":"Resource `riddle://reference/block-defaults/Flashcard` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/FormBuilder","after":"riddle://reference/block-defaults/FormBuilder","detail":"Resource `riddle://reference/block-defaults/FormBuilder` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/FormField","after":"riddle://reference/block-defaults/FormField","detail":"Resource `riddle://reference/block-defaults/FormField` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/GuessIt","after":"riddle://reference/block-defaults/GuessIt","detail":"Resource `riddle://reference/block-defaults/GuessIt` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/GuessTheScore","after":"riddle://reference/block-defaults/GuessTheScore","detail":"Resource `riddle://reference/block-defaults/GuessTheScore` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/InteractiveGraphic","after":"riddle://reference/block-defaults/InteractiveGraphic","detail":"Resource `riddle://reference/block-defaults/InteractiveGraphic` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Matrix","after":"riddle://reference/block-defaults/Matrix","detail":"Resource `riddle://reference/block-defaults/Matrix` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/MultipleChoice","after":"riddle://reference/block-defaults/MultipleChoice","detail":"Resource `riddle://reference/block-defaults/MultipleChoice` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/NetPromoterScore","after":"riddle://reference/block-defaults/NetPromoterScore","detail":"Resource `riddle://reference/block-defaults/NetPromoterScore` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Order","after":"riddle://reference/block-defaults/Order","detail":"Resource `riddle://reference/block-defaults/Order` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/PickTheWinner","after":"riddle://reference/block-defaults/PickTheWinner","detail":"Resource `riddle://reference/block-defaults/PickTheWinner` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/QuestionBank","after":"riddle://reference/block-defaults/QuestionBank","detail":"Resource `riddle://reference/block-defaults/QuestionBank` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Quote","after":"riddle://reference/block-defaults/Quote","detail":"Resource `riddle://reference/block-defaults/Quote` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/RateIt","after":"riddle://reference/block-defaults/RateIt","detail":"Resource `riddle://reference/block-defaults/RateIt` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Reaction","after":"riddle://reference/block-defaults/Reaction","detail":"Resource `riddle://reference/block-defaults/Reaction` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/SingleChoice","after":"riddle://reference/block-defaults/SingleChoice","detail":"Resource `riddle://reference/block-defaults/SingleChoice` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/SlotMachine","after":"riddle://reference/block-defaults/SlotMachine","detail":"Resource `riddle://reference/block-defaults/SlotMachine` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Sudoku","after":"riddle://reference/block-defaults/Sudoku","detail":"Resource `riddle://reference/block-defaults/Sudoku` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Swiper","after":"riddle://reference/block-defaults/Swiper","detail":"Resource `riddle://reference/block-defaults/Swiper` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/TextEntry","after":"riddle://reference/block-defaults/TextEntry","detail":"Resource `riddle://reference/block-defaults/TextEntry` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/ThisOrThat","after":"riddle://reference/block-defaults/ThisOrThat","detail":"Resource `riddle://reference/block-defaults/ThisOrThat` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/TierList","after":"riddle://reference/block-defaults/TierList","detail":"Resource `riddle://reference/block-defaults/TierList` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/TypeRush","after":"riddle://reference/block-defaults/TypeRush","detail":"Resource `riddle://reference/block-defaults/TypeRush` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/Upvote","after":"riddle://reference/block-defaults/Upvote","detail":"Resource `riddle://reference/block-defaults/Upvote` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/block-defaults/WheelSpinner","after":"riddle://reference/block-defaults/WheelSpinner","detail":"Resource `riddle://reference/block-defaults/WheelSpinner` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/bulk","after":"riddle://reference/concepts/bulk","detail":"Resource `riddle://reference/concepts/bulk` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/common-block-properties","after":"riddle://reference/concepts/common-block-properties","detail":"Resource `riddle://reference/concepts/common-block-properties` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/defaults","after":"riddle://reference/concepts/defaults","detail":"Resource `riddle://reference/concepts/defaults` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/editing","after":"riddle://reference/concepts/editing","detail":"Resource `riddle://reference/concepts/editing` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/form-fields-usage","after":"riddle://reference/concepts/form-fields-usage","detail":"Resource `riddle://reference/concepts/form-fields-usage` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/limits","after":"riddle://reference/concepts/limits","detail":"Resource `riddle://reference/concepts/limits` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/logic","after":"riddle://reference/concepts/logic","detail":"Resource `riddle://reference/concepts/logic` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/merge-semantics","after":"riddle://reference/concepts/merge-semantics","detail":"Resource `riddle://reference/concepts/merge-semantics` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/move-restrictions","after":"riddle://reference/concepts/move-restrictions","detail":"Resource `riddle://reference/concepts/move-restrictions` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/preset","after":"riddle://reference/concepts/preset","detail":"Resource `riddle://reference/concepts/preset` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/publish","after":"riddle://reference/concepts/publish","detail":"Resource `riddle://reference/concepts/publish` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/question-bank-items","after":"riddle://reference/concepts/question-bank-items","detail":"Resource `riddle://reference/concepts/question-bank-items` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/response-envelope","after":"riddle://reference/concepts/response-envelope","detail":"Resource `riddle://reference/concepts/response-envelope` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/result-pages","after":"riddle://reference/concepts/result-pages","detail":"Resource `riddle://reference/concepts/result-pages` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/tools-by-category","after":"riddle://reference/concepts/tools-by-category","detail":"Resource `riddle://reference/concepts/tools-by-category` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/troubleshooting","after":"riddle://reference/concepts/troubleshooting","detail":"Resource `riddle://reference/concepts/troubleshooting` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/unknown-properties","after":"riddle://reference/concepts/unknown-properties","detail":"Resource `riddle://reference/concepts/unknown-properties` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/warnings","after":"riddle://reference/concepts/warnings","detail":"Resource `riddle://reference/concepts/warnings` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/concepts/workflows","after":"riddle://reference/concepts/workflows","detail":"Resource `riddle://reference/concepts/workflows` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/form-field-defaults","after":"riddle://reference/form-field-defaults","detail":"Resource `riddle://reference/form-field-defaults` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/index","after":"riddle://reference/index","detail":"Resource `riddle://reference/index` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/publish-defaults","after":"riddle://reference/publish-defaults","detail":"Resource `riddle://reference/publish-defaults` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/riddle-defaults/Form","after":"riddle://reference/riddle-defaults/Form","detail":"Resource `riddle://reference/riddle-defaults/Form` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/riddle-defaults/Leaderboard","after":"riddle://reference/riddle-defaults/Leaderboard","detail":"Resource `riddle://reference/riddle-defaults/Leaderboard` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/riddle-defaults/Minigame","after":"riddle://reference/riddle-defaults/Minigame","detail":"Resource `riddle://reference/riddle-defaults/Minigame` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/riddle-defaults/Personality","after":"riddle://reference/riddle-defaults/Personality","detail":"Resource `riddle://reference/riddle-defaults/Personality` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/riddle-defaults/Placeholder","after":"riddle://reference/riddle-defaults/Placeholder","detail":"Resource `riddle://reference/riddle-defaults/Placeholder` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/riddle-defaults/Poll","after":"riddle://reference/riddle-defaults/Poll","detail":"Resource `riddle://reference/riddle-defaults/Poll` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/riddle-defaults/Predictor","after":"riddle://reference/riddle-defaults/Predictor","detail":"Resource `riddle://reference/riddle-defaults/Predictor` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/riddle-defaults/Quiz","after":"riddle://reference/riddle-defaults/Quiz","detail":"Resource `riddle://reference/riddle-defaults/Quiz` was added.","severity":"safe"},{"kind":"resource_added","tool":"riddle://reference/riddle-defaults/Story","after":"riddle://reference/riddle-defaults/Story","detail":"Resource `riddle://reference/riddle-defaults/Story` was added.","severity":"safe"}],"published_at":"2026-08-24T12:12:25.472Z"}]