RooQuiz
Server Details
Create and manage quizzes, leads, and respondents on RooQuiz, a lead-capture assessment platform.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 42 tools
Most tools are clearly scoped (form CRUD, question editing, translations, media upload, tenants), but the lead / record / examinee cluster is genuinely blurry: list_leads and list_records are described as the same underlying entity, and get_lead, get_record and get_examinee offer three overlapping views of one person. Descriptions acknowledge the overlap, which mitigates but does not remove misselection risk.
Nearly everything follows a snake_case verb_noun pattern (list_forms, create_form, update_question, delete_form_translation, assign_leads, switch_active_tenant), which is predictable. Minor deviation: append-style tools mix add_question, insert_question and add_lead_comment, and the two-step image flow uses prepare_/finalize_ rather than the CRUD verbs.
42 tools is heavy for one surface; while the server legitimately spans quiz building, translations, media, analytics, CRM leads and multi-team administration, the breadth forces an agent to wade through large clusters (5 translation tools, 5 question tools, 12 lead/record/booking tools). A flatter or more consolidated surface would be easier to drive.
Form lifecycle is fully covered — create/from-template/duplicate/get/update/soft-delete/restore, per-question CRUD plus reordering, translations, delivery settings, share info, stats and funnel — and leads have get/update/tags/assign/comments. Gaps are mostly around team administration (invite_member exists but no list_members, role update or remove) and media management (upload but no list/delete), plus bookings are read-only by design.
Available Tools
42 toolsadd_lead_commentAdd lead commentAInspect
Write an internal follow-up note on a lead of the current team (visible to team members only, never to the respondent). Max 2000 characters. Optionally attach the record id of the submission the note is about, as context. Read existing notes with get_lead(includeComments: true). Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
Inputs: body (required), leadId (required), recordId. Returns: body, leadId, commentId, createdAt
add_questionAdd questionAInspect
Append an item to the end of a form: a question, a page break (Breaker — only formId + type are needed, other fields are ignored) or a display block (Statement / Swiper). Item fields, their per-type / per-scene rules and the question types themselves are exactly those of create_form questions[] — read the full field descriptions there. Limit: a quiz holds at most 50 questions on every plan (page breaks, statements and carousels do not count). An ai_quiz holds at most 20. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
Inputs: type (required), formId (required), max, min, +27 more. Returns: field, formId, itemCount
assign_leadsAssign leadsADestructiveInspect
Assign one or more leads of the current team to a member, or clear the assignee. Pass every lead id in a single call (up to 50) — do not loop one call per lead. The assignee must be an active member (see list_lead_settings.assignableMembers); pass "me" for yourself, or omit / null to unassign. Each actual change is recorded on the lead's timeline. When assigning, the assignee gets one aggregated in-app notification and, if enabled in their notification preferences, one email for the whole batch; assigning the same owner again does not notify them again.
Inputs: leadIds (required), assigneeId. Returns: count, items, assigneeId
create_formCreate formAInspect
Create a form in the team this token is bound to. Pass the questions array and report configuration in one call instead of following up with per-question calls. In the outcome_quiz scene report.outcomes is REQUIRED at create time (TrueFalse votes via trueOutcomes/falseOutcomes). In the ai_quiz scene nothing is scored: set custom question codes and pass report.aiReport.instructions referencing them as {{code}} in this same call. For a scored_quiz with dimensions, define report.dimensionAnalysis.dimensions with codes and formulas over question codes in this same call; a question may override its score for one dimension via choices[i].dimensionScores (TrueFalse: trueDimensionScores/falseDimensionScores). The returned structuredContent.fields carries each question code — read those first if you need to reference them: a scored_quiz totals its question scores by default, and only needs report.formula (e.g. {{q_a}} * 2 + {{q_b}}) for a custom total; dimensions go in report.dimensionAnalysis via update_form / set_dimension_analysis. Creates the primary language only; add other languages with create_form_translation. Limit: a quiz holds at most 50 questions on every plan (page breaks, statements and carousels do not count). An ai_quiz holds at most 20. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
Inputs: scene (required), title (required), theme, report, +5 more. Returns: id, url, scene, theme, +8 more
create_form_from_templateCreate form from templateAInspect
Create a new form in the current team from a public template (find template ids with list_templates). Clones the template structure, scoring/report configuration, visual settings, and all language versions in one call. Links set by the template author are not copied: redirect-after-submit is dropped and result-page CTA buttons keep their text but come over switched off with no URL — tell the user to add their own link and turn them back on. Pass title to override the template title. After creation you can adjust it with update_form / update_question etc. This is the fastest way to build a quiz when a suitable template exists — prefer it over building from scratch with create_form. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
Inputs: templateId (required), title. Returns: id, url, scene, title, +4 more
create_form_translationCreate form translationAInspect
Add a language version (translation) to a form. Clones the source text as the initial draft and returns it so you can translate right away: edit the human-readable text in place, keep every code identical to the source, then save with update_form_translation. The language must differ from the form's primary language, and there is at most one translation per language (see list_form_translations).
Inputs: formId (required), language (required). Returns: cloned, formId, language, shareUrl, +2 more
delete_formDelete formADestructiveInspect
Move a form into the trash (soft delete) in the current team. The form is hidden from list_forms but kept recoverable for 5 days (then auto-purged); use restore_form to bring it back. Any member of the team can do this. Submission records are kept until permanent purge.
Inputs: formId (required). Returns: formId, message
delete_form_translationDelete form translationADestructiveInspect
Delete one language version (translation) of a form. Submission records are anchored to the source form and are NOT deleted; reports for historical records in this language fall back to the source text. The primary language cannot be deleted this way (it lives on the form itself).
Inputs: formId (required), language (required). Returns: formId, deleted, language
delete_questionDelete questionADestructiveInspect
Delete a single item from a form by code — a question, a page break (Breaker) or a display block (Statement / Swiper). Deleting the last one is allowed (a form can be an empty shell). In the ai_quiz scene, {{code}} references to the deleted question are also removed from report.aiReport.instructions.
Inputs: code (required), formId (required). Returns: formId, deletedCode, remainingCount
duplicate_formDuplicate formAInspect
Duplicate a form in the current team: clones its structure, scoring, report, visual settings and all language translations into a brand-new form owned by you (with fresh share links). Does NOT copy submission records, sharing, integrations, or ban state. Useful for cloning a proven quiz and tweaking it. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
Inputs: sourceFormId (required), newTitle. Returns: id, url, scene, title, +4 more
finalize_image_uploadFinalize image uploadAInspect
Step 2 of 2 for adding an image: call this AFTER you have PUT the file to the uploadUrl returned by prepare_image_upload. It verifies the uploaded object in storage, records it in the team media library and returns a media id + public URL. To use the image as a quiz cover or a landing-page cover, call update_form with flagImg or landingImage set to the returned media id.
Inputs: key (required), filename (required), mimeType (required), alt. Returns: key, url, mediaId, filename, +2 more
get_active_tenantGet active teamARead-onlyInspect
Return the team (tenant) this token is currently operating against. All write tools default to this team.
Inputs: no named parameters. Returns: id, name, role, slug
get_examineeGet respondentARead-onlyInspect
View the full detail of one examinee (a.k.a. respondent) in the current team by its examineeId (the business ID shown in list_examinees, e.g. AB1234567890), including customData. Sensitive auth fields are never returned.
Inputs: examineeId (required). Returns: name, email, avatar, tenant, +6 more
get_formGet formARead-onlyInspect
View one form of the current team in full, including the questions list fields[] and the report configuration. For outcome forms, the outcome codes that question votes reference live in report.outcomeAnalysis.outcomes. language is the primary language; existing non-primary language versions are listed in translationLanguages.
Inputs: id (required), includeFields, includeReport. Returns: id, scene, theme, title, +12 more
get_form_funnelGet form funnelARead-onlyInspect
Read the conversion funnel for a form in the current team over the last N days, from the form_sessions telemetry: overall stages (viewed → started → submitted → leadCaptured → reportViewed → ctaClicked → shared; leadCaptured is counted from submissions bound to a respondent account, not from telemetry), per-channel funnel (by utm_source, with embedded flag), UTM combos, and drop-off points (which question unsubmitted sessions stalled on). Use this to find where respondents drop and improve conversion.
Inputs: formId (required), days. Returns: days, formId, dropOff, overall, +2 more
get_form_statsGet form statsARead-onlyInspect
Read submission statistics for a form in the current team: KPI overview (total / today / last 7 / last 30, unique examinees, anonymous, report status counts, average score, latest submission), daily submission trend, channels (by utm_source), UTM combos, login types (anonymous vs registered), device breakdown, and per-question answer distributions. days only sets the length of the daily trend; every other block counts all submissions ever made. Answer distributions cover only the first 10 SingleCheck / DropDown / Rate / TrueFalse questions in form order (other types, MultiCheck included, are not counted); each bucket carries the choice label next to its stored value. Use this to gauge how a quiz is performing and to suggest improvements.
Inputs: formId (required), days. Returns: days, trend, formId, devices, +5 more
get_form_translationGet form translationARead-onlyInspect
Read the full content of one language version (translation) of a form, including the mirrored fields[] and report. Use this to fetch the current draft before translating: edit the human-readable text in place, keep every code identical to the source form, then save with update_form_translation. Returns an error if that language version does not exist yet (create it first with create_form_translation).
Inputs: formId (required), language (required). Returns: title, fields, formId, report, +9 more
get_leadGet leadARead-onlyInspect
View one lead of the current team by leadId: follow-up status, assignee, colour tags, the respondent block, and the next upcoming booking. Optionally include the respondent's submission history (which quizzes they took, with score / level), the team's internal follow-up comments, and the change timeline (status / assignee / tag changes plus submissions). Reference a lead by its leadId and a respondent by examineeId, never by a masked email.
Inputs: leadId (required), includeRecords, includeComments, includeActivities. Returns: tags, leadId, status, records, +10 more
get_recordGet recordARead-onlyInspect
View the full detail of one submission record (lead) in the current team by its record id (the id field returned by list_records), including the examinee, the submitted answers, UTM metadata and the business report result (overall / dimensions / outcome / AI report / AI evaluation), with internal diagnostics omitted and quoted contacts masked. Answers are returned as the respondent wrote them, except that any email address or phone number inside them comes back masked.
Inputs: recordId (required). Returns: id, data, formId, examinee, +7 more
insert_questionInsert questionAInspect
Insert an item at a specific position: a question, a page break (Breaker) or a display block (Statement with content / Swiper with items). Use after / before to reference an existing field code (from get_form's field.code). To insert at the very front: before references the first field's code. To insert at the end, use add_question. Item fields, their per-type / per-scene rules and the question types themselves are exactly those of create_form questions[] — read the full field descriptions there. Limit: a quiz holds at most 50 questions on every plan (page breaks, statements and carousels do not count). An ai_quiz holds at most 20. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
Inputs: type (required), formId (required), max, min, +29 more. Returns: field, formId, position, itemCount
invite_memberInvite memberADestructiveInspect
Invite someone to the active team (tenant) by email. The pending membership is created immediately and an invitation email with a join link is queued for delivery; the link and its token are never returned in the tool result. Only the team owner or an admin can invite; the call is rejected for other roles. role defaults to "member" and may be "admin". Members can create and edit every form, response, respondent and lead of the team; admins also manage members and team settings. You cannot invite someone as the owner. Fails if the email is already a member or already has a pending invite, or if the team has hit its member limit. Operates on the team this token currently targets — use list_my_tenants / switch_active_tenant to change teams first.
Inputs: email (required), role. Returns: role, email, membershipId, invitationQueued, +1 more
list_bookingsList bookingsARead-onlyInspect
List the bookings of the current team, earliest first: calls respondents booked through Cal.com from a quiz result page (synced back by the Cal.com connector; provider "calcom"), plus read-only history from the retired built-in scheduler (provider "native"). Each item carries the time range, status, the Cal.com event type, the attendee, the source quiz and submission, and the lead owner. Read-only: reschedule, cancel or confirm a booking in Cal.com and the change syncs back. Filter by status / quiz / respondent / time range. Reference a booking by its bookingId; the attendee name / email come back masked.
Inputs: to, from, page, sort, +5 more. Returns: page, items, totalDocs, totalPages
list_examineesList respondentsARead-onlyInspect
List the examinees — also called respondents, the people who answer the quizzes — of the current team, newest first. Sensitive auth fields (password, verification code, reset token, etc.) are never returned. The examineeId business ID is returned unmasked and is what get_examinee takes. Use get_examinee for one examinee's full detail including customData.
Inputs: limit, search. Returns: count, items, total
list_formsList formsARead-onlyInspect
List the forms of the current team. Returned in reverse chronological order of creation, without question content (use get_form for details).
Inputs: limit, scene, titleContains. Returns: items, totalDocs
list_form_translationsList form translationsARead-onlyInspect
List the existing language versions (translations) of a form. Returns each translation's language, isActive flag, public share link and timestamps. The primary language lives on the form itself (see get_form.language) and is not listed here.
Inputs: formId (required). Returns: count, formId, translations
list_leadsList leadsARead-onlyInspect
List the leads (CRM records) of the current team — one lead per respondent across all forms, carrying follow-up status, assignee, colour tags, submission count and the next upcoming booking. Newest activity first by default. Filter by status / assignee / tags / created-at range / keyword / whether they have an upcoming booking. Status codes and tag codes are team-defined — call list_lead_settings first to get the valid ones, never guess. Reference a lead by its leadId and a respondent by examineeId, never by a masked email.
Inputs: page, sort, limit, status, +6 more. Returns: page, items, totalDocs, totalPages, +1 more
list_lead_settingsList lead settingsARead-onlyInspect
Read the current team's lead configuration: the follow-up status codes (with label and colour, in display order), the colour tag library, and the members a lead can be assigned to. Call this before update_lead / set_lead_tags / assign_leads — status codes, tag codes and member ids are all team-specific and the write tools reject unknown values.
Inputs: no named parameters. Returns: tags, statuses, assignableMembers
list_my_tenantsList my teamsARead-onlyInspect
List all teams (tenants) the current user belongs to. isActive marks the team this token currently operates against.
Inputs: no named parameters. Returns: tenants, activeTenantId
list_recordsList recordsARead-onlyInspect
List submission records (leads) of the current team, newest first. Each item includes the examinee (name / email / customData if captured), the submitted answers, UTM metadata and a compact report result (status / score / level / outcome). Optionally filter by form, report status, and submitted-at range. Reference a respondent by examineeId, never by a masked email; email addresses and phone numbers written into the answers come back masked too. Use get_record for one record's full detail.
Inputs: page, limit, since, until, +2 more. Returns: page, items, limit, totalDocs
list_templatesList templatesARead-onlyInspect
List active templates in the public template library (id, title, scene, use cases, description, category, recommended flag, usage count), most-used first. Filter by useCase to find templates for a goal across scenes (e.g. "personality" also returns scored_quiz personality tests). Use this to find a template, then call create_form_from_template with its id to create a form from it — the fastest way to build a quiz when a suitable template exists.
Inputs: limit, scene, useCase, categoryId, +2 more. Returns: page, items, totalDocs, totalPages, +1 more
move_questionMove questionAInspect
Move an existing item (question, page break or display block) to a specific position by code. Choose either after or before, referencing another field's code. Move to the front: before references the current first field's code. Move to the end: after references the current last field's code.
Inputs: code (required), formId (required), after, before. Returns: to, code, from, formId, +3 more
prepare_image_uploadPrepare image uploadAInspect
Step 1 of 2 for adding an image (PNG / JPEG / GIF / WebP) to the current team media library. This tool does NOT receive image bytes — it returns a short-lived presigned URL you upload the file to directly, so even large images never pass through this conversation. Workflow: (1) save the image to a local temp file; (2) if the file is larger than 5MB, compress / downscale it to 5MB or less FIRST (e.g. sips -Z 2048 in.png --out out.jpg on macOS, or magick in.png -resize "2048x2048>" -quality 82 out.webp) — uploads over 5MB are rejected; (3) call this tool with filename, mimeType and (optionally) fileSize; (4) HTTP PUT the temp file to the returned uploadUrl with the matching Content-Type header, e.g. curl -X PUT --upload-file <file> "<uploadUrl>" -H "Content-Type: image/png"; (5) call finalize_image_upload with the returned key; (6) delete the temp file. Max 5MB after compression. Only image/png, image/jpeg, image/gif and image/webp are accepted.
Inputs: filename (required), mimeType (required), fileSize. Returns: key, expiresIn, uploadUrl, requiredContentType
restore_formRestore formAInspect
Restore a form from the trash in the current team (undo delete_form). Any member of the team can restore; errors if the form is not in the trash.
Inputs: formId (required). Returns: formId, message
set_dimension_analysisSet dimension analysisADestructiveInspect
Set the multi-dimension analysis (form.report.dimensionAnalysis) of a form, replacing the dimension list without touching overallAnalysis (title / radar settings you omit are kept). Dimension codes are stable: pass dimensions[].code to keep or set one, or omit it and a dimension with the same name keeps its existing code. Only scored_quiz forms have dimensions; every dimension needs a formula over question codes (e.g. {{q1}} + {{q2}}), where a question's choices[i].dimensionScores override its plain choice score for that dimension. A dimension still referenced by a question's dimensionScores or by report.formula (the overall formula) cannot be removed. Pass an empty dimensions array to clear the multi-dimension analysis. Call get_form first to read the question and dimension codes. Not supported for knowledge_quiz / outcome_quiz / ai_quiz forms.
Inputs: formId (required), title, dimensions, showRadarChart, +1 more. Returns: formId, dimensions, dimensionCount
set_lead_tagsSet lead tagsADestructiveInspect
Set the colour tags on one or more leads of the current team. Pass every lead id in a single call (up to 50) — do not loop. mode: "replace" (default, overwrite the whole tag set — for editing a single lead), "add" or "remove" (for batches, where each lead has different tags and overwriting would wipe other people's tags). Tag codes must exist in the team's tag library (see list_lead_settings.tags); "remove" also accepts stale codes. Changes are recorded on each lead's timeline.
Inputs: tags (required), leadIds (required), mode. Returns: mode, count, items
switch_active_tenantSwitch active teamAInspect
Switch the active team (tenant) for this token. The change persists across sessions until switched again. Caller must be a member of the target team.
Inputs: tenantId (required). Returns: id, name, slug
update_formUpdate formADestructiveInspect
Update a form of the current team: title / description / isActive / flagImg / landingImage / theme / report / openGraph / language / systemText. flagImg is the quiz cover, landingImage the landing-page cover (sets the image only, does not toggle the landing page); both take a media id from finalize_image_upload, a media URL, or "" to clear. report and openGraph (the social share card on the answer link) merge by sub-key — only what you pass is replaced, "" clears an openGraph sub-key; in the outcome_quiz scene outcomes are matched by code so existing images survive, and removing an outcome still referenced by question votes is rejected. systemText is replaced wholesale ({} clears it). language is changeable only while the form has no language versions; scene never. Questions go through add_question / update_question / delete_question / move_question, dimensionAnalysis alone through set_dimension_analysis.
Inputs: id (required), theme, title, report, +7 more. Returns: id, scene, theme, title, +9 more
update_form_settingsUpdate form settingsADestructiveInspect
Change how a form of the current team is delivered, as opposed to what it says (use update_form for title / questions / report / theme). Editable: submissionAccess (who may answer and whether seeing the report needs a login — this is the lead-capture gate), reportGateRequireCode (whether that login gate collects an emailed verification code, trading completion rate against lead quality), timeLimit, sharing (the result-page share button and personalised share card, which is what drives organic spread), answerSheet, crowdCompare (show respondents what share of people picked the same option — off by default, not for knowledge quizzes), instantFeedback (knowledge quizzes only, on by default for newly created ones except level tests: respondents submit each page and see right / wrong, the correct answer and the explanation before moving on), hideScores (hide every score respondents see — report, question points, instant feedback and answer review — while keeping levels and right / wrong), booking (the result-page block that opens the team's Cal.com scheduling link; bookings sync back read-only), feedback (a one-question feedback block on the result page), allowPdfDownload (respondents can download their full report as a PDF — Pro), resultRedirect (send respondents straight to a link chosen by their score level or outcome after they submit, instead of the result page — Pro), defaultCta (the result-page CTA master switch plus the default button for results without their own), hiddenFields (URL parameters such as partner or campaign_id captured with each response for attribution), searchIndexable (whether search engines may list the quiz), and slug (the custom path that gives the public link a memorable, SEO-friendly address). Only the keys you pass are changed. Read the current values with get_form_share_info.
Inputs: formId (required), slug, booking, sharing, +13 more. Returns: slug, formId, changed, delivery
update_form_translationUpdate form translationADestructiveInspect
Save translated copy for one language version of a form. Pass the translated title / description / fields / report / systemText / booking / feedback, mirroring the shape returned by get_form_translation; fields you omit keep their current value and partial translation is allowed. Translation fields[] must not introduce codes that do not exist on the source form. Pass isActive=false to pause just this language version, independently of the form's overall isActive.
Inputs: formId (required), language (required), title, fields, +6 more. Returns: formId, updated, language
update_leadUpdate leadAInspect
Move one lead of the current team to another follow-up status (e.g. new → contacted). The change is recorded on the lead's timeline. Status codes and tag codes are team-defined — call list_lead_settings first to get the valid ones, never guess.
Inputs: leadId (required), status (required). Returns: leadId, status
update_questionUpdate questionADestructiveInspect
Update a single question of an existing form, located by code. Changeable: name / description / explain / required / score / correctAnswer / aiMatch (FillBlank AI grading) / precision (DateField/TimeField picker precision) / min / max / unit / decimalPlaces (NumberField) / words (Rate scale labels) / maxFiles (Attachment) / choices (replaces ALL choices of a choice-based question). NOT changeable — delete_question then add_question instead: question type, Rate steps, DropDown multiple, Ordering shuffle, Attachment kind. DateField / TimeField / Rate reject score / correctAnswer / aiMatch (configure date/time scoring in the web app). The scored_quiz, outcome_quiz and ai_quiz scenes reject the top-level score / correctAnswer / aiMatch as well: pass choices carrying choices[i].score or choices[i].outcomes instead (TrueFalse outcome votes still need delete + recreate). Display blocks are edited here too, with their own keys: Statement takes content, Swiper takes items (replacing all slides), and both take name / description — every question key is rejected on them.
Inputs: code (required), formId (required), max, min, +18 more. Returns: code, field, formId, changed
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Connectors
Build, publish and track mobile quiz funnels for Meta ads. Read leads and cost per lead.
Quiz funnels: stats, drop-offs, leads by result, CRM tags, follow-up emails and quiz drafts.
Create, test and publish live group quizzes that players join on their phones by QR code.
Create forms, surveys, quizzes & polls — publish shareable links and analyze responses.
Related MCP Servers
- AlicenseAqualityBmaintenanceCreate and manage quizzes, question banks, and translations; capture and manage leads, respondents, and bookings; and pull stats and funnel analytics on RooQuiz — a lightweight assessment platform for lead capture and viral sharing.521MIT
- FlicenseNot gradedqualityCmaintenanceEnables users to run and interact with a quiz application through Claude Desktop or claude.ai, supporting user registration, question retrieval, answer validation, leaderboard generation, and answer review.1-
- FlicenseNot gradedqualityCmaintenanceEnables creating and administering multiple quizzes, adding questions, registering participants, validating answers, reviewing responses, and managing leaderboards through MCP, accessible locally via stdio or remotely over HTTP.-
- AlicenseAqualityBmaintenanceEnables AI clients to create, manage, and configure Roo smart shortlinks and their add-ons, such as QR codes, scheduled redirects, and webhooks, through MCP tools.1413 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.