Skip to main content
Glama
RooQuiz

RooQuiz

RooQuiz MCP Server

Install in VS Code Install in Cursor

RooQuiz용 원격 MCP 서버 — 리드 확보 및 바이럴 공유를 위한 가벼운 평가 플랫폼입니다. AI 기반 작성 도구로 퀴즈를 만들고, 결과 페이지에서 리드를 수집하며, 퍼널 전환을 분석할 수 있습니다 — Claude, ChatGPT, Cursor 또는 모든 MCP 클라이언트에서 바로 사용할 수 있습니다.

  • 엔드포인트: https://payload.rooquiz.com/api/mcp (Streamable HTTP)

  • 인증: OAuth 2.1 — 동적 클라이언트 등록을 사용하는 authorization code + PKCE. 클라이언트가 요청하면 RooQuiz 계정으로 로그인하세요. API 키는 필요 없습니다.

  • 레지스트리 이름: com.rooquiz/rooquiz-mcp

연결

원클릭: VS Code · VS Code Insiders · Cursor

Claude Code

claude mcp add --transport http rooquiz https://payload.rooquiz.com/api/mcp

claude.ai / ChatGPT — 사용자 지정 커넥터를 추가하고 엔드포인트 URL을 붙여넣으세요.

Cursor (.cursor/mcp.json)

{
  "mcpServers": {
    "rooquiz": {
      "url": "https://payload.rooquiz.com/api/mcp"
    }
  }
}

VS Code / GitHub Copilot (.vscode/mcp.json)

{
  "servers": {
    "rooquiz": {
      "type": "http",
      "url": "https://payload.rooquiz.com/api/mcp"
    }
  }
}

Related MCP server: Quiz Generator AI MCP

할 수 있는 작업

  • 퀴즈 — 지식 퀴즈, 채점 퀴즈, "당신은 어떤 X인가요?" 유형의 결과 퀴즈를 만들고 질문, 채점 수식, 차원 분석을 편집할 수 있습니다. 템플릿에서 시작할 수도 있습니다.

  • 번역 — 하나의 소스 형식을 모든 언어로 미러링된 번역으로 제공합니다.

  • 리드 — 퀴즈 결과 페이지에서 수집한 리드를 목록으로 확인, 태그 지정, 담당자 배정, 댓글 달기를 할 수 있습니다.

  • 응답자 및 기록 — 응답자, 제출 기록, 통계, 퍼널 분석을 조회할 수 있습니다.

  • 예약 — 퀴즈 결과 페이지를 통해 생성된 예약을 확인하고 일정을 변경할 수 있습니다.

  • 팀 — 활성 팀을 전환하고 팀원을 초대하며 질문 은행과 카테고리를 관리할 수 있습니다.

모든 도구는 세션이 바인딩된 팀 내에서 실행됩니다.

stdio 브리지

기본 HTTP 전송을 지원하지 않는 호스트(Claude Desktop, 구형 MCP 클라이언트) 및 컨테이터를 빌드하는 레지스트리 크로러는 [헤] `bin# RooQuiz MCP Server

Install in VS Code Install in Cursor

RooQuiz을 위한 원격 MCP 서버 — 리드 확보와 바이러럴 공유에 사용하는 가벼운 평가 플랫폼입니다. AI 보조 저작으로 퀴즈를 만들고, 결과 페이지에서 리드를 수집하며, 퍼널 전환율을 분석할 수 있습니다. Claude, ChatGPT, Cursor 또는 모든 MCP 클라이언트에서 직접 연동할 수 있습니다.

  • 엔드포인트: https://payload.rooquiz.com/api/mcp (Streamable HTTP)

  • 인증: OAuth 2.1 — 동적 클라이언트 등록과 함께 authorization code + PKCE 방식입니다. 클라이언트가 요청하면 RooQuiz 계정으로 로그인하세요. API 키는 필요 없습니다.

  • 레지스트리 이름: com.rooquiz/rooquiz-mcp

연결

원클릭: VS Code · VS Code Insiders · Cursor

Claude Code

claude mcp add --transport http rooquiz https://payload.rooquiz.com/api/mcp

claude.ai / ChatGPT — 사용자 지정 커넥터를 추가하고 엔드포인트 지향 URL을 붙여넣으세요.

Cursor (.cursor/mcp.json)

{
  "mcpServers": {
    "rooquiz": {
      "url": "https://payload.rooquiz.com/api/mcp"
    }
  }
}

VS Code / GitHub Copilot (.vscode/mcp.json)

{
  "servers": {
    "rooquiz": {
      "type": "http",
      "url": "https://payload.rooquiz.com/api/mcp"
    }
  }
}

사용 가능한 기능

  • 퀴즈 — 지식 퀴즈, 채점형 퀴즈, "당신은 어떤 X인가요?" 결과형 퀴즈를 만들 수 있으며 질문, 채점 수식, 차원 분석을 편집할 수 있습니다. 템플릿으로 시작할 수도 있습니다.

  • 번역 — 하나의 소스 폼을 모든 언어로 미러링드 투명할 수 있습니다.

  • 리드 — 퀴즈 결과 페이지에서 확보한 리드를 목록으로 확인, 태그, 담당자 배정, 댓글을 달 수 있습니다.

  • 응답자 및 기록 — 응답자, 제출, 통계, 퍼널 분석을 조회할 수 있습니다.

  • 예약 — 퀴즈 결과 페이지를 통해 이루어진 예약을 검토하고 재예약할 수 있습니다.

  • 팀 — 활성 팀 전환, 멤버 초대, 질문 은행과 카테고리를 관리할 수 있습니다.

모든 도구는 세션이 연결된 팀 내에서 작동합니다.

stdio 브리지

HTTP 전송을 기본 제공하지 않는 호스트(Claude Desktop, 구형 MCP 클라이언트)나 컨테이너 수집을 수행하는 레지스트리 크롤러는 bin/rooquiz-mcp.mjs의 브리지를 통해 연결할 수 있습니다. 외부 종속성이 없으며 Node 18 이상이 필요합니다. 클라이언트가 HTTP를 지원한다면 위의 렌더 방식이 더 나은 경로입니다.

node bin/rooquiz-mcp.mjs           # or: docker build -t rooquiz-mcp . && docker run -i --rm rooquiz-mcp

과학자 환경

node bin/rooquiz-mcp.mjs           # or: docker build -t rooquiz-mcp . && docker run -i --rm rooquiz-mcp

환경 변수

기본값

용도

ROOQUIZ_MCP_URL

https://payload.rooquiz.com/api/mcp

엔드포인트 재정의

ROOQUIZ_TOKEN

(정의되지 않음)

Bearer 토큰 — 필수

모든 메서드에는 토큰이 필요합니다. initialize도 포함됩니다. 토큰이 없으면 서버는 리소스 메타데이터를 가리키는 WWW-Authenticate 헤더와 함께 401을 반환합니다. 기본 HTTP 전송을 지원하는 클라이언트는 OAuth를 통해 자동으로 이 토큰을 얻지만, 브리지는 브라우저 흐름을 실행할 곳이 없으므로 개인 액세스 토큰을 직접 지정해야 합니다.

지원

질문이나 이슈가 있으면 support@rooquiz.com으로 문의하세요.


이 저장소는 공식 MCP 레지스트리에 배얼된 server.json 매니페스트와 MIT 라이선스의 stdio 브리지를 포함합니다. 호스팅되는 서버 구현 자체는 비공개 소스입니다.

Available Tools

52 tools
add_lead_commentA

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_questionA

Append an item to the end of a form. type is a question type or Breaker (page break — only formId + type are needed, other fields are ignored). Question types: SingleCheck / MultiCheck / TrueFalse; FillBlank (free text — scored in quiz via correctAnswer, an unscored data-collection field in scored_quiz); DropDown (single or multiple via multiple — prefer it over SingleCheck/MultiCheck past 20 choices); Cascade (hierarchical via choices[i].children, scored_quiz only); Ordering (quiz only, order-sensitive grading); DateField / TimeField (unscored data-collection fields, scored_quiz only, no correctAnswer/score); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the submitted 1..steps rating is the question score unless per-star scores are set in the web app). Configure random_knowledge_quiz question banks in the web app. 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, +20 more. Returns: field, formId, itemCount

assign_leadsA

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 non-viewer member (see list_lead_settings.assignableMembers); pass "me" for yourself, or omit / null to unassign. Each change is recorded on the lead's timeline, and the assignee gets one aggregated notification for the whole batch.

Inputs: leadIds (required), assigneeId. Returns: count, items, assigneeId

create_formA

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). The returned structuredContent.fields carries each question code — read those first, then fill in a scored_quiz report.formula (e.g. q_a + q_b) or a report.dimensionAnalysis via update_form / set_dimension_analysis. Creates the primary language only; add other languages with create_form_translation. 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_templateA

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; 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_translationA

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, +1 more

delete_formA
Destructive

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. Only the form owner / team owner can delete. Submission records are kept until permanent purge.

Inputs: formId (required). Returns: formId, message

delete_form_translationA
Destructive

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_questionA
Destructive

Delete a single question or a page break (Breaker) from a form by code. Deleting the last one is allowed (a form can be an empty shell).

Inputs: code (required), formId (required). Returns: formId, deletedCode, remainingCount

duplicate_formA

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_uploadA

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_tenantA
Read-only

Return the team (tenant) this token is currently operating against. All write tools default to this team. Also reports examineeSignupDisabled: when true this team has switched respondent self-signup off, so only respondents already on its roster can sign in — every quiz that asks for a login (submissionAccess examinee_only, or login_to_view_report at the report gate) turns away anyone new. Check it before blaming a quiz for "nobody can submit".

Inputs: no named parameters. Returns: id, name, role, slug, +1 more

get_booking_availabilityA
Read-only

Read the current team's bookable time slots in a date range, computed from the team's weekly booking rules minus what is already taken. Returns enabled:false when the team has booking switched off or the plan does not include it. Pass bookingId to get the slots for rescheduling that booking (its own slot is not counted as taken) — always call this before reschedule_booking, since a start time outside the available slots is rejected. The range is clamped server-side if you ask for too many days.

Inputs: toDate (required), fromDate (required), bookingId. Returns: slots, enabled, timezone, slotSeats, +2 more

get_examineeA
Read-only

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, status, +7 more

get_formA
Read-only

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_funnelA
Read-only

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), 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_share_infoA
Read-only

Everything needed to put a form of the current team in front of an audience: the public answer link (also per language version), the team's custom domain and whether it is actually serving, ready-to-paste embed snippets in three modes (inline / popup / iframe), and the current delivery settings so you can tell whether the form will even accept responses. Pass utmSource to get every link and snippet tagged for one channel. Use this to answer "give me the link / the embed code" and to sanity-check a launch; change the switches with update_form_settings.

Inputs: formId (required), utmSource, iframeHeight, popupButtonText. Returns: slug, embed, title, formId, +6 more

get_form_statsA
Read-only

Read submission statistics for a form in the current team over the last N days: 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. 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_translationA
Read-only

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, +6 more

get_leadA
Read-only

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_recordA
Read-only

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 complete frozen report result (overall / dimensions / outcome / AI evaluation). 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_questionA

Insert an item (question or page break) at a specific position. type can be a question type or Breaker. 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. 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, +22 more. Returns: field, formId, position, itemCount

invite_memberA

Invite someone to the active team (tenant) by email. Sends an invitation email with a join link and returns that link. Only the team owner or an admin can invite; the call is rejected for other roles. role defaults to "member" and may be "viewer" (read-only) or "admin" (only the owner may grant admin). 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, inviteUrl, inviteToken, +2 more

list_bookingsA
Read-only

List the 1:1 bookings (discovery calls / consultations booked from a quiz report page) of the current team, earliest first. Each item carries the time range, status, meeting type, the attendee, the source quiz and submission, and the lead owner who should handle it. Filter by status / quiz / respondent / time range. Typical use: status "pending" lists the approval queue waiting on someone. 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_examineesA
Read-only

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 / update_examinee take. Use get_examinee for one examinee's full detail including customData.

Inputs: limit, search, status. Returns: count, items, total

list_formsA
Read-only

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_translationsA
Read-only

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_leadsA
Read-only

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_settingsA
Read-only

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_tenantsA
Read-only

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_recordsA
Read-only

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_templatesA
Read-only

List active templates in the public template library (id, title, scene, description, category, recommended flag, usage count), most-used first. 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, categoryId, isRecommended, +1 more. Returns: items, totalDocs

move_questionA

Move an existing question or page break 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_uploadA
Read-only

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

preview_guideA
Read-onlyIdempotent

Authoring guide for one RooQuiz preview assessment type: the full field schema, question types, scoring rules, themes, common mistakes and a worked example. Read the guide for the type you want before calling preview_quiz, preview_scorecard, preview_outcome.

Inputs: type (required).

preview_outcomeA

Create a shareable RooQuiz preview personality / outcome test — options vote for result types and the most-voted type is the result — and get a link to open in the browser. No account, login, or API key required. Use this when someone wants to build, try out, or share a personality quiz, a "which X are you" / type / archetype test, or any quiz where there are no right answers and the taker is sorted into one of several result types. For a right/wrong graded quiz, use the preview-quiz skill; for a scored questionnaire that totals points into a level, use the preview-scorecard skill.

This tool takes the finished assessment JSON and nothing else. Unless its field schema, scoring rules and worked example are already in context, call preview_guide with type "outcome" first.

Inputs: form (required). Returns: url, expiresAt, publicToken

preview_quizA

Create a shareable RooQuiz preview quiz — a right/wrong assessment where correct answers earn points and the taker gets a score — and get a link to open in the browser. No account, login, or API key required. Use this when someone wants to build, try out, or share a graded quiz, test, trivia, or exam with correct answers and a final score. For a scored questionnaire where every option adds points, use the preview-scorecard skill; for a personality/type test with no right answers, use the preview-outcome skill.

This tool takes the finished assessment JSON and nothing else. Unless its field schema, scoring rules and worked example are already in context, call preview_guide with type "quiz" first.

Inputs: form (required). Returns: url, expiresAt, publicToken

preview_scorecardA

Create a shareable RooQuiz preview scorecard — a scored questionnaire where each option adds points toward a total that buckets into levels — and get a link to open in the browser. No account, login, or API key required. Use this when someone wants to build, try out, or share a self-assessment, health/habit score, readiness or maturity check, satisfaction survey, or any rated questionnaire that turns answers into a total score and a level (no "correct" answer). For a right/wrong graded quiz, use the preview-quiz skill; for a personality/type test with no scores, use the preview-outcome skill.

This tool takes the finished assessment JSON and nothing else. Unless its field schema, scoring rules and worked example are already in context, call preview_guide with type "scorecard" first.

Inputs: form (required). Returns: url, expiresAt, publicToken

reschedule_bookingA

Move a confirmed booking of the current team to a different time, as the organiser. The new start time must be one of the available slots — call get_booking_availability with this bookingId first and pick a startAt from its slots. The attendee is emailed about the new time, the 24h reminder is re-armed, and the booking.rescheduled integration event fires. Only works on a scheduled booking; it is rejected if the slot got taken in the meantime or if that respondent already has another active booking.

Inputs: startAt (required), bookingId (required). Returns: endAt, status, startAt, timezone, +2 more

restore_formA

Restore a form from the trash in the current team (undo delete_form). Only the form owner / team owner can restore; errors if the form is not in the trash.

Inputs: formId (required). Returns: formId, message

review_bookingA

Approve or decline a pending booking request of the current team. Approving turns it into a confirmed meeting and sends the attendee the confirmation with the meeting address; declining sends a short "not approved" note with the optional reason. Only works on a booking whose status is pending, and a request whose meeting time has already passed can only be declined. On approval you may set the meeting link / instructions for this one meeting (leave empty to fall back to the team-level settings). Only the team owner / admin or the lead owner can review.

Inputs: decision (required), bookingId (required), meetingLink, declineReason, +1 more. Returns: status, bookingId, reviewedAt

set_dimension_analysisA

Set the multi-dimension analysis (form.report.dimensionAnalysis) of a form, replacing it as a whole without touching overallAnalysis. In the knowledge_quiz scene each dimension needs fieldCodes (question codes); in the scored_quiz scene each needs a formula. Pass an empty dimensions array to clear the multi-dimension analysis. Call get_form first to read the question codes. Not supported for random_knowledge_quiz forms.

Inputs: formId (required), title, dimensions, showRadarChart, +1 more. Returns: formId, dimensions, dimensionCount

set_lead_tagsA

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_tenantA

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_booking_statusA

Close out a confirmed booking of the current team: mark it completed, mark the attendee as a no-show, or cancel it. Only works on a booking whose status is scheduled; completed / no_show additionally require the meeting to have already started. Cancelling notifies the attendee by email and fires the booking.cancelled integration event; completed / no_show are internal bookkeeping and do not contact the attendee. To handle a pending request use review_booking instead.

Inputs: status (required), bookingId (required). Returns: status, bookingId, cancelledAt

update_examineeA
Destructive

Update an examinee (a.k.a. respondent) in the current team, located by its examineeId (the business ID from list_examinees). Editable: name / status (active|disabled) / customData (validated against the team's examinee field definitions: required / unique / type / regex). email, tenant and examineeId cannot be changed. customData REPLACES the whole object and masked values are rejected: never re-send customData you just read, or you will wipe or corrupt phone fields — only write values the user gave you.

Inputs: examineeId (required), name, status, customData. Returns: name, email, avatar, status, +7 more

update_formA

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_settingsA

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, booking (the result-page booking block that feeds the 1:1 call queue), gaTrackingId, sharedWithAll (whether every team member can see this form), 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, +6 more. Returns: slug, formId, changed, delivery

update_form_translationA

Save translated copy for one language version of a form. Pass the translated title / description / fields / report / systemText / booking, 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, +5 more. Returns: formId, updated, language

update_leadA

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_questionA

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) / 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. DateField / TimeField / Rate reject score / correctAnswer / aiMatch (configure date/time scoring in the web app). The scored_quiz and outcome_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).

Inputs: code (required), formId (required), max, min, +14 more. Returns: code, field, formId, changed

update_tenant_slugA

Change the team address of the current team — the first path segment of every quiz link on the platform domain (quizster.app//). Owner / admin only. Lowercase letters, digits, hyphens and underscores, 4-32 chars, must start and end with a letter or digit, unique across the whole platform, and cannot be cleared. Changing it moves EVERY public quiz link of the team at once and the old address stops resolving (cached entries may linger briefly), so treat this as a rare, deliberate rename — not routine tuning; token addresses (/a/) keep working. Read the current value with get_active_tenant.

Inputs: slug (required). Returns: slug, tenantId

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

    TDQS

    A4/5.0

    Scored across 52 tools

    Disambiguation4/5

    The toolset is organized by resource (forms, questions, translations, examinees, records, leads, bookings, tenants) and the descriptions are unusually precise, so most choices are clear. A few near-neighbor pairs remain (create_form / create_form_from_template / duplicate_form, update_form / update_form_settings, list_records / list_leads / list_examinees), but the documentation draws those boundaries well.

    Naming Consistency4/5

    Almost every tool follows a lowercase snake_case verb_noun pattern, with clear CRUD families for forms, questions, translations, records, leads, and bookings. Minor inconsistencies such as add_question vs insert_question, set_dimension_analysis next to update_form, and update_tenant_slug beside switch_active_tenant keep it from a perfect score.

    Tool Count1/5

    At 52 tools, this crosses the 50+ threshold for an extreme tool surface and is far beyond the 3-15 sweet spot; the sheer volume will consume context and make reliable tool selection harder. The scope is genuinely broad, but a single MCP server this large is a mismatch and should be split into quiz-builder, analytics/CRM, and booking/team servers.

    Completeness4/5

    The core quiz lifecycle is thoroughly covered: form CRUD plus restore/duplicate, question editing, translations, media upload, delivery settings, analytics, submission records, leads, and bookings. Minor gaps exist - no media list/delete, no member removal, no examinee delete - but agents can work around them.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers