Skip to content

quiz — full tool reference

Forms, quizzes, questions, interview dispatch and responses.

Endpointhttps://quiz.mcp.devfellowship.com/mcp
Packagepackages/dfl-mcp-quiz
Tools19
ToolDescription
create_formCreate a shareable batch-answer form on the quiz app. Each item becomes one free-text question; an optional external_ref is stashed per item so responses map back to the source (e.g. a YouTube comment id). Returns { form_id, slug, shared_url }. Admin/super_admin only.
get_formGet a form by id or slug: metadata + its items (questions and decoded external_ref). Admin/super_admin only.
list_formsList forms (newest first). Soft-archived forms are hidden by default — pass include_archived=true to include them. Optional slug_prefix filter (e.g. “yt”). Admin/super_admin only.
get_form_responsesRead submitted batch answers for a form (by id or slug), mapped back to each item via external_ref. Defaults to the most recent submission; pass all_responses=true for every submission. Admin/super_admin only.
archive_formSoft-archive a form (sets is_active=false) by id or slug. Does NOT delete — preserves questions and responses; restore with unarchive_form. Archived forms are hidden from list_forms by default and stop rendering at /shared/<slug>. Admin/super_admin only.
unarchive_formRestore a soft-archived form (sets is_active=true) by id or slug. Inverse of archive_form. Admin/super_admin only.
create_quizCreate a quiz/interview definition in quiz.quizzes (slug, title, description, welcome_message, and the per-interview agent_context / guardrails / business_unit_id). Add questions afterwards with add_question, or use create_interview_quiz to do both in one call.
update_quizUpdate an existing quiz (by id OR slug): title, description, welcome_message, welcome_cta, completion_redirect_url, is_active, and the per-interview agent_context / guardrails / business_unit_id. Only the fields you pass are changed.
list_quizzesList quiz/interview definitions from quiz.quizzes.
get_quizGet a quiz by id or slug, including its ordered questions and each question’s options.
add_questionAdd a question (and its options for choice types) to a quiz. Resolve the quiz by quiz_id OR quiz_slug. type: open | rating | multiple_choice | single | multi. Options apply to choice types; rating auto-generates a 0–N scale; “open” is a free-text turn.
update_questionEdit an existing question in place by question_id — change text, position, type, is_required, and/or its options — WITHOUT deactivating the quiz or re-authoring a new slug. type: open | rating | multiple_choice | single | multi. Pass the FULL ordered option list to set options (diffed against current: upsert by position, delete removed); omit options to leave them untouched; pass [] to clear them.
delete_questionHard-delete a question (and its options) by question_id. Refuses if the question has collected answers unless force=true (to preserve session history). Use this to cleanly remove a question instead of cohort-gating it with an inert marker.
create_interview_quizCreate a quiz (with per-interview agent_context / guardrails / business_unit_id) and all its questions in one call. Each question: { text, type (open|rating|multiple_choice|single|multi), options?[], rating_max?, is_required?, cohort_tag? }. Returns the created quiz with its questions.
dispatch_interviewSend a quiz/interview to a list of recipients via the interview engine over WhatsApp (phone) or Discord. For Discord, supply discord_id directly, or a guest_id / member_id to resolve it server-side (precedence: guest override > member→profile > skip). Returns sent/failed counts, per-recipient dispatch ids, and any skipped recipients with no Discord identity.
list_dispatchesList interview dispatch rows (who received which quiz, channel, status, timestamps). Filter by quiz_slug, status, or recipient_phone.
get_interview_statusTrack one interview: the dispatch row (status, timestamps), its session, and answers collected so far. Provide dispatch_id OR (recipient_phone + quiz_slug).
list_answersList the answers (per-question transcript) for a session. Provide response_id OR dispatch_id.
list_responsesList response (session) rows for a quiz — one per interview session, with completion status. Filter by quiz_slug and/or completed. Pair with list_answers for the per-question transcript.

Create Form

Create a shareable batch-answer form on the quiz app. Each item becomes one free-text question; an optional external_ref is stashed per item so responses map back to the source (e.g. a YouTube comment id). Returns { form_id, slug, shared_url }. Admin/super_admin only.

ParameterTypeRequiredDescription
titlestringyesForm title shown to responders.
descriptionstringnoIntro/description shown above the items.
welcome_ctastringnoCall-to-action label on the welcome screen (default “Responder”).
slugstringnoOptional custom URL slug. Auto-generated if omitted.
slug_prefixstringnoPrefix for the auto-generated slug (default “form”; the skill uses “yt”).
itemsobject[]yesThe items to answer (e.g. one per YouTube comment).

Get Form

Get a form by id or slug: metadata + its items (questions and decoded external_ref). Admin/super_admin only.

ParameterTypeRequiredDescription
form_idstringyesForm UUID or slug.

List Forms

List forms (newest first). Soft-archived forms are hidden by default — pass include_archived=true to include them. Optional slug_prefix filter (e.g. “yt”). Admin/super_admin only.

ParameterTypeRequiredDescription
slug_prefixstringnoOnly return forms whose slug starts with this prefix.
include_archivedbooleannoInclude soft-archived (is_active=false) forms. Default false.
limitnumbernoMax rows (default 50).

Get Form Responses

Read submitted batch answers for a form (by id or slug), mapped back to each item via external_ref. Defaults to the most recent submission; pass all_responses=true for every submission. Admin/super_admin only.

ParameterTypeRequiredDescription
form_idstringyesForm UUID or slug.
all_responsesbooleannoInclude answers from every submission (default false = latest only).

Archive Form

Soft-archive a form (sets is_active=false) by id or slug. Does NOT delete — preserves questions and responses; restore with unarchive_form. Archived forms are hidden from list_forms by default and stop rendering at /shared/<slug>. Admin/super_admin only.

ParameterTypeRequiredDescription
form_idstringyesForm UUID or slug.

Unarchive Form

Restore a soft-archived form (sets is_active=true) by id or slug. Inverse of archive_form. Admin/super_admin only.

ParameterTypeRequiredDescription
form_idstringyesForm UUID or slug.

Create Quiz

Create a quiz/interview definition in quiz.quizzes (slug, title, description, welcome_message, and the per-interview agent_context / guardrails / business_unit_id). Add questions afterwards with add_question, or use create_interview_quiz to do both in one call.

ParameterTypeRequiredDescription
slugstringyesUnique URL slug, e.g. “whatsapp-demo”
titlestringyesQuiz title
descriptionstringnoQuiz description
welcome_messagestringnoIntro message shown before the first question
welcome_ctastringnoCall-to-action label for the welcome screen (default “Começar”)
completion_redirect_urlstringnoWhere to redirect after completion
is_activebooleannoWhether the quiz is active (default true)
agent_contextstringnoInjected per-interview context for the AI interviewer: company, the interview’s purpose, the event, and tone. Combined at runtime with the engine hard-coded base guardrails. Plain text.
guardrailsstringnoOptional per-interview extra rules layered on top of the engine base anti-injection guardrails (e.g. “stay strictly on the event-feedback topic; refuse off-topic questions politely”). Plain text.
business_unit_idstringnoOptional strategy.business_units id to inherit/share context across a BU. Per-interview agent_context/guardrails override the BU default.

Update Quiz

Update an existing quiz (by id OR slug): title, description, welcome_message, welcome_cta, completion_redirect_url, is_active, and the per-interview agent_context / guardrails / business_unit_id. Only the fields you pass are changed.

ParameterTypeRequiredDescription
idstringnoQuiz UUID (provide id OR slug)
slugstringnoQuiz slug (provide id OR slug)
titlestringnoNew title
descriptionstringnoNew description (null to clear)
welcome_messagestringnoNew intro message (null to clear)
welcome_ctastringnoNew CTA label (null to clear)
completion_redirect_urlstringnoNew completion redirect URL (null to clear)
is_activebooleannoActive flag
agent_contextstringnoInjected per-interview context for the AI interviewer: company, the interview’s purpose, the event, and tone. Combined at runtime with the engine hard-coded base guardrails. Plain text.
guardrailsstringnoOptional per-interview extra rules layered on top of the engine base anti-injection guardrails (e.g. “stay strictly on the event-feedback topic; refuse off-topic questions politely”). Plain text.
business_unit_idstringnoOptional strategy.business_units id to inherit/share context across a BU. Per-interview agent_context/guardrails override the BU default.

List Quizzes

List quiz/interview definitions from quiz.quizzes.

ParameterTypeRequiredDescription
limitnumbernoMax quizzes to return (default 50, max 100)
offsetnumbernoNumber of quizzes to skip (pagination)
is_activebooleannoFilter by active flag
searchstringnoSearch by title (ilike)

Get Quiz

Get a quiz by id or slug, including its ordered questions and each question’s options.

ParameterTypeRequiredDescription
idstringnoQuiz UUID (provide id OR slug)
slugstringnoQuiz slug (provide id OR slug)

Add Question

Add a question (and its options for choice types) to a quiz. Resolve the quiz by quiz_id OR quiz_slug. type: open | rating | multiple_choice | single | multi. Options apply to choice types; rating auto-generates a 0–N scale; “open” is a free-text turn.

ParameterTypeRequiredDescription
quiz_idstringnoQuiz UUID (provide quiz_id OR quiz_slug)
quiz_slugstringnoQuiz slug (provide quiz_id OR quiz_slug)
textstringyesQuestion text, e.g. “Qual o seu nome?”
typeenumnoopen | rating | multiple_choice | single | multi (open = free-text reply) One of: single, multi, multiple, multiple_choice, horizontal, open, rating. Default: "open".
positionnumbernoDisplay order (1-based). If omitted, appended.
is_requiredbooleannoWhether an answer is required (default true)
optionsstring[]noOption labels for choice types (ignored for open; overrides rating scale)
rating_maxnumbernoFor type=rating: scale ceiling (default 5 → labels “0”..“5”)
cohort_tagstringnoCohort-only branch tag (e.g. “lideres”). Encodes a [cohort:<tag>] marker + is_required=false.

Update Question (in place)

Edit an existing question in place by question_id — change text, position, type, is_required, and/or its options — WITHOUT deactivating the quiz or re-authoring a new slug. type: open | rating | multiple_choice | single | multi. Pass the FULL ordered option list to set options (diffed against current: upsert by position, delete removed); omit options to leave them untouched; pass [] to clear them.

ParameterTypeRequiredDescription
question_idstringyesUUID of the quiz.questions row to edit
textstringnoNew question text
positionnumbernoNew 1-based display order
typeenumnoNew type: open | rating | multiple_choice | single | multi One of: single, multi, multiple, multiple_choice, horizontal, open, rating.
is_requiredbooleannoWhether an answer is required
optionsstring[]noFULL ordered desired option labels (index 0 → position 1 → letter A). Diffed vs current. Omit to leave options untouched; [] clears all options.
rating_maxnumbernoFor type=rating with no explicit options: scale ceiling (default 5 → labels “0”..“5”)

Delete Question

Hard-delete a question (and its options) by question_id. Refuses if the question has collected answers unless force=true (to preserve session history). Use this to cleanly remove a question instead of cohort-gating it with an inert marker.

ParameterTypeRequiredDescription
question_idstringyesUUID of the quiz.questions row to delete
forcebooleannoDelete even if the question has collected answers (those answers will be orphaned). Default false → refuse when answers exist.

Create Interview Quiz (quiz + questions)

Create a quiz (with per-interview agent_context / guardrails / business_unit_id) and all its questions in one call. Each question: { text, type (open|rating|multiple_choice|single|multi), options?[], rating_max?, is_required?, cohort_tag? }. Returns the created quiz with its questions.

ParameterTypeRequiredDescription
slugstringyesUnique URL slug, e.g. “whatsapp-demo”
titlestringyesQuiz title
descriptionstringnoQuiz description
welcome_messagestringnoIntro message before the first question
is_activebooleannoActive flag (default true)
agent_contextstringnoInjected per-interview context for the AI interviewer: company, the interview’s purpose, the event, and tone. Combined at runtime with the engine hard-coded base guardrails. Plain text.
guardrailsstringnoOptional per-interview extra rules layered on top of the engine base anti-injection guardrails (e.g. “stay strictly on the event-feedback topic; refuse off-topic questions politely”). Plain text.
business_unit_idstringnoOptional strategy.business_units id to inherit/share context across a BU. Per-interview agent_context/guardrails override the BU default.
questionsobject[]yesOrdered list of questions to create

Dispatch Interview (WhatsApp / Discord)

Send a quiz/interview to a list of recipients via the interview engine over WhatsApp (phone) or Discord. For Discord, supply discord_id directly, or a guest_id / member_id to resolve it server-side (precedence: guest override > member→profile > skip). Returns sent/failed counts, per-recipient dispatch ids, and any skipped recipients with no Discord identity.

ParameterTypeRequiredDescription
quiz_slugstringyesSlug of the quiz to send (must exist in quiz.quizzes)
channelenumnoDelivery channel. whatsapp → recipients need phone; discord → discord_id (or guest_id/member_id to resolve). One of: whatsapp, discord. Default: "whatsapp".
recipientsobject[]yesSend-list (1–200 recipients)

List Interview Dispatches

List interview dispatch rows (who received which quiz, channel, status, timestamps). Filter by quiz_slug, status, or recipient_phone.

ParameterTypeRequiredDescription
quiz_slugstringnoFilter by quiz slug
statusenumnoFilter by dispatch status One of: pending, sent, in_progress, completed, timed_out, opted_out.
recipient_phonestringnoFilter by recipient phone
limitnumbernoMax rows (default 50, max 200)
offsetnumbernoRows to skip (pagination)

Get Interview Status

Track one interview: the dispatch row (status, timestamps), its session, and answers collected so far. Provide dispatch_id OR (recipient_phone + quiz_slug).

ParameterTypeRequiredDescription
dispatch_idstringnoDispatch UUID
recipient_phonestringnoRecipient phone (with quiz_slug)
quiz_slugstringnoQuiz slug (with recipient_phone)

List Answers

List the answers (per-question transcript) for a session. Provide response_id OR dispatch_id.

ParameterTypeRequiredDescription
response_idstringnoResponse (session) UUID
dispatch_idstringnoDispatch UUID (resolves its response_id)

List Responses

List response (session) rows for a quiz — one per interview session, with completion status. Filter by quiz_slug and/or completed. Pair with list_answers for the per-question transcript.

ParameterTypeRequiredDescription
quiz_slugstringnoFilter by quiz slug
quiz_idstringnoFilter by quiz id (alternative to quiz_slug)
completedbooleannotrue → only completed sessions; false → only in-progress
limitnumbernoMax rows (default 50, max 200)
offsetnumbernoRows to skip (pagination)