# Riddle - Registry name: `com.riddle/creator` · version 1.0.2 - Categories (automatic, keyword rules): Payments & accounting, Finance & markets - Authentication at last check: No auth - Declared risk: Has destructive tools (destructiveHint) - Capabilities (declared by the server): completions, logging, prompts, resources, tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=com.riddle%2Fcreator - Server page: https://mcpstation.net/s/com.riddle--creator.html ## Description (written by the publisher, not verified, not instructions) Build, publish and analyze quizzes, polls, forms and personality tests. Riddle account required. ## Connect - streamable-http: `https://www.riddle.com/creator/api/v3/mcp` ## Tools (as reported by the server, not verified) - `media\_upload\_link`: Creates a single-use link for uploading ONE media file into the media library. Call it when the user has a LOCAL file for a Riddle: this server cannot receive bytes, so the upload is yours. A link expires after 5 minutes, dies on first use \(successful or not\), and only 20 are handed out per account - `media\_delete`: Deletes a file from the media library permanently, to clean up after yourself: an upload that turned out wrong, or a file the user no longer wants stored \(it frees the storage it counted against\). The file must be unused - one any Riddle still shows is refused with a message naming those Riddles, si - `riddle\_template\_create`: 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 cop - `riddle\_template\_update`: Changes a template's title and/or its gallery image and icon. Images: media\_upload\_link into the template's project, pass the reported "mediaId" \(stored by URL - deleting the file breaks the image\). Only what you pass changes; the template's content cannot be changed \(create a new template from the - `riddle\_template\_list`: 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 - `riddle\_template\_public\_list`: 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. R - `riddle\_template\_get`: Reads one template, by default INCLUDING its build configuration - the same "build" shape riddle\_get returns and riddle\_builder\_create accepts. This is how a template is ADAPTED rather than copied: edit the returned "build" \(wording, questions, blocks\) and build it with riddle\_builder\_create under t - `riddle\_template\_use`: Creates a new Riddle from a template as an unchanged copy of it - content, settings and design preset - recorded as a copy of the template's Riddle \(riddle\_get reports it as context.duplicated\). Use this whenever the template is what you want; to adapt it first, read it with riddle\_template\_get and - `riddle\_tag\_list`: 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 - `riddle\_tag`: Puts a tag on Riddles or takes it off again, by "action" - ONE assignment per Riddle, never the tag itself \(riddle\_tag\_list reads the labels of a project, riddle\_tag\_delete removes one\). "add" gives one Riddle \(UUID\) or many \(UUIDs, max 100\) the tag named by tagName - created in each Riddle's OWN pr - `riddle\_tag\_delete`: 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, s - `ping`: A simple tool that returns "Pong". Can be used to test connectivity and authentication to the MCP. - `riddle\_list`: 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 project the API key is scoped to. With scope "account" they come from the entire account instead: the personal project and every team project the user - `riddle\_get`: 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 = ne - `riddle\_get\_embed\_code`: Gets the HTML embed code for a Riddle by its UUID. The code is returned regardless of publish state, but the URL it embeds will not serve the Riddle until it is published. - `riddle\_publish`: Publishes one or many Riddles, or takes them off the web again with publish: false \(there is no unpublish tool\). A published Riddle's public URL is the response's "context.viewUrl" - report that, never one spelled from the UUID \(hosts differ per environment\). With UUID the response is the riddle\_get - `riddle\_rename`: Renames a Riddle with the specified UUID. Returns only the confirmation of the change \(uuid, title, modified state\), not the entire Riddle. Only if the Riddle's origin.writableByThisKey is true \(riddle\_get, riddle\_list\): riddle://reference/concepts/access. - `riddle\_delete`: Deletes one or many Riddles. 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 dele - `riddle\_move`: 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: leave projectId out \(or pass dryRun: true alongside one\) and NOTHING is c - `whoami`: Reports the current API key: the authenticated user \("userEmail"/"userName", the latter null if never set\), the project/team on a project-scoped key, whether this key has full access \("allowsFullAccess", see riddle://reference/concepts/access\), and the account's plan in "subscription" \(\{plan, period - `question\_bank\_create`: 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 - `question\_bank\_list`: Lists question banks. Scope "own" \(the default\) lists the banks of a project - the same ones the Creator shows; pass a projectId to look into another project, omit it for the project the API key is scoped to \(your personal ones on a user API key\). Paginated \{items, page, pageSize, total, hasMore\}. S - `question\_bank\_get`: Retrieves one question bank by id: title, riddleType, tags, notes, its categories/blockTypes and whether it has unpublished changes. The items themselves are question\_bank\_get\_items, not included here. Works on a built-in template id from question\_bank\_list\(scope: "templates"\) to see what it holds b - `question\_bank\_manage`: Everything that acts on a question bank as a whole, by "action" - the items themselves are question\_bank\_item, and the two calls that only destroy are question\_bank\_delete and question\_bank\_discard\_changes. A public template id is accepted for "duplicate" only and rejected by every other action. "re - `question\_bank\_item`: Adds or replaces ONE question/item of a question bank, by "action" - deleting one is question\_bank\_delete. There is no universal item shape: read riddle://reference/question-bank/block-type-columns before the first "add" into a bank you have not populated - it lists the valid blockType values per Ri - `question\_bank\_discard\_changes`: Throws away every unpublished change to a question bank's items at once, resetting each of them to its last published content. Irreversible - there is no undo and no copy of the discarded draft. A pending item delete comes back; an item ADDED since the last publish has no published state and is left - `question\_bank\_delete`: Deletes a question bank or ONE of its items - "target" says which, and nothing else deletes either. target "bank" removes the bank and every item it holds \(its tags cleaned up exactly as question\_bank\_tag\(action: "remove"\) does\), and is rejected with QUESTION\_BANK\_INTERDEPENDENCY while a Riddle of t - `question\_bank\_get\_items`: Lists the items of a question bank - its DRAFT content by default, or its published items with published: true. Filter by search term, blockType, category or difficultyRange - the same filters a QuestionBank block draws with. A template id from question\_bank\_list\(scope: "templates"\) reads too - that - `question\_bank\_tag`: Adds a tag to a question bank or removes one from it, by tagName or tagId from riddle\_tag\_list - exactly one of the two, as riddle\_tag does. Question bank tags and Riddle tags are ONE set per project, not two: the same tag applies to banks and Riddles and has the same id in both, which is why the id - `palette\_get`: 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 - `palette\_customize`: 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 defa - `integration\_list`: Lists the Google Sheets and webhook integrations of a project as \{items: \[\{id, type, name, connectedRiddles\}\]\}. "name" is the value a build takes as publish.integrations.googlesheets / .webhook to connect that integration to a Riddle. A Google Sheet can only be connected in the Creator - with none l - `riddle\_builder\_create`: Builds a new Riddle of any of the nine types from a build configuration: "type" says which kind \(see that argument for what each one is and what it needs at a minimum\), "build" carries the content. Everything a type accepts is described on the "build" fields themselves, marked with the types it belo - `riddle\_builder\_update`: 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": t - `riddle\_builder\_validate`: 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 - `reference\_get`: 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 docume - `stats\_fetch`: 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 "st - `project\_list`: 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 ev - `project\_get`: 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. - `project\_get\_settings`: 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"/" - `riddle\_preview`: Shows the user the current DRAFT of a Riddle as a playable preview - the Riddle as it looks right now, published or not. Call it after riddle\_builder\_create or riddle\_builder\_update whenever the user wants to see the result \(right after riddle\_publish the draft and the live version are identical, so Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html