Skip to main content
Glama

Server Details

Create 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.

Ownership verified
Status
Healthy
Uptime
100.0% over the last 24 hours
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A3.8/5.0

Scored across 42 tools

Disambiguation3/5

Most tools have distinct resource+action purposes, but the record/lead/examinee triad (list_records, list_leads, list_examinees, get_record, get_lead, get_examinee) describes overlapping CRM concepts that an agent could easily mix up. Similarly update_form vs update_form_settings vs set_dimension_analysis requires careful reading, and add_question vs insert_question vs update_question have fine-grained boundaries. The descriptions are detailed enough to eventually separate them, but the boundaries are not self-evident.

Naming Consistency4/5

Overwhelmingly consistent snake_case verb_noun pattern (create_form, update_question, delete_form_translation, list_leads, assign_leads). Minor deviations exist where the noun leads (get_active_tenant, list_my_tenants, prepare_image_upload/finalize_image_upload as a two-step pair), but these are still readable and predictable.

Tool Count2/5

42 tools is heavy for a quiz/form builder surface and several families (three listing tools over near-identical entities, three report-configuration tools, six question-editing tools) inflate the set beyond what the core workflows need. The domain is genuinely broad (forms, questions, translations, media, CRM, analytics, tenancy), but the surface feels exposed rather than curated.

Completeness4/5

Lifecycle coverage is strong: form create/update/delete/restore/duplicate, full question CRUD plus reordering, translations, media upload, templates, leads, records, examinees, analytics and bookings. Gaps are modest — no member removal or member listing beyond assignableMembers, no delete for leads/records/examinees, and bookings are intentionally read-only — all workable around.

Available Tools

42 tools
add_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.

NameRequiredDescriptionDefault
bodyYesThe note text
leadIdYesThe lead id (the leadId returned by list_leads)
recordIdNoOptional record id this note is about (as returned by get_lead records / list_records)

Output Schema

NameRequiredDescription
bodyNoThe note text as stored
leadIdNoThe lead it was written on
commentIdNoThe created note
createdAtNoISO datetime

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, but the description adds critical behavioral context: the note is visible only to team members and never to the respondent, the 2000-character limit, the optional recordId context, and the non-idempotent timeout behavior. The non-idempotency warning is especially valuable because it directly affects how an agent should handle retries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with zero waste. The core action and visibility constraint are front-loaded, the character limit and optional parameter are stated compactly, and the non-idempotency warning is placed at the end where it is most actionable. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter tool with 100% schema coverage, an output schema, and annotations covering the safety profile, the description is complete. It covers the action, scope, visibility, limits, optional parameter semantics, and retry behavior. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters. The description adds meaning by explaining the purpose of the note ('internal follow-up'), the visibility constraint, and the optional recordId as 'context'. It doesn't add syntax details, but the schema already covers those, so a 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Write'), a specific resource ('internal follow-up note on a lead'), and a clear scope ('of the current team'). It also distinguishes itself from reading notes by pointing to get_lead(includeComments: true), and the sibling list shows no other add-comment tool, so there is no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool (to write an internal follow-up note), what it is not for (visible to team members only, never to the respondent), and how to read existing notes (get_lead with includeComments: true). It also gives a clear retry policy: check first, then retry only if the note is really missing. This is explicit when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_questionAdd questionInspect

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.

NameRequiredDescriptionDefault
maxNoSame as create_form questions[].max.
minNoSame as create_form questions[].min.
codeNoSame as create_form questions[].code.
kindNoSame as create_form questions[].kind.
nameNoSame as create_form questions[].name.
typeYesQuestion type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer
unitNoSame as create_form questions[].unit.
itemsNoSame as create_form questions[].items.
scoreNoSame as create_form questions[].score.
stepsNoSame as create_form questions[].steps.
wordsNoSame as create_form questions[].words.
formIdYesThe form ID to append the item to
aiMatchNoSame as create_form questions[].aiMatch.
choicesNoSame as create_form questions[].choices.
contentNoSame as create_form questions[].content.
explainNoSame as create_form questions[].explain.
shuffleNoSame as create_form questions[].shuffle.
maxFilesNoSame as create_form questions[].maxFiles.
multipleNoSame as create_form questions[].multiple.
requiredNoSame as create_form questions[].required.
precisionNoSame as create_form questions[].precision.
rateStyleNoSame as create_form questions[].rateStyle.
trueLabelNoSame as create_form questions[].trueLabel.
falseLabelNoSame as create_form questions[].falseLabel.
descriptionNoSame as create_form questions[].description.
trueOutcomesNoSame as create_form questions[].trueOutcomes.
correctAnswerNoSame as create_form questions[].correctAnswer.
decimalPlacesNoSame as create_form questions[].decimalPlaces.
falseOutcomesNoSame as create_form questions[].falseOutcomes.
trueDimensionScoresNoSame as create_form questions[].trueDimensionScores.
falseDimensionScoresNoSame as create_form questions[].falseDimensionScores.

Output Schema

NameRequiredDescription
fieldNoThe created question, including its generated code
formIdNoThe form that was edited
itemCountNoQuestion / page-break count after the append
assign_leadsAssign leadsA
Destructive
Inspect

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 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.

NameRequiredDescriptionDefault
leadIdsYesThe lead ids to assign, max 50 per call
assigneeIdNoThe member userId to assign to, or "me" for the current token's own user. Omit (or pass null) to clear the assignee.

Output Schema

NameRequiredDescription
countNoHow many leads were changed
itemsNoPer-lead result
assigneeIdNoThe member they were assigned to, or null when cleared

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and destructiveHint=true, but the description adds valuable behavioral context: 'Each actual change is recorded on the lead's timeline' and describes the aggregated notification and email behavior, including that reassigning the same owner does not trigger another notification. This goes beyond the annotations and helps the agent understand side effects and user-facing impacts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat long but every sentence provides useful guidance: purpose, batching rule, assignee requirements, unassign method, and side effects. It is front-loaded with the core action and then provides necessary operational details. It is not overly verbose given the amount of information needed for correct usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with an output schema and two parameters, the description covers all essential aspects: what to pass, how to batch, who qualifies as assignee, how to unassign, and what side effects occur (timeline recording, notifications). It also points to a sibling for eligible assignees. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters already have detailed descriptions (e.g., 'The member userId to assign to, or "me"... Omit (or pass null) to clear the assignee.'). The description repeats these details but adds no new parameter-specific information beyond the schema. The batching instruction (up to 50) is also already in the schema's maxItems. Therefore, the description adds minimal extra parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Assign one or more leads of the current team to a member, or clear the assignee.' This is a specific verb (assign) with a specific resource (leads) and an additional action (clear). It distinguishes itself from siblings like set_lead_tags or update_lead by focusing on the assignment/ownership change.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage rules: 'Pass every lead id in a single call (up to 50) — do not loop one call per lead.' It also specifies prerequisites (assignee must be an active non-viewer member, see list_lead_settings.assignableMembers) and explains how to unassign (omit/null). It does not explicitly name alternative tools for the same operation, but it points to a sibling for prerequisite info, and the 'do not loop' instruction is a clear when-not-to-do.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_formCreate formInspect

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.

NameRequiredDescriptionDefault
sceneYesknowledge_quiz = graded exam (correctAnswer + score); scored_quiz = option scoring + report formula; outcome_quiz = typing quiz (votes decide which outcome type wins); ai_quiz = no scoring, an AI writes each report from report.aiReport (may include Attachment uploads). Immutable after creation.
themeNoOptional visual theme matching the quiz topic/mood. Default light. Pick the one that best fits the quiz: light (clean neutral bright; default — formal/general quizzes); corporate (professional blue+gray; B2B, career, business assessments); dark (modern sleek dark; tech, night, cool personality quizzes); cupcake (soft pink cute rounded; fun, food, kids, lighthearted); pastel (gentle pastel artsy; lifestyle, aesthetics, soft mood); valentine (pink romantic hearts; love, relationships, holidays); synthwave (neon purple/pink retro; gaming, trends, bold personality); luxury (dark + gold premium; finance, luxury brands, high-end); forest (deep green nature; environment, health, outdoors); coffee (warm brown cozy; food & drink, cafe, lifestyle); autumn (warm orange/brown seasonal; autumn, cozy, harvest); halloween (purple+orange spooky; Halloween, horror, festive fun); night (deep calm blue; astronomy, mindfulness, calm tech); cyberpunk (high-contrast neon yellow; tech, esports, gaming).light
titleYesForm title (1-200 characters). Plain text: no HTML or Markdown.
reportNoReport configuration. knowledge_quiz / scored_quiz: overallAnalysis fields are flat at the top level and dimensionAnalysis is nested (strongly recommended for the scored_quiz scene, rejected in the knowledge_quiz scene, which has no dimensions). outcome: only the outcomes key (required at create time) and sectionOrder are allowed. ai_quiz: only aiReport and sectionOrder are allowed.
languageNoDefault en_USen_US
openGraphNoSocial share card (Open Graph) settings: the title / description / image shown when the answer link is shared to social media or chat apps. In update_form each sub-key is merged independently (only the keys you pass change; pass an empty string to clear one). SEO keywords are generated automatically and cannot be set here.
questionsNoOptional. A list of questions/page breaks to create at once, written into form.fields in order. 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`, use it instead of SingleCheck/MultiCheck when there are more than 20 choices); Cascade (hierarchical choices via children, scored_quiz / ai_quiz); Ordering (quiz only, correctAnswer = all choices in the correct order); DateField/TimeField as unscored data-collection fields (scored_quiz / ai_quiz); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz / ai_quiz; in scored_quiz the 1..steps rating value is the question score unless per-star scores are set in the web app); Attachment (ai_quiz only: a file upload with `kind` image / audio / video / document that the AI reads). Insert a page break with { type: "Breaker" }, which the AI can interleave between questions to paginate. Display blocks collect no answer: { type: "Statement", content } is a rich-text passage (intro / section lead-in / disclaimer) and { type: "Swiper", items } an image carousel. At most 100 items.
systemTextNoOptional. Answer-page system text overrides as a key→text map; empty values are dropped and fall back to the language default.
descriptionNoOptional form description. Allows description-scope rich text (including <img src>). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not "- item", <h2> not "## heading". This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one.

Output Schema

NameRequiredDescription
idNoThe new form id
urlNoAdmin edit URL
sceneNoknowledge_quiz / scored_quiz / outcome_quiz / ai_quiz
themeNoAnswer-page theme name
titleNoForm title
fieldsNoEvery question code — read these before writing a formula or dimensions
languageNoPrimary language of the form
outcomesNoOutcome types (outcome_quiz scene only)
shareUrlNoPublic share / answer link
hasReportNoWhether a report configuration was passed
publicTokenNoToken behind the public answer link
questionCountNoHow many questions / page breaks were created
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.

NameRequiredDescriptionDefault
titleNoOptional new form title; defaults to the template title
templateIdYesThe template ID to create the form from

Output Schema

NameRequiredDescription
idNoThe new form id
urlNoAdmin edit URL
sceneNoknowledge_quiz / scored_quiz / outcome_quiz / ai_quiz
titleNoForm title
languageNoPrimary language cloned from the template
shareUrlNoPublic share / answer link
publicTokenNoToken behind the public answer link
translationLanguagesNoLanguages cloned along with the structure

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing what is cloned (structure, scoring/report config, visual settings, language versions) and what is deliberately dropped (redirect-after-submit, CTA URLs switched off). It also flags non-idempotency and the timeout/duplicate hazard, which the readOnlyHint=false/destructiveHint=false pair does not convey. Minor gap: no mention of auth/permission requirements or where the new form lands beyond 'current team'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then consequences, then caveats; each sentence carries information. Slightly dense in the middle (the CTA/link detail) but nothing is padding, and the non-idempotency warning is correctly placed last.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need no explanation, only two simple params, and the description still covers cloning scope, dropped links, follow-up editing, and retry safety. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds the provenance of templateId (find it with list_templates) and restates the title override in operational terms ('Pass title to override the template title'). That is small but real added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new form in the current team from a public template') and immediately names the input source, distinguishing it from create_form and list_templates by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: use list_templates to find ids, prefer this over create_form when a suitable template exists, and follow up with update_form / update_question. It also gives a when-not-to-blindly-retry rule, which is genuine usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

NameRequiredDescriptionDefault
formIdYesThe source form UUID
languageYesTarget language for the new version. Must differ from the form's primary language.

Output Schema

NameRequiredDescription
clonedNoThe cloned source draft — translate the text in place, keep every code, then save
formIdNoThe source form
languageNoLanguage of the new version
shareUrlNoPublic link for this language (source token + ?lang=)
translationIdNoThe new translation id
feedbackSourceNoSource copy of the result-page feedback block { enabled, answerType, question, title, description, buttonText, choices[{ code, label }] } to translate via update_form_translation.feedback; null when the form has none

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the mutation profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the safety burden is light. The description adds real behavioral context beyond that: the source text is cloned as an initial draft, the result is returned immediately, and codes must stay identical to the source. It stops short of describing failure modes or partial-state behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, all front-loaded with the action and outcome before the constraints. Every clause carries a distinct, useful instruction with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. The description covers purpose, workflow, constraints, and the follow-up tool, leaving nothing an agent needs in order to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the language enum plus 'must differ from primary language' are documented in the schema. The description adds the uniqueness rule (one translation per language) that the schema does not state, giving genuine extra semantic meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add a language version (translation) to a form') and describes the concrete outcome (clones source text as draft). It explicitly distinguishes itself from siblings update_form_translation, list_form_translations, and the primary form, so an agent can route correctly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use instructions plus a workflow sequence (create here, translate in place, save with update_form_translation). It also states two hard constraints: the language must differ from the primary language, and at most one translation per language, pointing to list_form_translations to verify.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_formDelete formA
Destructive
Inspect

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

NameRequiredDescriptionDefault
formIdYesThe form UUID to move to trash

Output Schema

NameRequiredDescription
formIdNoThe form moved to trash
messageNoHuman-readable result, including how long it stays recoverable

TDQS

A3.6/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description clearly states this is a destructive/state-changing operation ('delete', 'move to trash', 'auto-purged'), but the annotations declare readOnlyHint: true. This is a direct annotation contradiction, so the behavioral transparency score must be 1.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences front-load the action, then explain recovery and permissions. No filler, and each sentence adds operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the action, recovery window, restore alternative, and permission model, which is complete for a soft-delete tool. The contradictory readOnlyHint makes full coherence slightly less complete, but the textual description itself is thorough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully documents the only parameter formId as a UUID, so the description adds little about parameters. The described team/owner context is about authorization rather than the parameter's meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Move a form into the trash / soft delete') on a specific resource (form) within a context ('current team'). It lucidly distinguishes this soft-delete operation from a hard delete and names the recovery path via restore_form, making the tool's purpose unmistakable against siblings like delete_form_translation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear invocation context: soft-delete rather than permanent removal, recoverable within 5 days before auto-purge, and explicitly points to restore_form as the undo path. It also states the authorization boundary (form owner or team owner/admin). It does not mention when to prefer duplicate/delete_form_translation, but that is not necessary for this tool's core use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_form_translationDelete form translationA
Destructive
Inspect

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).

NameRequiredDescriptionDefault
formIdYesThe source form UUID
languageYesWhich language version to delete

Output Schema

NameRequiredDescription
formIdNoThe source form
deletedNoAlways true on success; submission records are kept
languageNoLanguage version that was deleted

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive, but the description adds meaningful behavioral details: submission records are anchored to the source form and not deleted, and reports for historical records in the deleted language fall back to source text. It also notes the primary language cannot be deleted, which is a significant constraint. These go beyond the annotations and inform the agent of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no redundancy. The purpose is front-loaded, the behavioral consequences are stated concisely, and the constraint about the primary language is clear. Every sentence adds value and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete operation with an output schema present and annotations covering destructiveness, the description covers the key caveats: submissions are preserved, reports fall back, and primary language is excluded. It does not address potential errors (e.g., deleting a nonexistent language) or idempotency, but these are minor for this tool's complexity. Overall it is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema descriptions for both formId and language are sufficient (100% coverage). The description does not add extra parameter semantics; it only restates that a language is being deleted and mentions the primary language restriction, which is not directly tied to the parameter details. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the action clearly: 'Delete one language version (translation) of a form.' The resource is specific (a translation of a form), and it distinguishes itself from deleting the whole form (delete_form) and from other translation tools (create/update/get) by focusing on removal. It also clarifies the primary language cannot be deleted, which further scopes the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for when to use this tool by stating what it deletes (a translation, not the source) and that the primary language cannot be deleted this way. It implies that other tools handle the primary language or whole form deletion, but does not explicitly name alternatives like delete_form or update_form_translation. This is clear but not fully explicit about when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_questionDelete questionA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
codeYesThe code of the question to delete
formIdYesThe form ID the question belongs to

Output Schema

NameRequiredDescription
formIdNoThe form that was edited
deletedCodeNoThe question code that was removed
remainingCountNoQuestion / page-break count left in the form

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the description correctly spends its words elsewhere: it discloses that deleting the last element is permitted (a form can be emptied) and, importantly, that {{code}} references are stripped from report.aiReport.instructions in the ai_quiz scene. That is exactly the kind of non-obvious side effect an agent needs before calling a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then the edge case, then the side effect. No filler, though the mid-sentence type enumeration makes the first sentence slightly dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive tool with an output schema, the description covers what gets removed, the empty-form edge case, and cross-entity cleanup. Missing only failure modes (e.g., unknown code) and whether the form must be in a draft/editable state.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented; the description adds only that deletion is keyed by code and scoped to a form. No format, uniqueness, or error semantics for code are added beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) and the precise resource (a single item identified by code), and enumerates the item kinds it applies to (question, Breaker, Statement/Swiper). This clearly separates it from delete_form (whole form) and update_question (modify rather than remove).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'single item by code' framing implies it is not the whole-form delete and not a modification, but no sibling is named and no explicit when/when-not guidance is given. The ai_quiz note hints at a conditional context but is framed as a behavior, not a usage rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
newTitleNoOptional title for the copy; defaults to "<source title> (copy)"
sourceFormIdYesThe form UUID to duplicate

Output Schema

NameRequiredDescription
idNoThe new (copied) form id
urlNoAdmin edit URL of the copy
sceneNoknowledge_quiz / scored_quiz / outcome_quiz / ai_quiz
titleNoTitle of the copy
shareUrlNoPublic share / answer link of the copy
fieldCountNoHow many questions were copied
publicTokenNoFresh token of the copy
translationLanguagesNoLanguages copied along with the structure

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=false; the description goes far beyond by listing what is NOT copied (submissions, sharing, integrations, ban state), noting fresh share links and your ownership, and flagging non-idempotency with a concrete failure mode. That timeout/retry warning is exactly the behavioral context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: what it does, what it excludes, and how to handle failure. Scope and exclusions are front-loaded, and the retry caveat is placed last where it belongs. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema covers return values, and the description already handles the remaining unknowns for a mutation tool: copy scope, ownership, side effects, and safe retry behavior. An agent has everything needed to call this correctly and to recover from a timeout.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema itself documents newTitle's default and sourceFormId's UUID type, so the baseline is 3. The description adds conceptual context (the copy is owned by you with fresh share links) but does not elaborate on either parameter beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Duplicate a form") and immediately scopes it ("in the current team"), then enumerates exactly what is cloned: structure, scoring, report, visual settings, translations. This clearly separates it from create_form and create_form_from_template, which produce a form from scratch rather than copying an existing one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete use case ("cloning a proven quiz and tweaking it") and an explicit retry protocol ("check first, then retry only if it is really missing"). It stops short of naming alternatives like create_form_from_template or create_form, so an agent must infer when duplication beats template creation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
altNoOptional alt text for the image.
keyYesThe object key returned by prepare_image_upload.
filenameYesOriginal filename for admin display / download (same value passed to prepare_image_upload).
mimeTypeYesImage MIME type used at prepare time. Must be one of image/png, image/jpeg, image/gif, image/webp.

Output Schema

NameRequiredDescription
keyNoPermanent object key
urlNoPublic URL of the stored image
mediaIdNoMedia id — pass it to update_form as flagImg / landingImage
filenameNoOriginal filename
filesizeNoSize in bytes, as measured on storage
mimeTypeNoDetected image MIME type

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a mutating, non-destructive operation. The description adds meaningful side-effect context: it verifies the object in storage, records it in the media library, and returns a media id + public URL. Failure modes and auth requirements aren't detailed, but the core behavior is well disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact, front-loaded sentences with no filler. The critical timing constraint is stated immediately, and the next-step guidance is presented efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich output schema, fully documented parameters, and a description that covers workflow position, side effects, and downstream usage, an agent has everything needed to invoke the tool correctly and understand its result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all 4 parameters with good descriptions at 100% coverage. The description reinforces that key, filename, and mimeType come from the prepare step, but adds limited new parameter-level meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies this as step 2 of a 2-step upload flow, specifying the exact action (verify, record, return media id + public URL) and distinguishing it from prepare_image_upload and update_form. An agent can immediately understand what this tool does and how it fits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to call this tool ('AFTER you have PUT the file to the uploadUrl') and what to do next ('call update_form with flagImg or landingImage'), providing clear sequencing and pointing to the relevant sibling alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_active_tenantGet active team
Read-only
Inspect

Return the team (tenant) this token is currently operating against. All write tools default to this team.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
idNoTeam id
nameNoTeam name
roleNoYour role in this team
slugNoTeam slug
get_examineeGet respondent
Read-only
Inspect

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.

NameRequiredDescriptionDefault
examineeIdYesThe examinee business ID (e.g. AB1234567890), as shown in list_examinees

Output Schema

NameRequiredDescription
nameNoMasked name (J*n)
emailNoMasked email (j***g@example.com); never pass it back as an argument
avatarNoUploaded avatar as { id, url }
tenantNoTeam (tenant) the respondent belongs to
createdAtNoISO datetime of first sign-up
updatedAtNoISO datetime of the last change
customDataNoTeam-defined custom fields; phone-typed values come back masked
examineeIdNoBusiness ID of the respondent (e.g. AB1234567890) — use it to address them
avatarPresetNoPreset avatar reference { theme, seed }, when no image was uploaded
emailVerifiedNoWhether the email has been verified
get_formGet formA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
idYesThe form UUID
includeFieldsNoWhether to return fields[] (raw data of questions + page breaks), default true. For large forms you can pass false to skip
includeReportNoWhether to return the report configuration, default true

Output Schema

NameRequiredDescription
idNoForm id
sceneNoknowledge_quiz / scored_quiz / outcome_quiz / ai_quiz
themeNoAnswer-page theme name
titleNoForm title
fieldsNoFull question list with code / choices / scoring (only when includeFields)
reportNoReport configuration, trimmed to the scene (only when includeReport)
isActiveNoWhether the form is open for submissions
languageNoPrimary language
shareUrlNoPublic share / answer link
createdAtNoISO datetime
openGraphNoSocial share card { title, description, image, keywords }
updatedAtNoISO datetime
systemTextNoOverridden system copy, keyed by text key
descriptionNoForm description
publicTokenNoToken behind the public answer link
translationLanguagesNoLanguages that already have a translation

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a read-only, non-destructive, closed-world operation, so the description does not need to restate safety. It adds useful behavioral context by stating that the result includes fields[] and report configuration, that outcome codes live at report.outcomeAnalysis.outcomes, and that translationLanguages lists non-primary versions. It does not address missing-form behavior or permissions beyond 'current team.'

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, and the remaining sentences focus on useful output details for outcome forms and languages. The description is appropriately sized for a read-by-id tool, though some return-value detail overlaps with the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given rich annotations, 100% schema coverage, and an output schema, the description is complete enough to call the tool correctly. It covers the main return nuances and the current-team scope, but does not mention error behavior when a form is not found or inaccessible.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents id, includeFields, and includeReport fully. The description mentions the fields[] and report data that those booleans control, but it does not add syntax, constraints, or selection guidance beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'View one form of the current team in full.' It distinguishes the operation from list-style siblings by specifying a single form and enumerating the included data (fields[], report configuration). It stops short of naming an explicit alternative, so it is clear but not maximally differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'View one form' implies usage when a single form's full details are needed, and the mention of large-form behavior is left to the schema. However, the description does not explicitly say when to use this tool versus list_forms, get_form_translation, or get_form_stats. Usage is therefore implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_form_funnelGet form funnelA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
daysNoLook-back window in days, default 30, max 180
formIdYesThe form UUID

Output Schema

NameRequiredDescription
daysNoLook-back window actually used
formIdNoThe form this funnel belongs to
dropOffNoWhere unsubmitted sessions gave up
overallNoStage counts: { viewed, started, submitted, leadCaptured, reportViewed, ctaClicked, shared }; leadCaptured counts submissions bound to a respondent account (from records), the rest come from session telemetry
channelsNoFunnel split by channel
utmCombosNoFunnel split by UTM combo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only and non-destructive; the description reinforces this by saying 'Read' and adds useful behavioral context—telemetry source, current-team scope, stage semantics, and the special counting rule for leadCaptured. It does not undermine or contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is front-loaded with the core action and resource, and both sentences carry useful information. The first sentence is dense and somewhat run-on, but the details are relevant enough to justify their inclusion.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, and it covers the data source, stages, channel breakdown, counting caveat, and intended use. Minor ambiguity in 'embedded flag' and the lack of explicit cross-references to sibling tools keep it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both formId and days are already documented with types, defaults, and bounds. The description only mirrors these as 'last N days,' adding little beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Read the conversion funnel for a form') and enumerates the exact metrics returned—stages, per-channel funnel, UTM combos, and drop-off points. The stage order and the leadCaptured counting nuance make it unambiguous and readily distinguishable from sibling stats/retrieval tools like get_form_stats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the intended use ('Use this to find where respondents drop and improve conversion'), telling an agent when to prefer this tool. It does not name alternative tools or exclusion conditions, so it stops short of full when/not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_form_share_infoGet form share info
Read-only
Inspect

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.

NameRequiredDescriptionDefault
formIdYesThe form UUID
utmSourceNoOptional channel tag applied to the links and snippets (letters, digits, _ and - only, max 64). Omitted or invalid = no tag, in which case the embed script forwards whatever utm_* the host page already has.
iframeHeightNoOptional pixel height for the iframe snippet, default 600
popupButtonTextNoOptional label for the popup-mode button; empty uses the built-in default

Output Schema

NameRequiredDescription
slugNoCustom path under the custom domain; only shapes shareUrl while that domain is serving
embedNoCopy-paste embed snippets { inline, popup, iframe }; null when the form has no public token
titleNoForm title
formIdNoThe form
deliveryNoDelivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, defaultCta, hiddenFields, sharedWithAll, searchIndexable }
shareUrlNoThe link to hand out (custom domain when one is serving)
publicTokenNoToken behind the public answer link
customDomainNoCustom-domain state { domain, status, serving, plan }
languageUrlsNoOne link per language version
defaultShareUrlNoThe same quiz on the default domain — always works
get_form_statsGet form statsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
daysNoLength of the daily trend in days, default 30, max 180. Does not filter the other blocks.
formIdYesThe form UUID

Output Schema

NameRequiredDescription
daysNoLength of the daily trend actually used (other blocks are all-time)
trendNoOne entry per day in the window, zero-filled
formIdNoThe form these stats belong to
devicesNoSubmissions by device type
channelsNoSubmissions by utm_source
overviewNoKPI block: { totalSubmissions, todaySubmissions, yesterdaySubmissions, last7daysSubmissions, last30daysSubmissions, uniqueExaminees, anonymousSubmissions, reportCompleted, reportFailed, reportPending, avgScore, latestSubmittedAt }
utmCombosNoSubmissions by UTM combo
loginTypesNoAnonymous vs registered submissions
answerDistributionsNoAll-time answer distribution of the first 10 SingleCheck / DropDown / Rate / TrueFalse questions

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already cover the safety profile (readOnly, non-destructive, non-open-world), and the description adds substantive behavioral detail beyond them. It discloses two non-obvious caveats: that `days` affects only the daily trend while all other blocks count all-time submissions, and that answer distributions cover only the first 10 SingleCheck/DropDown/Rate/TrueFalse questions with MultiCheck excluded. That materially changes how an agent interprets the results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The output blocks are front-loaded and each clause carries real information, with the caveats grouped after the enumeration and the use case placed last. The middle becomes a dense comma-separated list, but no sentence is wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an available output schema, the description need not spell out return values, yet it still summarizes them well enough for selection. All the behavioral surprises an agent needs to call and interpret this tool correctly are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, and the description's note that `days` does not filter other blocks largely echoes the schema's own text. It reinforces rather than adds new meaning, so the baseline holds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a precise verb+resource ('Read submission statistics for a form in the current team') and then enumerates the exact blocks returned (KPI overview, daily trend, channels, UTM combos, login types, device breakdown, per-question distributions). That is far more specific than the title. It stops short of naming the related sibling such as get_form_funnel, so the agent gets no explicit differentiation among analytics tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It supplies one clear usage context ('gauge how a quiz is performing and to suggest improvements'), which is implied guidance rather than explicit routing. It never says when not to use it or how it differs from get_form_funnel or get_form, leaving the agent to infer which analytics endpoint answers a given question.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_form_translationGet form translationA
Read-only
Inspect

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).

NameRequiredDescriptionDefault
formIdYesThe source form UUID
languageYesWhich language version to read

Output Schema

NameRequiredDescription
titleNoTranslated title
fieldsNoTranslated questions, mirroring the source codes
formIdNoThe source form
reportNoTranslated report copy
bookingNoTranslated booking block copy { title, description, buttonText }
feedbackNoTranslated feedback block copy { question, title, description, buttonText, choices[{ code, label }] }; null values / a null block = not translated yet (falls back to the source)
isActiveNoWhether this language version is live
languageNoLanguage of this version
shareUrlNoPublic link for this language
updatedAtNoISO datetime
systemTextNoTranslated system copy
descriptionNoTranslated description
feedbackSourceNoSource feedback block copy with its choice codes; null when the form has none

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description goes further by disclosing the error behavior when the language version is absent and by conveying the read-then-mutate workflow with its constraints (edit text, keep codes identical). It does not cover rate limits or pagination, which for a single-record read is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: what it returns, how to use it in the translate workflow, and the failure condition with the remedy. The purpose statement is front-loaded and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, yet the description still summarizes the payload shape and flags the error case plus the follow-up tool. An agent has everything needed to call it correctly and act on the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the enum is documented, so baseline is 3. The description adds genuine meaning tied to the language parameter: it must already exist, otherwise the call errors and you must create it first. No syntax details beyond the schema are added, but the precondition is a real semantic gain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read the full content of one language version (translation) of a form') and even names what the payload contains (mirrored fields[] and report). This is clearly distinguishable from get_form and list_form_translations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit workflow: use this to fetch the current draft before translating, edit text in place, keep codes identical, then save with update_form_translation. It also states the precondition for failure and names the sibling that fixes it (create_form_translation). Alternatives and when-not conditions are both covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_leadGet leadA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
leadIdYesThe lead id (the leadId returned by list_leads)
includeRecordsNoInclude the respondent's submission history (default true)
includeCommentsNoInclude the internal follow-up comments written by team members (default false)
includeActivitiesNoInclude the change timeline: status / assignee / tag changes and submissions (default false)

Output Schema

NameRequiredDescription
tagsNoColour tag codes on this lead
leadIdNoLead id — address a lead by this, never by a masked email
statusNoFollow-up status code (team-defined, see list_lead_settings)
recordsNoSubmission history as { totalDocs, items } (unless includeRecords was false)
assigneeNoThe member handling this lead as { id, email, username }, or null
commentsNoInternal follow-up notes written by team members (only when includeComments)
createdAtNoISO datetime the lead was created
firstFormNoThe quiz that first captured this lead as { id, title }
activitiesNoChange timeline as { totalDocs, items } (only when includeActivities)
respondentNoThe respondent { id, examineeId, email, name, customData, ... }, PII masked
nextBookingNoThe next active booking of this respondent, or null
recordCountNoHow many times this respondent submitted
lastRecordAtNoISO datetime of the most recent submission
firstRecordAtNoISO datetime of the first submission

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: results are scoped to the current team, all extra data (submissions, comments, change timeline) is opt-in, and lookup must never use a masked email. Return-value details are left to the output schema, which is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The first sentence front-loads the primary purpose and result contents; the second covers optional inclusions and the critical lookup rule. Every clause earns its place and the structure supports quick comprehension by an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with a rich output schema and fully described parameters, the description is complete: it names the identifier, scopes the query to the current team, explains the optional expansions, and warns against the masked-email anti-pattern. An agent has everything needed to call this tool correctly without further inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all four parameters well, giving a baseline of 3. The description adds value by translating the boolean flags into the exact content they include (submission history, internal comments, change timeline) and by emphasizing the leadId/examineeId reference rule. This is useful extra semantic guidance, though the schema already carries the core meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'View one lead of the current team by leadId.' It then enumerates the payload contents (follow-up status, assignee, tags, respondent block, next booking), making it unambiguous what this tool returns and clearly distinct from list-oriented or examinee-focused siblings. It leaves no doubt that the resource is a single lead, not a record or examinee.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear contextual guidance: the lead must belong to the current team, and lookups must use leadId/examineeId rather than a masked email. It also clarifies the optional include flags behavior. However, it does not explicitly state when to prefer get_lead over sibling tools like get_examinee or list_leads, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recordGet recordA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
recordIdYesThe record id (the `id` returned by list_records)

Output Schema

NameRequiredDescription
idNoRecord id — address a submission by this
dataNoThe submitted answers keyed by question code, as typed by the respondent — with any email address or phone number inside them masked
formIdNoThe quiz this submission belongs to
examineeNoThe respondent { id, examineeId, email, name, customData }, PII masked
metadataNoChannel attribution { utmSource, utmMedium, utmCampaign, utmTerm, utmContent, referrer, params } — params holds the URL parameters (hidden fields) declared on the quiz
reportUrlNoPublic report page URL for this submission
updatedAtNoISO datetime of the last change
shareTokenNoToken that makes this single report page shareable
submittedAtNoISO datetime of submission
reportResultNoThe sanitized report { status, errorCode, overallAnalysis, dimensionAnalysis, outcome, aiReport, aiEvaluation }; excludes internal diagnostics
serialNumberNoPer-form sequence number of the submission

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare it as a safe, closed-world read; the description goes well beyond that by disclosing that internal diagnostics are omitted and that quoted contacts plus any email/phone embedded in answers are masked, while answers are otherwise verbatim. These are non-obvious output-shaping behaviors an agent could not infer from readOnlyHint/destructiveHint and that affect how it should interpret results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and scope, with no filler or restatement of the name/title. The second sentence is dense with nested parentheticals and an exception clause ("except that any email address or phone number..."), which is informative but slightly harder to parse than the first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not strictly required, yet the description still tells the agent what sections come back (overall / dimensions / outcome / AI report / AI evaluation) and which fields are suppressed or masked. For a single-parameter, read-only tool at full schema coverage, nothing an agent needs to invoke and interpret it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter's schema text ("The record id (the `id` returned by list_records)") is essentially repeated in the description, so little meaning is added. The only marginal addition is the "in the current team" scoping hint, which implies ids are team-scoped and therefore only valid under the active tenant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("View the full detail of one submission record (lead)") and scopes it ("in the current team by its record id"). It also disambiguates from the listing sibling by pointing at the `id` field returned by list_records, and it enumerates the payload (examinee, answers, UTM metadata, report result), so an agent can tell it apart from get_lead, get_examinee, or list_records without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The prerequisite for calling it is explicit: the recordId must be the `id` from list_records, which establishes the intended workflow. There is no explicit exclusion clause naming when to prefer get_lead/get_examinee instead, so it is clear context rather than full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

insert_questionInsert questionInspect

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.

NameRequiredDescriptionDefault
maxNoSame as create_form questions[].max.
minNoSame as create_form questions[].min.
codeNoSame as create_form questions[].code.
kindNoSame as create_form questions[].kind.
nameNoSame as create_form questions[].name.
typeYesQuestion type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer
unitNoSame as create_form questions[].unit.
afterNoInsert after this code; choose either after or before
itemsNoSame as create_form questions[].items.
scoreNoSame as create_form questions[].score.
stepsNoSame as create_form questions[].steps.
wordsNoSame as create_form questions[].words.
beforeNoInsert before this code; choose either after or before
formIdYesThe form ID to insert the item into
aiMatchNoSame as create_form questions[].aiMatch.
choicesNoSame as create_form questions[].choices.
contentNoSame as create_form questions[].content.
explainNoSame as create_form questions[].explain.
shuffleNoSame as create_form questions[].shuffle.
maxFilesNoSame as create_form questions[].maxFiles.
multipleNoSame as create_form questions[].multiple.
requiredNoSame as create_form questions[].required.
precisionNoSame as create_form questions[].precision.
rateStyleNoSame as create_form questions[].rateStyle.
trueLabelNoSame as create_form questions[].trueLabel.
falseLabelNoSame as create_form questions[].falseLabel.
descriptionNoSame as create_form questions[].description.
trueOutcomesNoSame as create_form questions[].trueOutcomes.
correctAnswerNoSame as create_form questions[].correctAnswer.
decimalPlacesNoSame as create_form questions[].decimalPlaces.
falseOutcomesNoSame as create_form questions[].falseOutcomes.
trueDimensionScoresNoSame as create_form questions[].trueDimensionScores.
falseDimensionScoresNoSame as create_form questions[].falseDimensionScores.

Output Schema

NameRequiredDescription
fieldNoThe created question, including its generated code
formIdNoThe form that was edited
positionNo0-based index the question landed at
itemCountNoQuestion / page-break count after the insert
invite_memberInvite memberA
Destructive
Inspect

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 "viewer" (read-only) or "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.

NameRequiredDescriptionDefault
roleNoRole to grant. Defaults to "member": "viewer" is read-only, "admin" manages the whole team. Cannot be "owner".
emailYesEmail address of the person to invite.

Output Schema

NameRequiredDescription
roleNoRole granted by the invite
emailNoAddress the invite was sent to
membershipIdNoThe created membership record
invitationQueuedNoAlways true — the invitation email has been queued for delivery, not yet confirmed sent
isUserRegisteredNoWhether that address already had a RooQuiz account

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds valuable context beyond these: it explains the side effects ('pending membership is created immediately and an invitation email with a join link is queued'), the fact that the link/token is never returned, and role restrictions. This goes beyond the annotations to set accurate expectations, without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than minimal but every sentence carries essential information: action, side effects, restrictions, failure conditions, and contextual preparation. It is front-loaded with the core purpose and then expands logically. While it could be trimmed slightly, the density of useful content justifies the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's side effects and role-based restrictions, the description covers all necessary aspects: when to use it, prerequisites, failure modes, and the non-return of sensitive data. An agent can correctly invoke this tool without needing to infer anything beyond what is stated, making it fully complete for its complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (both parameters have descriptions), so the baseline is 3. The description adds value by clarifying the meaning of each role enum value: 'viewer' is read-only, 'admin' manages the whole team, and 'owner' is explicitly excluded. It also confirms the default for 'role'. This enhances the schema without redundancy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action and resource: 'Invite someone to the active team (tenant) by email.' It specifies the exact scope and distinguishes it from sibling tools like switch_active_tenant and list_my_tenants by focusing on the invitation action. The verb 'invite' and object 'team' are precise, making the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance, including role requirements ('Only the team owner or an admin can invite'), failure conditions ('Fails if the email is already a member...'), and how to prepare the correct context ('use list_my_tenants / switch_active_tenant to change teams first'). This is comprehensive and leaves no ambiguity about when or how to invoke the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_bookingsList bookingsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
toNoOnly bookings starting strictly before this ISO datetime, optional
fromNoOnly bookings starting on/after this ISO datetime, optional
pageNoPage number (1-based), default 1
sortNoSort by start time, default startAt (earliest first)
limitNoItems per page, default 20, max 100
formIdNoOnly bookings that came from this quiz, optional
statusNoFilter by status. pending = a request still awaiting confirmation in Cal.com, scheduled = a confirmed meeting, the rest are terminal. Optional.
recordIdNoOnly bookings tied to this submission record, optional
examineeIdNoOnly bookings by this respondent — the internal examinee id (get_lead's respondent.id), not the examineeId business code. Optional.

Output Schema

NameRequiredDescription
pageNo1-based page returned
itemsNoThe page of bookings (earliest first by default)
totalDocsNoTotal bookings matching the filter
totalPagesNoTotal pages available

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/openWorldHint/destructiveHint, so the safety profile is covered; the description nonetheless adds non-obvious behavior – the two provider sources, that reschedules/cancels in Cal.com propagate back, and that attendee name/email are returned masked. The masking disclosure in particular is operationally important and appears nowhere in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Effectively front-loaded: the core action and ordering come first, filters and identifiers follow. The second sentence carries a long parenthetical about providers and a full field inventory, which is useful but slightly overpacked relative to the rest.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, full parameter descriptions and annotations available, the description supplies the parts structured data cannot: data provenance, sync direction, and result masking. The remaining gap is minor – page/limit behavior is left entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the schema already documents from/to/status/formId/recordId/examineeId precisely, including the pending vs scheduled status meanings. The description recaps the filter dimensions and the 'reference by bookingId' convention but adds no format or edge-case detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource plus scope: 'List the bookings of the current team, earliest first.' It goes further than the name by defining what a booking actually is here – Cal.com-synced bookings plus read-only history from the retired native scheduler – which is information an agent cannot infer from the title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operating context: it is read-only, changes made in Cal.com sync back, and results can be narrowed by status/quiz/respondent/time range with bookingId as the reference key. It does not state when a different tool should be used instead, but no sibling in the list covers bookings, so there is no real routing ambiguity to resolve.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_examineesList respondents
Read-only
Inspect

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.

NameRequiredDescriptionDefault
limitNoItems per page, default 20, max 100
searchNoFuzzy match by email or name, optional

Output Schema

NameRequiredDescription
countNoHow many are returned in this page
itemsNoThe page of respondents (newest first), PII masked
totalNoTotal respondents matching the filter
list_formsList formsA
Read-only
Inspect

List the forms of the current team. Returned in reverse chronological order of creation, without question content (use get_form for details).

NameRequiredDescriptionDefault
limitNoItems per page, default 20, max 100
sceneNoFilter by scene, optional
titleContainsNoFuzzy match by title, optional

Output Schema

NameRequiredDescription
itemsNoThe page of forms (newest first)
totalDocsNoTotal forms matching the filter

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral detail: results are ordered reverse-chronologically by creation and omit question content, which agents cannot infer from the schema. Pagination behavior is left to the schema's limit field.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, with the resource scope front-loaded and the ordering/content caveat immediately after. The sibling pointer is placed last, where the agent needs it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety, a 100%-covered schema, and an output schema for return shape, the description only needed to supply ordering and content-scope context, which it does. Minor gap: it never hints that the endpoint is filterable, so an agent skimming only the description might not think to narrow results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit, scene, and titleContains are all documented with types, defaults, and enum values. The description adds nothing about the semantics of these filters, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the forms of the current team') and scopes it to the current team, which distinguishes it from the many form-related siblings such as get_form and list_templates. An agent can tell immediately what this returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to get_form when question content is needed, which is a real alternative with a clear selection condition. It does not discuss when to reach for the filter parameters versus paging through results, so it stops short of full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_form_translationsList form translationsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
formIdYesThe source form UUID

Output Schema

NameRequiredDescription
countNoHow many translations exist (the primary language is not listed)
formIdNoThe source form
translationsNoThe existing language versions

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: it returns each translation's language, isActive flag, public share link, and timestamps, and clarifies that the primary language is excluded. This goes beyond the annotations and helps the agent understand the result set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no fluff. The first sentence states the action and the return fields; the second clarifies an important edge case (primary language not included). Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a single required parameter, a full output schema, and annotations covering safety. The description explains what is returned and what is excluded. It could mention pagination or ordering, but for a simple list operation with an output schema, this is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: formId is described as 'The source form UUID'. The description doesn't add much beyond that, but it does imply that formId identifies the form whose translations are listed. Baseline 3 is appropriate since the schema already documents the parameter fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists existing language versions (translations) of a form, and explicitly distinguishes it from get_form by noting the primary language is not included. This differentiates it from siblings like get_form_translation and create_form_translation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: when you need an overview of all translations of a form. It also clarifies that the primary language is handled elsewhere (get_form.language), which helps an agent avoid using this tool for the primary language. It doesn't explicitly name alternatives like get_form_translation, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_leadsList leadsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
pageNoPage number (1-based), default 1
sortNoSort order, default -lastRecordAt (most recent submission first)
limitNoItems per page, default 20, max 100
statusNoFilter by follow-up status code (see list_lead_settings), optional
keywordNoFuzzy match on the respondent's name or email. Matching runs server-side against the real values, so you can search by a full or partial email even though results come back masked.
tagCodesNoFilter by colour tag codes; a lead matches if it has ANY of them (OR). Optional.
createdToNoOnly leads created strictly before this ISO datetime (half-open), optional
assigneeIdNoFilter by the assigned member userId (see list_lead_settings.assignableMembers). Pass "me" for the current token's own user. Optional.
createdFromNoOnly leads created on/after this ISO datetime, optional
hasUpcomingBookingNotrue = only leads with an active upcoming booking, false = only those without. Omit to not filter. Note: this filters within the page, so counts stay on the unfiltered basis.

Output Schema

NameRequiredDescription
pageNo1-based page returned
itemsNoThe page of leads, PII masked
totalDocsNoTotal leads matching the filter
totalPagesNoTotal pages available
hasNextPageNoWhether another page follows

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though readOnlyHint=true and destructiveHint=false already cover the safety profile, the description adds non-obvious behavior: leads are aggregated per respondent across all forms, newest activity first, and the hasUpcomingBooking filter applies within the page so counts remain unfiltered. That is real behavioral disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences cover the core behavior, default ordering, filter dimensions, and an important lexical rule. It is compact and front-loaded with the main action. It could be split into a more scannable format, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, 10-parameter listing endpoint with an output schema, the description covers the essential semantics (one lead per user, default ordering, filter options, team-defined codes) without re-heating the schema. It does not over-explain return fields, which is fine given the output schema exists. A little more about pagination behavior would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes all 10 parameters (100% coverage), so the requirement is low. The description still adds value by explaining the identity rules ('reference a lead by leadId, a respondent by examineeId'), clarifying the team-defined vocabulary, and noting keyword search works against unmasked server-side values. Good but not essential.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource ('List the leads (CRM records)') and immediately sharpens the meaning: one lead per respondent across all forms, with specific fields carried. This distinguishes it from sibling list tools like list_records and list_examinees, so an agent can tell what makes this endpoint unique.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly gives a prerequisite: 'call list_lead_settings first' to obtain valid status/tag codes and warns 'never guess.' That is solid procedural guidance. It does not, however, spell out when to pick list_leads over other list variants (e.g., list_records or list_examinees), so it falls just short of full score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_lead_settingsList lead settingsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
tagsNoThe team's colour tag library
statusesNoFollow-up statuses in display order
assignableMembersNoActive non-viewer members a lead can be assigned to

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description correctly aligns with those. It adds value beyond the annotations by explaining that the tool returns team-specific configuration and that the returned values are required for successful write operations. It doesn't contradict annotations and gives useful context about the tool's role in the workflow, though the output structure is left to the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundancy. The first sentence states the core purpose and enumerates the returned items; the second sentence gives critical usage guidance and rationale. It is front-loaded with the primary action and uses every word effectively, exceeding the minimum necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, has an output schema (as indicated in context signals), and annotations cover read-only and non-destructive behavior, the description is fully sufficient. It explains what the tool returns, why it should be called before specific write tools, and the team-specific nature of the data. An agent can call this tool correctly without any additional information beyond what the schema and annotations already provide.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing to explain. Baseline for 0 params is 4, and the description doesn't mention parameters at all, which is appropriate. It focuses entirely on the return value and usage context, not requiring any parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads the team's lead configuration, enumerating the specific elements (status codes with label/colour, colour tag library, assignable members). It uses an explicit verb ('Read') and resource ('lead settings'), and differentiates itself from sibling write tools by framing itself as the prerequisite read for update_lead, set_lead_tags, and assign_leads. This makes the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to 'Call this before update_lead / set_lead_tags / assign_leads' and explains why: status codes, tag codes, and member ids are team-specific, and write tools reject unknown values. This provides clear when-to-use guidance and implicitly states when not to use it (no need to call for other purposes). It also points to alternative write tools that require this information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_my_tenantsList my teamsA
Read-only
Inspect

List all teams (tenants) the current user belongs to. isActive marks the team this token currently operates against.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
tenantsNoTeams you are an active member of
activeTenantIdNoThe team this token currently operates on

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds non-obvious context by scoping results to the current user's memberships and explaining the isActive flag, which goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences deliver purpose, scope, and key field semantics with zero waste. The most important information comes first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, a read-only annotation, and an output schema present, the description fully covers what an agent needs to call the tool correctly. It even clarifies the ambiguous tenant/team terminology and the isActive field.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema coverage is trivially 100%. Per the baseline for parameterless tools, a 4 is appropriate; there is no param info needed and the description adds relevant semantic context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('all teams (tenants) the current user belongs to'). The isActive clarification further distinguishes this from get_active_tenant and switch_active_tenant, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context about scope ('current user belongs to') and the meaning of isActive relative to the active token. It does not explicitly name alternatives or when-not-to-use, but the context is enough to infer appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recordsList recordsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
pageNoPage number (1-based), default 1
limitNoItems per page, default 20, max 100
sinceNoOnly records submitted on/after this ISO datetime, optional
untilNoOnly records submitted on/before this ISO datetime, optional
formIdNoFilter by form UUID, optional
statusNoFilter by report generation status, optional. awaiting_gate: the form gates the report behind a respondent verification step and the respondent has not passed it yet, so the AI report has not been generated.

Output Schema

NameRequiredDescription
pageNo1-based page returned
itemsNoThe page of submissions (newest first)
limitNoPage size actually used
totalDocsNoTotal submissions matching the filter

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/destructiveHint annotations, it discloses non-obvious behavior: default ordering (newest first), field masking of emails and phone numbers written into answers, and the requirement to reference respondents by examineeId rather than masked email. That masking rule is exactly the kind of trap an agent needs warned about. It does not discuss pagination totals or rate/size limits, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences, front-loaded with what the tool returns, followed by filtering and the sibling pointer. Every clause carries information, though the parenthetical field enumeration is dense enough to slow reading slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter, zero-required read tool with an output schema, the description covers return contents, ordering, filters, and the masking/ID caveats an agent must respect. The only missing piece is pagination/limit behavior, which the schema already annotates adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all six parameters are already documented, and the description only restates the filter axes (form, report status, submitted-at range) without adding format or edge-case guidance. Pagination parameters are not mentioned at all. Baseline 3 is appropriate when the schema carries the semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List submission records (leads) of the current team, newest first') plus the exact shape of each item (examinee, answers, UTM, compact report result). It also names the sibling it is not ('Use get_record for one record's full detail'), so an agent can discriminate without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context for the summary-list use case and an explicit alternative route to get_record for full detail. There is no explicit exclusion, and the description loosely equates 'records' with 'leads' while a sibling list_leads exists, which leaves some ambiguity about which list tool to pick when the user says 'leads'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_templatesList templatesA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
limitNoItems per page, default 20, max 100
sceneNoFilter by scene, optional
useCaseNoFilter by use case (what the quiz is for), across scenes, optional: personality / recommendation (product or course finder) / assessment / level_test / trivia / ai_report
categoryIdNoFilter by category id, optional
isRecommendedNoWhen true, only return recommended templates
titleContainsNoFuzzy match by title, optional

Output Schema

NameRequiredDescription
pageNoCurrent page, 1-based (ops endpoint)
itemsNoThe page of templates
totalDocsNoTotal templates matching the filter
totalPagesNoTotal pages at this limit (ops endpoint)
hasNextPageNoWhether another page follows (ops endpoint)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and closed-world, so the safety profile is covered. The description adds genuinely new behavioral context: results are limited to *active* templates in a *public* library and are ordered most-used first, neither of which appears in the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences that each carry useful information: scope and fields, filtering guidance, and the recommended next step. The parenthetical field enumeration is long but earns its place by summarizing the result shape.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, yet the description still orients the agent well for a six-parameter list tool. Minor gap: it does not say where categoryId values come from, which an agent would need for that filter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond it by explaining the cross-scene semantics of useCase with a concrete example ("personality" also returns scored_quiz personality tests), which is not derivable from the enum list alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list active templates in the public template library) plus the returned fields and the ordering (most-used first). This is clearly distinct from siblings like list_forms or list_records, which operate on tenant-owned data rather than a public library.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use useCase filtering to find templates for a goal across scenes, and names the follow-on call (create_form_from_template with the returned id) as the fastest way to build a quiz when a suitable template exists. The exclusion case — what to do when no suitable template exists — is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
codeYesThe field code to move (a question, a Breaker or a display block)
afterNoMove after this code; choose either after or before
beforeNoMove before this code; choose either after or before
formIdYesform ID

Output Schema

NameRequiredDescription
toNo0-based index after the move
codeNoThe question that was moved
fromNo0-based index before the move
formIdNoThe form that was edited
changedNofalse when the question already sat at the target position
positionNoCurrent index — returned instead of from/to when no move was needed
questionCountNoTotal question / page-break count

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false (mutation) and destructiveHint=false, so the description adds context about how the move works (after/before, front/end). It doesn't disclose potential side effects like reordering implications or error handling, but given annotations, the added value is moderate. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the main purpose and mechanism. It includes all essential information without redundancy or fluff. Each sentence contributes value, making it efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a moderate complexity (moving items with after/before and front/end logic), and the description covers the core usage scenarios. An output schema exists, so return value details are not needed in the description. It doesn't mention edge cases like invalid codes or same-position moves, but for an agent, the provided guidance is sufficient to invoke correctly in common cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all parameters are documented. The description adds meaningful semantics beyond the schema: it clarifies that 'after' and 'before' are mutually exclusive, and explains how to reference the first/last field for front/end moves. This enriches understanding of the parameters, especially the interplay between code, after, and before.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the verb 'move' and the resource 'existing item (question, page break or display block)' and specifies the mechanism (by code, referencing another field's code). It also differentiates from sibling tools like add_question, update_question, and delete_question by focusing on reordering, and gives explicit front/end usage. This is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage instructions: choose either after or before, and explains how to move to the front (before the first field's code) or end (after the last field's code). It implies the tool is for repositioning existing items, which distinguishes it from add/update/delete. However, it doesn't explicitly state when not to use it or compare with alternatives, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
fileSizeNoOptional file size in bytes (of the file you will actually upload, after any compression). If provided it is checked against the 5MB cap and the team storage quota up front; the authoritative check still runs in finalize_image_upload against the actual uploaded size.
filenameYesOriginal filename for admin display / download, e.g. "cover.png".
mimeTypeYesImage MIME type. Must be one of image/png, image/jpeg, image/gif, image/webp.

Output Schema

NameRequiredDescription
keyNoStaging object key to pass to finalize_image_upload
expiresInNoSeconds until the presigned URL expires
uploadUrlNoPresigned PUT URL — upload the bytes here, then call finalize_image_upload
requiredContentTypeNoContent-Type header the PUT must send, or R2 rejects it

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark readOnlyHint=false and destructiveHint=false, so the description carries the burden of behavioral disclosure. It adds substantial detail: the presigned URL is short-lived, uploads over 5MB are rejected, the team storage quota is checked up front, and the caller must send a matching Content-Type header. This fully explains side effects and constraints without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence carries load-bearing operational information and the structure is a clear numbered workflow with concrete examples. The key behavioral fact (returns a presigned URL, does not accept bytes) is front-loaded. It is not minimal, but the length is justified by the complexity of the two-step upload.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-step upload involving local temp files, compression, MIME constraints, size caps, quota checks, HTTP PUT semantics, and a follow-up finalization tool, this description is complete. It even includes cleanup and tells the agent exactly how to call the sibling next. Since an output schema exists, not describing return values in prose is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds operational meaning beyond the schema: fileSize is optional and refers to the file after compression, it is checked early against the 5MB cap and quota, and the authoritative size check happens in finalize_image_upload. It also clarifies that filename is for admin display and mimeType must match the uploaded Content-Type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource pair: prepares the first step of a two-step image upload and returns a presigned URL rather than accepting image bytes. Explicitly differentiates from finalize_image_upload by numbering itself Step 1 of 2, so an agent can distinguish it from the sibling without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit numbered workflow covering pre-upload compression, when to call this tool, when to PUT to the returned URL, and when to call finalize_image_upload. It also states what the tool does NOT do (receive image bytes), which prevents an agent from attempting a direct upload through this conversation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_formRestore formAInspect

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

NameRequiredDescriptionDefault
formIdYesThe form UUID to restore from trash

Output Schema

NameRequiredDescription
formIdNoThe form restored from trash
messageNoHuman-readable result

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description reveals permission requirements (owner/admin only), scope (current team), and failure behavior (errors if form is not in trash). This goes well beyond the readOnly/destructive hints and gives the agent concrete expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the action ('Restore'), scope ('from the trash in the current team'), relationship ('undo delete_form'), access restriction, and error behavior. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter restoration action with an output schema and annotations present, the description covers what, where, who can perform it, and when it errors. There is no meaningful missing context for an agent to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already describes formId as the form UUID. The description adds contextual constraints (must be in trash, current team) but does not add parameter-specific details beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and object: 'Restore a form from the trash in the current team'. It also explicitly frames the operation as

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly names its counterpart 'delete_form', states the required context ('from the trash in the current team'), gives the permission prerequisites (owner/admin), and calls out an error condition when the form is not in the trash. This leaves little ambiguity about when the tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_dimension_analysisSet dimension analysis
Destructive
Inspect

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.

NameRequiredDescriptionDefault
titleNoMulti-dimension analysis title
formIdYesThe form ID to configure
dimensionsNoThe dimension list (at most 50). Pass an empty array to clear the multi-dimension analysis.
showRadarChartNoWhether to show the radar chart, default true
showStandardLineNoWhether to show the standard-score line on the radar chart

Output Schema

NameRequiredDescription
formIdNoThe form that was edited
dimensionsNoThe dimensions after the replace
dimensionCountNoHow many dimensions are configured now (0 = cleared)
set_lead_tagsSet lead tagsA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
modeNoHow to apply the tags, default replacereplace
tagsYesThe tag codes to apply, from list_lead_settings.tags[].code
leadIdsYesThe lead ids to tag, max 50 per call

Output Schema

NameRequiredDescription
modeNoreplace / add / remove
countNoHow many leads were changed
itemsNoPer-lead result

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive=true. Description adds concrete destructive semantics: replace overwrites the entire tag set, add/remove are selective, remove tolerates stale codes, and changes are recorded on each lead's timeline. This is valuable context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Tight, information-dense description with no filler; efficiently explains modes and caveats in a few sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers scope, batching limits, mode semantics, references the correct source of tag codes, and notes side effects (timeline). Nothing an agent needs to safely invoke it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all parameters, but the description adds field-level behavior beyond the schema: mode-by-mode meaning, the single-call batching instruction, and the stale-code behavior for remove.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise operation: setting colour tags on one or more leads in the current tenant, distinguishes itself from generic update_lead by scoping to tags and listing batch semantics. The verb, object, and scope are all explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational guidance: pass every lead id in a single call (do not loop), and explains when to use replace vs add/remove. Does not explicitly route to an alternative tool, but gives complete usage context for the various modes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
tenantIdYesTarget team ID. Use list_my_tenants to discover.

Output Schema

NameRequiredDescription
idNoThe team the token now operates on
nameNoTeam name
slugNoTeam slug

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark readOnlyHint=false, and the description goes beyond that by disclosing persistence across sessions and the membership requirement. That is meaningful behavioral context for a state-changing token operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences convey operation, persistence, and a prerequisite with no filler. Key facts are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter state-change tool with an output schema and full schema coverage, the description is nearly complete. It could mention that get_active_tenant reveals the current team, but that omission is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes tenantId with 100% coverage and even points to list_my_tenants for discovery. The description adds no new parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action (switch) on a specific resource (active team/tenant) and explains the scope (for this token). It is immediately distinguishable from siblings like get_active_tenant and list_my_tenants.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys when to use it (change active team) and includes the membership prerequisite. It does not explicitly mention siblings or exclusion criteria, but the context is sufficiently clear among the listed tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_formUpdate formA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
idYesThe form ID to update
themeNoNew visual theme for the answer page. Only this sub-key of personalized is changed; settings are kept. Optional visual theme matching the quiz topic/mood. Default light. Pick the one that best fits the quiz: light (clean neutral bright; default — formal/general quizzes); corporate (professional blue+gray; B2B, career, business assessments); dark (modern sleek dark; tech, night, cool personality quizzes); cupcake (soft pink cute rounded; fun, food, kids, lighthearted); pastel (gentle pastel artsy; lifestyle, aesthetics, soft mood); valentine (pink romantic hearts; love, relationships, holidays); synthwave (neon purple/pink retro; gaming, trends, bold personality); luxury (dark + gold premium; finance, luxury brands, high-end); forest (deep green nature; environment, health, outdoors); coffee (warm brown cozy; food & drink, cafe, lifestyle); autumn (warm orange/brown seasonal; autumn, cozy, harvest); halloween (purple+orange spooky; Halloween, horror, festive fun); night (deep calm blue; astronomy, mindfulness, calm tech); cyberpunk (high-contrast neon yellow; tech, esports, gaming).
titleNoNew title
reportNoReport configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate) replaces overallAnalysis, except that an omitted formula keeps the current one (pass formula: "" to remove it and fall back to the default sum); passing dimensionAnalysis replaces the dimension list (scored_quiz only; codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); passing sectionOrder replaces the result-page section order ([] restores the default); passing levelOrder sets the level display order (asc / desc, knowledge_quiz / scored_quiz only); passing scoreStyle sets the score card style (scale / ring / gauge / steps, null follows the theme; knowledge_quiz / scored_quiz only); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes).
flagImgNoQuiz cover image: a media ID returned by finalize_image_upload, or a media URL. Pass an empty string to clear the cover.
isActiveNoWhether to enable response collection
languageNoChange the form's language. Only allowed while the form has no translation links and is not referenced by other language versions; otherwise rejected.
openGraphNoSocial share card (Open Graph) settings: the title / description / image shown when the answer link is shared to social media or chat apps. In update_form each sub-key is merged independently (only the keys you pass change; pass an empty string to clear one). SEO keywords are generated automatically and cannot be set here.
systemTextNoAnswer-page system text overrides as a key→text map. Replaces the whole map (pass {} to clear); empty values are dropped and fall back to the language default.
descriptionNoNew description; pass an empty string to clear. Allows description-scope rich text (including <img src>). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not "- item", <h2> not "## heading". This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one.
landingImageNoLanding page cover image: a media ID returned by finalize_image_upload, or a media URL. Pass an empty string to clear it. Note: this only sets the image and does NOT toggle the landing page on/off; the landing image is shown only when the landing page is enabled.

Output Schema

NameRequiredDescription
idNoForm id
sceneNoknowledge_quiz / scored_quiz / outcome_quiz / ai_quiz
themeNoAnswer-page theme name
titleNoForm title after the update
flagImgNoMedia id of the quiz cover
isActiveNoWhether the form is open for submissions
languageNoPrimary language
hasReportNoWhether this call replaced the report configuration
openGraphNoSocial share card
updatedAtNoISO datetime
systemTextNoOverridden system copy
descriptionNoForm description
landingImageNoMedia id of the landing-page cover

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark the tool as destructive and open-world, but the description adds high-value semantics: report and openGraph sub-key merging, systemText wholesale replacement, empty-string clearing, outcome matching by code, and rejection when an outcome is still referenced. These details go well beyond the annotations and are consistent with them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The field list is front-loaded, and the remaining sentences focus on the highest-risk update semantics. For an 11-parameter nested mutation tool, the description is dense but appropriately sized with little wasted wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition gives the agent enough context to call a complex nested update correctly: it covers merge-vs-replace behavior, clearing, code references, validation rejections, language constraints, and sibling routing. Return-value details are appropriately left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 100% schema coverage, the description adds meaning that the schema fields alone do not fully convey: flagImg vs landingImage behavior, media ID/URL/clear semantics, report and openGraph merge rules, systemText clearing, and the language-change restriction. This materially reduces the chance of destructive or malformed updates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource, then enumerates the exact form fields it updates. It clearly distinguishes question-level edits and standalone dimensionAnalysis edits by naming the sibling tools that handle them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes questions to add_question / update_question / delete_question / move_question and standalone dimensionAnalysis to set_dimension_analysis. It also states when language can be changed, but does not explicitly contrast with update_form_settings for settings-oriented edits, leaving one sibling-routing gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_form_settingsUpdate form settings
Destructive
Inspect

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), sharedWithAll (whether every team member can see this form), 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.

NameRequiredDescriptionDefault
slugNoCustom path of the public answer link — the SEO-friendly address (e.g. quizster.app/<team>/burnout-test on the platform domain, or <custom-domain>/burnout-test when the team's custom domain is serving). Lowercase letters, digits and hyphens, 2-64 chars, must start and end with a letter or digit, unique within the team. Pass an empty string to clear back to the random address. Changing it breaks the previous custom path right away, but the token address (/a/<publicToken>) always keeps working and the page's canonical URL follows the custom path.
formIdYesThe form UUID
bookingNoThe result-page booking block: switch, copy and the Cal.com link respondents book through. With the team's Cal.com connector, bookings flow back and show up in list_bookings. Without a calLink the block is not shown, even when enabled.
sharingNoResult-page sharing: the share button, the personalised share card and the public summary. Turning this off stops respondents spreading their results.
feedbackNoResult-page feedback block: one question asked after respondents read their report — tells you whether the result landed. Replaced WHOLESALE: read the current block from get_form_share_info and pass every key you want to keep (omitted copy falls back to the default, omitted choices are dropped).
timeLimitNoAnswer-time countdown. Only knowledge quizzes (knowledge_quiz) can turn this on — a countdown makes sense when unanswered means wrong, but rushing a scorecard or a personality quiz just produces careless answers.
defaultCtaNoResult-page CTA buttons. This is the master switch: while it is off no result shows a CTA, not even levels / outcomes / AI result tags that have their own. Passing an object turns it on and replaces the default button (text + url), which every result without its own cta uses — pass {} to turn it on with no default, so only results with their own cta show a button. null turns it off and keeps the copy. Per-result buttons are set with update_form (writing one also turns this on). For AI quizzes the button appears below the AI report. Free on every plan.
hideScoresNoHide every score the respondent sees: the result page's overall score (score ring / number / percentile) and every dimension score, the points badge on each question while answering, the score in instant feedback, and the per-question scores in the answer review. Level names, level descriptions, the summary and right / wrong verdicts stay. The team still sees scores in the dashboard. Scenes with scores only (knowledge_quiz / scored_quiz). Note the summary template still renders its score variable if one is left in. Off by default.
answerSheetNoThe answer-sheet sidebar on the answering page: a question navigator that lets respondents jump to any question. On by default for newly created forms; turn it off for short quizzes meant to be answered straight through to the result page.
crowdCompareNoShow respondents what share of people picked the same option ("62% of people chose the same as you"). Off by default: it publishes this quiz's answer distribution to whoever answers it, and seeing the majority choice nudges later respondents toward it — leave it off for quizzes used to match courses or place learners. Percentages only, never individual answers, and nothing shows until the quiz has 10+ submissions. Not available for knowledge quizzes at all: the distribution is effectively a crowdsourced answer key.
hiddenFieldsNoURL parameters to capture with each response (hidden fields), e.g. ["partner", "campaign_id"]: opening the quiz link with ?partner=acme stores partner=acme on the record, where it shows in record detail, exports and webhook / Zapier payloads. Lowercase names, up to 10; utm_* and system names (email, name, lang, ref, embed…) are reserved. Replaces the whole list; null or [] clears it.
sharedWithAllNoWhether every member of the team can see and open this form
resultRedirectNoRedirect after submission (Pro): respondents go straight to a link instead of the result page — after the login / lead gate if the report has one. The per-result links live on report.levels[i].redirectUrl (knowledge / scored quizzes) and report.outcomes[i].redirectUrl (outcome quizzes), set with update_form. Shared result links and return visits still open the result page. Only the keys you pass change.
instantFeedbackNoKnowledge quizzes only (knowledge_quiz). When on, the respondent submits each page on its own and sees whether they were right, the correct answer and the question's explanation; submitted questions lock before they move on, and the last page ends with a "See results" button that finishes the quiz. On by default for newly created knowledge quizzes except level tests (useCase level_test); existing quizzes keep whatever they had. Turns the quiz into a learn-as-you-go challenge; it does reveal answers question by question, so leave it off when the score is used for placement.
searchIndexableNoWhether search engines may list this quiz: true puts it in the sitemap and marks its public pages indexable, false keeps them out of search results (drafts, funnel pages meant only for one audience). New quizzes default to true.
allowPdfDownloadNoLet respondents download their full report as a PDF. Pro only (switching it on is rejected on the Free plan). Takes effect only on gated quizzes (submissionAccess login_to_view_report) because the download is tied to the signed-in respondent.
submissionAccessNopublic = anyone answers and sees the report; login_to_view_report = anyone answers but must sign in to see the report (the default, this is how leads get captured)
reportGateRequireCodeNoOnly applies when submissionAccess is login_to_view_report. false (the default for newly created quizzes) = the respondent only types an email and a name to see this one result — far more people finish, but the address is unverified and they get no account, and since result links do get forwarded, the report is effectively as reachable as public for whoever opens the link first. true = the respondent must confirm an emailed 6-digit code, so every captured lead has a verified address and the respondent gets an account they can return to. Quizzes created before this setting existed read as true.

Output Schema

NameRequiredDescription
slugNoCustom path after this change; null when cleared (back to the random address)
formIdNoThe form that was changed
changedNoWhich settings this call changed
deliveryNoDelivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, defaultCta, hiddenFields, sharedWithAll, searchIndexable }
update_form_translationUpdate form translationA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
titleNoTranslated form title. Plain text.
fieldsNoTranslated questions mirroring the source structure: same codes, translated text. The current draft comes from get_form_translation (or the clone create_form_translation returns) — edit the text in place and send it back. Merging is by code, not position, so a partial list is fine and omitted questions stay untranslated.
formIdYesThe source form UUID
reportNoTranslated report display text, mirroring the stored report that get_form_translation returns — the nested overallAnalysis / dimensionAnalysis / outcomeAnalysis shape, NOT the flattened `report` input of create_form / update_form. Scores, formulas, thresholds and codes always come from the source; only the text keys below are applied. An ai_quiz report needs no translation: the AI writes it in the respondent's language from the source report.aiReport.
bookingNoTranslated copy for the result-page booking block (the block that offers a call). Whether the block shows at all always comes from the source form — this only translates its wording. Omit a key or send it empty to keep falling back to the source text.
feedbackNoTranslated copy for the result-page feedback block. Whether it shows and its answer type always come from the source form — this only translates its wording. Replaced WHOLESALE on every save: pass every key you want translated; omitted or empty keys fall back to the source text. Read the source text and choice codes from feedbackSource in get_form_translation / create_form_translation.
isActiveNoEnable/pause this language version (independent of the form's overall isActive).
languageYesWhich language version to update
systemTextNoTranslated answer-page system copy, as an open key→text map (e.g. { "submitButton": "Absenden", "nextPage": "Weiter" }). Keys are the answer-page copy keys — read the ones already set from get_form_translation, and note that keys the answer page does not know are stored but never rendered. Every key is optional; an empty value falls back to the built-in text for this language.
descriptionNoTranslated form description. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not "- item", <h2> not "## heading".

Output Schema

NameRequiredDescription
formIdNoThe source form
updatedNoWhich parts of the translation this call changed
languageNoLanguage that was saved

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation risk is known; the description adds genuinely new behavioral rules the annotations cannot carry — merge-by-omission semantics, the code-existence validation on fields[], and that isActive=false pauses only this language version. It doesn't warn about wholesale replacement of the feedback block or other overwrite hazards, which would have earned a 5 for a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences with no filler; the merge rule comes before the validation caveat and the isActive note last. The slash-separated parameter list in sentence two is a bit cramped but earns its space by orienting the agent across 10 parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich schema, full annotations, and an output schema, most of the burden is already carried elsewhere, and the description covers the important merge/validation semantics. The notable gap is lifecycle: nothing says whether the language version must pre-exist or how this interacts with create_form_translation, which an agent needs before a destructive save.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the nested property docs already explain fields, report, booking, feedback and systemText in detail. The description's parameter value is the top-level mental model — same-shape-as-get_form_translation plus the omit-to-keep rule — which the schema repeats in several places rather than adds to. Baseline 3 is appropriate when the schema does this much of the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource+scope: "Save translated copy for one language version of a form," which separates it cleanly from update_form (whole form) and from list/get siblings. It stops short of naming create_form_translation or delete_form_translation as the alternatives, so the routing to siblings is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It tells the agent the working mode precisely: mirror the shape returned by get_form_translation, edit text in place, omitted fields keep their current value, and partial translation is allowed. What is missing is an explicit when-not — e.g. that a language version must already exist (or be created via create_form_translation) before this tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
leadIdYesThe lead id (the leadId returned by list_leads)
statusYesThe target status code, must be one of list_lead_settings.statuses[].code

Output Schema

NameRequiredDescription
leadIdNoThe lead that was moved
statusNoStatus code after the move

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses a non-obvious side effect: the change is recorded on the lead's timeline. The annotations only indicate non-read-only behavior, so the description adds useful behavioral context beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and example. The mention of 'tag codes' is slightly tangential for a status-only tool, which prevents a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter mutation with an output schema, this is complete: it states scope, the required lookup call, and the timeline side effect. No essential invocation information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers 100% of parameters, including leadId provenance and that status must be a code from list_lead_settings.statuses[].code. The description reinforces the 'never guess' rule but adds little meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb ('move') plus a clear resource ('one lead of the current team') and outcome ('another follow-up status'), with a concrete example (new → contacted). This distinguishes it from other update tools by scope and entity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete prerequisite: call list_lead_settings first to get valid status codes and never guess. It implies the intended use case clearly, but does not explicitly exclude or route to sibling alternatives like set_lead_tags or assign_leads.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_questionUpdate question
Destructive
Inspect

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.

NameRequiredDescriptionDefault
maxNoNumberField only: new maximum allowed value; pass null to remove the upper bound. Ignored for other question types.
minNoNumberField only: new minimum allowed value; pass null to remove the lower bound. Ignored for other question types.
codeYesQuestion code (field.code), from the get_form / create_form return value
nameNoNew question stem, optional
unitNoNumberField only: new display unit suffix (e.g. "kg"); pass null or an empty string to clear. Ignored for other question types.
itemsNoSwiper block only: replace ALL slides with this list (1-10). Slides get fresh ids, so any translated slide titles / notes for this block have to be rewritten afterwards.
scoreNoScore for this question; 0 or omitted + no correctAnswer means not scored
wordsNoRate only: new scale labels shown under the rating control (up to 5); pass null or [] to remove the labels. Ignored for other question types.
formIdYesThe form ID the question belongs to
aiMatchNoFillBlank AI grading config (knowledge_quiz scene only). Pass an object to enable AI matching (requires the question to have correctAnswer + score > 0); pass null to turn it off and revert to exact-match grading. Omit to leave the existing grading mode untouched.
choicesNoReplace ALL choices of a choice-based question (SingleCheck / MultiCheck / DropDown / Ordering / Cascade; rejected for other types). To keep an existing choice's identity (so past answers still match it) pass its current code from get_form; entries without a code get a new auto-generated code. knowledge_quiz scene: if the existing correctAnswer references a code missing from the new choices, pass a new correctAnswer in the same call. scored_quiz scene: set choices[i].score to rebuild Option Scoring (required if the question currently has Option Scoring). outcome_quiz scene: every choice must carry an outcomes vote list (use [] for a neutral choice).
contentNoStatement block only: the new body text, which is the whole block. Same rich-text rules as description. It cannot be emptied — delete_question the block if you no longer want it. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not "- item", <h2> not "## heading". This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one.
explainNoNew answer explanation (the question's "answer explanation" field, not the question note); pass an empty string to clear. Same rich-text rules as description. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not "- item", <h2> not "## heading".
maxFilesNoAttachment only: how many files a respondent may upload (1-3); pass null to reset to the default 3. Rejected for other question types.
requiredNoWhether the question is required
precisionNoDateField / TimeField only: new picker precision. DateField accepts year | month | day | hour | minute; TimeField accepts only minute | second. Ignored for other question types.
rateStyleNoRate only: new look of the rating control — "star" or "number" (numbered circles); pass null to reset to the default star. Display only, collected ratings are unaffected. Ignored for other question types.
trueLabelNoTrueFalse only: new custom display text for the "true" option; pass an empty string to clear and fall back to the localized default. Ignored for other question types.
falseLabelNoTrueFalse only: new custom display text for the "false" option; pass an empty string to clear and fall back to the localized default. Ignored for other question types.
descriptionNoNew question note; pass an empty string to clear. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not "- item", <h2> not "## heading". This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one.
correctAnswerNoNew correct answer; the shape follows the question type — see the anyOf branches. Choices are referenced by label or code (use the code when the same label repeats), and they must exist in the question's current choices, or in the `choices` replacement passed in this same call. NumberField answers must stay typeable within min / max and decimalPlaces. Rejected for DateField / TimeField / Rate, and in the scored_quiz / outcome_quiz scenes.
decimalPlacesNoNumberField only: new number of decimal places allowed (0 = integers only); pass null to reset to the default 0. Ignored for other question types.

Output Schema

NameRequiredDescription
codeNoThe question that was updated
fieldNoThe question after the merge
formIdNoThe form that was edited
changedNoWhich question attributes this call changed

Tool Schema Changelog

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

  1. 4 tool updates
    • Changedadd_question1 field changed
      • addedInput schema / properties / rateStyle
        Added value: +{
        +  "description": "Same as create_form questions[].rateStyle.",
        +  "enum": [
        +    "star",
        +    "number"
        +  ],
        +  "type": "string"
        +}
    • Changedcreate_form2 fields changed
      • changedInput schema / properties / questions / items / description
        Previous value: -"One question, a page break, or a display block (Statement / Swiper). FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Display blocks collect no answer, are never scored and are allowed in every scene: Statement takes `content` (the rich text IS the block) and Swiper takes `items` (an image carousel); both also accept an optional `name`, a label used by the web editor only, and neither takes any question field. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words`; Attachment takes `kind` (required) / `maxFiles`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`); ai_quiz — nothing is scored: `correctAnswer` / `score` / `aiMatch` / choices[i].score are all rejected; an AI reads the answers and writes the report from report.aiReport. Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField work in scored_quiz and ai_quiz only; the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker; the ai_quiz scene accepts every type except Ordering, plus Attachment (ai_quiz-only via MCP, at most 2 per form)."New value: +"One question, a page break, or a display block (Statement / Swiper). FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Display blocks collect no answer, are never scored and are allowed in every scene: Statement takes `content` (the rich text IS the block) and Swiper takes `items` (an image carousel); both also accept an optional `name`, a label used by the web editor only, and neither takes any question field. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words` / `rateStyle`; Attachment takes `kind` (required) / `maxFiles`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`); ai_quiz — nothing is scored: `correctAnswer` / `score` / `aiMatch` / choices[i].score are all rejected; an AI reads the answers and writes the report from report.aiReport. Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField work in scored_quiz and ai_quiz only; the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker; the ai_quiz scene accepts every type except Ordering, plus Attachment (ai_quiz-only via MCP, at most 2 per form)."
      • addedInput schema / properties / questions / items / properties / rateStyle
        Added value: +{
        +  "description": "Rate only: how the rating control looks — \"star\" (default, a row of stars) or \"number\" (a row of numbered circles 1..steps, reads more like a professional self-assessment scale). Display only: the submitted value is 1..steps either way. Rejected for other question types.",
        +  "enum": [
        +    "star",
        +    "number"
        +  ],
        +  "type": "string"
        +}
    • Changedinsert_question1 field changed
      • addedInput schema / properties / rateStyle
        Added value: +{
        +  "description": "Same as create_form questions[].rateStyle.",
        +  "enum": [
        +    "star",
        +    "number"
        +  ],
        +  "type": "string"
        +}
    • Changedupdate_question1 field changed
      • addedInput schema / properties / rateStyle
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "star",
        +        "number"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Rate only: new look of the rating control — \"star\" or \"number\" (numbered circles); pass null to reset to the default star. Display only, collected ratings are unaffected. Ignored for other question types."
        +}
  2. 2 tool updates
    • Changedget_examinee1 field changed
      • removedOutput schema / properties / status
        Removed value: -{
        -  "description": "Account status",
        -  "type": [
        -    "string",
        -    "null"
        -  ]
        -}
    • Changedlist_examinees2 fields changed
      • removedInput schema / properties / status
        Removed value: -{
        -  "description": "Filter by status, optional",
        -  "enum": [
        -    "active",
        -    "disabled"
        -  ],
        -  "type": "string"
        -}
      • removedOutput schema / properties / items / items / properties / status
        Removed value: -{
        -  "description": "Account status",
        -  "type": [
        -    "string",
        -    "null"
        -  ]
        -}
  3. 1 tool update
    • Changedupdate_form_settings3 fields changed
      • changedInput schema / properties / hideScores / description
        Previous value: -"Hide every score the respondent sees: the result page's overall score (score ring / number / percentile) and every dimension score, the points badge on each question while answering, the score in instant feedback, and the per-question scores in the answer review. Level names, level descriptions, the summary and right / wrong verdicts stay. The team still sees scores in the dashboard. Scenes with scores only (knowledge_quiz / random_knowledge_quiz / scored_quiz). Note the summary template still renders its score variable if one is left in. Off by default."New value: +"Hide every score the respondent sees: the result page's overall score (score ring / number / percentile) and every dimension score, the points badge on each question while answering, the score in instant feedback, and the per-question scores in the answer review. Level names, level descriptions, the summary and right / wrong verdicts stay. The team still sees scores in the dashboard. Scenes with scores only (knowledge_quiz / scored_quiz). Note the summary template still renders its score variable if one is left in. Off by default."
      • changedInput schema / properties / instantFeedback / description
        Previous value: -"Knowledge quizzes only (knowledge_quiz / random_knowledge_quiz). When on, the respondent submits each page on its own and sees whether they were right, the correct answer and the question's explanation; submitted questions lock before they move on, and the last page ends with a \"See results\" button that finishes the quiz. On by default for newly created knowledge quizzes except level tests (useCase level_test); existing quizzes keep whatever they had. Turns the quiz into a learn-as-you-go challenge; it does reveal answers question by question, so leave it off when the score is used for placement."New value: +"Knowledge quizzes only (knowledge_quiz). When on, the respondent submits each page on its own and sees whether they were right, the correct answer and the question's explanation; submitted questions lock before they move on, and the last page ends with a \"See results\" button that finishes the quiz. On by default for newly created knowledge quizzes except level tests (useCase level_test); existing quizzes keep whatever they had. Turns the quiz into a learn-as-you-go challenge; it does reveal answers question by question, so leave it off when the score is used for placement."
      • changedInput schema / properties / timeLimit / description
        Previous value: -"Answer-time countdown. Only knowledge quizzes (knowledge_quiz / random_knowledge_quiz) can turn this on — a countdown makes sense when unanswered means wrong, but rushing a scorecard or a personality quiz just produces careless answers."New value: +"Answer-time countdown. Only knowledge quizzes (knowledge_quiz) can turn this on — a countdown makes sense when unanswered means wrong, but rushing a scorecard or a personality quiz just produces careless answers."
  4. 3 tool updates
    • Changedget_active_tenant1 field changed
      • removedOutput schema / properties / examineeSignupDisabled
        Removed value: -{
        -  "description": "true = respondent self-signup is off for this team, so any quiz that asks for a login turns away respondents who are not on the roster yet",
        -  "type": "boolean"
        -}
    • Changedget_form_share_info1 field changed
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, defaultCta, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, defaultCta, hiddenFields, sharedWithAll, searchIndexable }"
    • Changedupdate_form_settings1 field changed
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, defaultCta, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, defaultCta, hiddenFields, sharedWithAll, searchIndexable }"
  5. 2 tool updates
    • Changedcreate_form1 field changed
      • addedInput schema / properties / report / properties / scoreStyle
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "scale",
        +        "ring",
        +        "gauge",
        +        "steps"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "knowledge_quiz / scored_quiz only: how the result page's overall score card shows the result — scale (a level bar with a marker), ring (a progress ring with the score inside), gauge (a semicircle gauge split by level with a needle) or steps (one bar per level, taller for higher levels). Display only. null (the default) follows the personalized theme: the applied library design's style, or scale when none is applied. Styles that need data the quiz lacks (e.g. steps without levels) fall back to scale."
        +}
    • Changedupdate_form2 fields changed
      • changedInput schema / properties / report / description
        Previous value: -"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate) replaces overallAnalysis, except that an omitted formula keeps the current one (pass formula: \"\" to remove it and fall back to the default sum); passing dimensionAnalysis replaces the dimension list (scored_quiz only; codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); passing sectionOrder replaces the result-page section order ([] restores the default); passing levelOrder sets the level display order (asc / desc, knowledge_quiz / scored_quiz only); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)."New value: +"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate) replaces overallAnalysis, except that an omitted formula keeps the current one (pass formula: \"\" to remove it and fall back to the default sum); passing dimensionAnalysis replaces the dimension list (scored_quiz only; codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); passing sectionOrder replaces the result-page section order ([] restores the default); passing levelOrder sets the level display order (asc / desc, knowledge_quiz / scored_quiz only); passing scoreStyle sets the score card style (scale / ring / gauge / steps, null follows the theme; knowledge_quiz / scored_quiz only); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)."
      • addedInput schema / properties / report / properties / scoreStyle
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "scale",
        +        "ring",
        +        "gauge",
        +        "steps"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "knowledge_quiz / scored_quiz only: how the result page's overall score card shows the result — scale (a level bar with a marker), ring (a progress ring with the score inside), gauge (a semicircle gauge split by level with a needle) or steps (one bar per level, taller for higher levels). Display only. null (the default) follows the personalized theme: the applied library design's style, or scale when none is applied. Styles that need data the quiz lacks (e.g. steps without levels) fall back to scale."
        +}
  6. 2 tool updates
    • Changedcreate_form1 field changed
      • addedInput schema / properties / report / properties / levelOrder
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "asc",
        +        "desc"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "knowledge_quiz / scored_quiz only: display order of the score levels — asc (default, lowest level first) or desc (highest level first). Applies to the overall levels and every dimension's levels, in the editor and on the result page's level scale. Display only: levels are still stored and matched by minScore ascending, so pass report.levels in ascending order either way. null restores asc."
        +}
    • Changedupdate_form2 fields changed
      • changedInput schema / properties / report / description
        Previous value: -"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate) replaces overallAnalysis, except that an omitted formula keeps the current one (pass formula: \"\" to remove it and fall back to the default sum); passing dimensionAnalysis replaces the dimension list (scored_quiz only; codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); passing sectionOrder replaces the result-page section order ([] restores the default); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)."New value: +"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate) replaces overallAnalysis, except that an omitted formula keeps the current one (pass formula: \"\" to remove it and fall back to the default sum); passing dimensionAnalysis replaces the dimension list (scored_quiz only; codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); passing sectionOrder replaces the result-page section order ([] restores the default); passing levelOrder sets the level display order (asc / desc, knowledge_quiz / scored_quiz only); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)."
      • addedInput schema / properties / report / properties / levelOrder
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "asc",
        +        "desc"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "knowledge_quiz / scored_quiz only: display order of the score levels — asc (default, lowest level first) or desc (highest level first). Applies to the overall levels and every dimension's levels, in the editor and on the result page's level scale. Display only: levels are still stored and matched by minScore ascending, so pass report.levels in ascending order either way. null restores asc."
        +}
  7. 2 tool updates
    • Changedcreate_form3 fields changed
      • removedInput schema / properties / report / properties / levels / items / properties / color
        Removed value: -{
        -  "description": "Level color, e.g. #4caf50",
        -  "type": "string"
        -}
      • removedInput schema / properties / report / properties / outcomes / items / properties / color
        Removed value: -{
        -  "description": "Theme color of this outcome, e.g. \"#4caf50\". Optional.",
        -  "maxLength": 30,
        -  "type": "string"
        -}
      • changedInput schema / properties / report / properties / sectionOrder / description
        Previous value: -"Any scene: the order of the movable result-page sections — dimension (dimension breakdown / radar), booking (the Cal.com booking block), feedback (the feedback block). The overall score / outcome always stays on top and the answer review / share area at the bottom. Keys you leave out keep their default relative order after the ones you list; [] restores the default (dimension, booking, feedback). Lead with booking when the quiz exists to book calls."New value: +"Any scene: the order of the movable result-page sections — dimension (dimension breakdown / radar), booking (the Cal.com booking block), feedback (the feedback block). The overall score / outcome always stays on top and the answer review / share area at the bottom. Keys you leave out keep their default relative order after the ones you list; [] restores the default (booking, dimension, feedback)."
    • Changedupdate_form3 fields changed
      • removedInput schema / properties / report / properties / levels / items / properties / color
        Removed value: -{
        -  "description": "Level color, e.g. #4caf50",
        -  "type": "string"
        -}
      • removedInput schema / properties / report / properties / outcomes / items / properties / color
        Removed value: -{
        -  "description": "Theme color of this outcome, e.g. \"#4caf50\". Optional.",
        -  "maxLength": 30,
        -  "type": "string"
        -}
      • changedInput schema / properties / report / properties / sectionOrder / description
        Previous value: -"Any scene: the order of the movable result-page sections — dimension (dimension breakdown / radar), booking (the Cal.com booking block), feedback (the feedback block). The overall score / outcome always stays on top and the answer review / share area at the bottom. Keys you leave out keep their default relative order after the ones you list; [] restores the default (dimension, booking, feedback). Lead with booking when the quiz exists to book calls."New value: +"Any scene: the order of the movable result-page sections — dimension (dimension breakdown / radar), booking (the Cal.com booking block), feedback (the feedback block). The overall score / outcome always stays on top and the answer review / share area at the bottom. Keys you leave out keep their default relative order after the ones you list; [] restores the default (booking, dimension, feedback)."
  8. 3 tool updates
    • Changedget_form_share_info1 field changed
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, defaultCta, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
    • Changedupdate_form_settings2 fields changed
      • addedInput schema / properties / defaultCta
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "label": {
        +          "anyOf": [
        +            {
        +              "maxLength": 100,
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Optional lead-in line shown above the default button"
        +        },
        +        "text": {
        +          "description": "Default button text (give it together with url, or leave both out)",
        +          "maxLength": 30,
        +          "type": "string"
        +        },
        +        "url": {
        +          "description": "Default button link; http/https only",
        +          "maxLength": 2048,
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Result-page CTA buttons. This is the master switch: while it is off no result shows a CTA, not even levels / outcomes / AI result tags that have their own. Passing an object turns it on and replaces the default button (text + url), which every result without its own cta uses — pass {} to turn it on with no default, so only results with their own cta show a button. null turns it off and keeps the copy. Per-result buttons are set with update_form (writing one also turns this on). For AI quizzes the button appears below the AI report. Free on every plan."
        +}
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, defaultCta, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
    • Changedupdate_form_translation1 field changed
      • addedInput schema / properties / report / properties / cta
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Default CTA (shown for results without a CTA of their own): only the button text is translated.",
        +  "properties": {
        +    "text": {
        +      "description": "Translated default CTA button text.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
  9. 4 tool updates
    • Changedcreate_form2 fields changed
      • addedInput schema / properties / report / properties / levels / items / properties / redirectUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 2048,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "http(s) link respondents are sent to right after submitting when the score falls in this level, instead of seeing the result page. Only takes effect while redirects are switched on (update_form_settings resultRedirect, Pro). In update_form, omit it to keep the link of the current level with the same label; pass \"\" or null to remove it. Overall levels only."
        +}
      • addedInput schema / properties / report / properties / outcomes / items / properties / redirectUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 2048,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "outcome_quiz only: http(s) link respondents are sent to right after submitting when this outcome wins, instead of seeing the result page. Only takes effect while redirects are switched on (update_form_settings resultRedirect, Pro). In update_form, omit it to keep the outcome's current link; pass \"\" or null to remove it. Rejected on ai_quiz result tags."
        +}
    • Changedget_form_share_info1 field changed
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
    • Changedupdate_form2 fields changed
      • addedInput schema / properties / report / properties / levels / items / properties / redirectUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 2048,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "http(s) link respondents are sent to right after submitting when the score falls in this level, instead of seeing the result page. Only takes effect while redirects are switched on (update_form_settings resultRedirect, Pro). In update_form, omit it to keep the link of the current level with the same label; pass \"\" or null to remove it. Overall levels only."
        +}
      • addedInput schema / properties / report / properties / outcomes / items / properties / redirectUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 2048,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "outcome_quiz only: http(s) link respondents are sent to right after submitting when this outcome wins, instead of seeing the result page. Only takes effect while redirects are switched on (update_form_settings resultRedirect, Pro). In update_form, omit it to keep the outcome's current link; pass \"\" or null to remove it. Rejected on ai_quiz result tags."
        +}
    • Changedupdate_form_settings2 fields changed
      • addedInput schema / properties / resultRedirect
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Redirect after submission (Pro): respondents go straight to a link instead of the result page — after the login / lead gate if the report has one. The per-result links live on report.levels[i].redirectUrl (knowledge / scored quizzes) and report.outcomes[i].redirectUrl (outcome quizzes), set with update_form. Shared result links and return visits still open the result page. Only the keys you pass change.",
        +  "properties": {
        +    "appendParams": {
        +      "description": "Append score, level, outcome and outcome_name plus the quiz's hidden fields and UTM tags to the link (never emails or other personal details; parameters already in the link are kept).",
        +      "type": "boolean"
        +    },
        +    "defaultUrl": {
        +      "anyOf": [
        +        {
        +          "maxLength": 2048,
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "http(s) fallback link for respondents whose matched level / outcome has no redirectUrl of its own; \"\" or null removes it, and then those respondents see the result page."
        +    },
        +    "enabled": {
        +      "description": "Master switch. Pro only (switching it on is rejected on the Free plan). Not available for ai_quiz.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, resultRedirect, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
  10. 1 tool update
    • Changedcreate_form2 fields changed
      • changedInput schema / properties / language / default
        Previous value: -"zh_CN"New value: +"en_US"
      • changedInput schema / properties / language / description
        Previous value: -"Default zh_CN"New value: +"Default en_US"
  11. 4 tool updates
    • Changedget_form_share_info1 field changed
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, gaTrackingId, tracking, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
    • Removedupdate_examinee
    • Changedupdate_form_settings3 fields changed
      • removedInput schema / properties / gaTrackingId
        Removed value: -{
        -  "description": "Google Analytics measurement id (G-XXXXXX) or Universal Analytics id (UA-XXXX-Y). Pass an empty string to clear.",
        -  "type": "string"
        -}
      • removedInput schema / properties / tracking
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": false,
        -      "properties": {
        -        "gtmContainerId": {
        -          "description": "Google Tag Manager container id (GTM-XXXX); only loaded on the team's custom domain",
        -          "type": "string"
        -        },
        -        "includeResultData": {
        -          "description": "Whether conversion events carry the outcome / level / score (default true). Turn off for sensitive topics such as health or finance.",
        -          "type": "boolean"
        -        },
        -        "linkedinConversionIds": {
        -          "additionalProperties": false,
        -          "description": "LinkedIn conversion ids created in Campaign Manager, one per event (quiz start, lead captured, quiz completed, result CTA click, booking)",
        -          "properties": {
        -            "booking": {
        -              "type": "string"
        -            },
        -            "complete": {
        -              "type": "string"
        -            },
        -            "cta": {
        -              "type": "string"
        -            },
        -            "lead": {
        -              "type": "string"
        -            },
        -            "start": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "linkedinPartnerId": {
        -          "description": "LinkedIn Insight Tag partner id",
        -          "type": "string"
        -        },
        -        "metaPixelId": {
        -          "description": "Meta Pixel ID, 15-16 digits",
        -          "type": "string"
        -        },
        -        "mode": {
        -          "description": "inherit (default) uses the team's pixels, custom uses only the ids given here, off loads no pixel on this quiz",
        -          "enum": [
        -            "inherit",
        -            "custom",
        -            "off"
        -          ],
        -          "type": "string"
        -        },
        -        "tiktokPixelId": {
        -          "description": "TikTok Pixel code, uppercase letters and digits",
        -          "type": "string"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Ad tracking pixels for this quiz (Pro). Replaces the whole group; null clears it back to inheriting the team. Fires standard conversion events (quiz start, lead, completion, CTA click, booking) so ad platforms can optimise on them."
        -}
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, gaTrackingId, tracking, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
    • Removedupdate_tenant_slug
  12. 3 tool updates
    • Changedcreate_form4 fields changed
      • addedInput schema / properties / report / properties / levels / items / properties / description / description
        Added value: +"Result-page text shown when the score falls in this level. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • removedInput schema / properties / report / properties / suggestionsTemplate
        Removed value: -{
        -  "description": "Suggestions template; same rich-text rules as summaryTemplate. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\".",
        -  "maxLength": 5000,
        -  "type": "string"
        -}
      • changedInput schema / properties / report / properties / summaryTemplate / description
        Previous value: -"Summary template. Allows description-scope rich text (headings/lists/links/images/<span> etc.). Supports math formulas: write `<span data-type=\"math-formula\" data-latex=\"x^2+1\"></span>`, rendered by KaTeX on the frontend. Supports variable placeholders `<art-field data-type=\"fieldVariable\" data-cid=\"score\"></art-field>` (cid can be score / level / a question code). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Summary template. Allows description-scope rich text (headings/lists/links/images/<span> etc.). Supports math formulas: write `<span data-type=\"math-formula\" data-latex=\"x^2+1\"></span>` with the LaTeX in data-latex and nothing inside; the server renders it. Two variables are available: write {{score}} (the overall score) and {{level}} (the matched level label); they are stored as `<art-field data-type=\"fieldVariable\" data-cid=\"score\"></art-field>`. Any other variable is rejected. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
      • changedInput schema / properties / title / description
        Previous value: -"Form title (1-200 characters)"New value: +"Form title (1-200 characters). Plain text: no HTML or Markdown."
    • Changedupdate_form4 fields changed
      • changedInput schema / properties / report / description
        Previous value: -"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate/suggestionsTemplate) replaces overallAnalysis, except that an omitted formula keeps the current one (pass formula: \"\" to remove it and fall back to the default sum); passing dimensionAnalysis replaces the dimension list (scored_quiz only; codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); passing sectionOrder replaces the result-page section order ([] restores the default); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)."New value: +"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate) replaces overallAnalysis, except that an omitted formula keeps the current one (pass formula: \"\" to remove it and fall back to the default sum); passing dimensionAnalysis replaces the dimension list (scored_quiz only; codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); passing sectionOrder replaces the result-page section order ([] restores the default); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)."
      • addedInput schema / properties / report / properties / levels / items / properties / description / description
        Added value: +"Result-page text shown when the score falls in this level. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • removedInput schema / properties / report / properties / suggestionsTemplate
        Removed value: -{
        -  "description": "Suggestions template; same rich-text rules as summaryTemplate. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\".",
        -  "maxLength": 5000,
        -  "type": "string"
        -}
      • changedInput schema / properties / report / properties / summaryTemplate / description
        Previous value: -"Summary template. Allows description-scope rich text (headings/lists/links/images/<span> etc.). Supports math formulas: write `<span data-type=\"math-formula\" data-latex=\"x^2+1\"></span>`, rendered by KaTeX on the frontend. Supports variable placeholders `<art-field data-type=\"fieldVariable\" data-cid=\"score\"></art-field>` (cid can be score / level / a question code). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Summary template. Allows description-scope rich text (headings/lists/links/images/<span> etc.). Supports math formulas: write `<span data-type=\"math-formula\" data-latex=\"x^2+1\"></span>` with the LaTeX in data-latex and nothing inside; the server renders it. Two variables are available: write {{score}} (the overall score) and {{level}} (the matched level label); they are stored as `<art-field data-type=\"fieldVariable\" data-cid=\"score\"></art-field>`. Any other variable is rejected. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
    • Changedupdate_form_translation4 fields changed
      • changedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / levels / items / properties / description / description
        Previous value: -"Translated level description."New value: +"Translated level description. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / report / properties / overallAnalysis / properties / levels / items / properties / description / description
        Previous value: -"Translated level description."New value: +"Translated level description. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • removedInput schema / properties / report / properties / overallAnalysis / properties / suggestionsTemplate
        Removed value: -{
        -  "description": "Translated suggestions template (keep the placeholders intact). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\".",
        -  "type": "string"
        -}
      • changedInput schema / properties / title / description
        Previous value: -"Translated form title"New value: +"Translated form title. Plain text."
  13. 8 tool updates
    • Changedcreate_form7 fields changed
      • changedInput schema / properties / description / description
        Previous value: -"Optional form description. Allows description-scope rich text (including <img src>). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Optional form description. Allows description-scope rich text (including <img src>). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
      • changedInput schema / properties / questions / items / properties / content / description
        Previous value: -"Statement only, and required there: the text respondents read — an intro, a section lead-in, instructions, a disclaimer. The block renders this and nothing else. Same rich-text rules as `description` (headings / lists / links / <img src> / math formulas). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Statement only, and required there: the text respondents read — an intro, a section lead-in, instructions, a disclaimer. The block renders this and nothing else. Same rich-text rules as `description` (headings / lists / links / <img src> / math formulas). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
      • changedInput schema / properties / questions / items / properties / description / description
        Previous value: -"Optional supplementary note for the question. Allows a wider HTML subset: everything the stem allows + <h1>-<h6> <ul> <ol> <li> <blockquote> <a href> <img src> <hr> <art-field> (variable placeholder, data-type / data-cid); unsafe protocols (javascript:/data:) and unknown attributes are stripped. This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Optional supplementary note for the question. Allows a wider HTML subset: everything the stem allows + <h1>-<h6> <ul> <ol> <li> <blockquote> <a href> <img src> <hr> <art-field> (variable placeholder, data-type / data-cid); unsafe protocols (javascript:/data:) and unknown attributes are stripped. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
      • changedInput schema / properties / questions / items / properties / explain / description
        Previous value: -"Optional answer explanation. The frontend renders it in the question's \"answer explanation\" field (DescriptionEditor); the rich-text rules are identical to description. Do not stuff the answer explanation into description — that is the question's supplementary note and will not be shown as an explanation to respondents/graders."New value: +"Optional answer explanation. The frontend renders it in the question's \"answer explanation\" field (DescriptionEditor); the rich-text rules are identical to description. Do not stuff the answer explanation into description — that is the question's supplementary note and will not be shown as an explanation to respondents/graders. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / report / properties / outcomes / items / properties / description / description
        Previous value: -"Result-page content shown when this outcome wins. Allows description-scope rich text (headings/lists/links/images etc.). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Result-page content shown when this outcome wins. Allows description-scope rich text (headings/lists/links/images etc.). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
      • changedInput schema / properties / report / properties / suggestionsTemplate / description
        Previous value: -"Suggestions template; same rich-text rules as summaryTemplate."New value: +"Suggestions template; same rich-text rules as summaryTemplate. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / report / properties / summaryTemplate / description
        Previous value: -"Summary template. Allows description-scope rich text (headings/lists/links/images/<span> etc.). Supports math formulas: write `<span data-type=\"math-formula\" data-latex=\"x^2+1\"></span>`, rendered by KaTeX on the frontend. Supports variable placeholders `<art-field data-type=\"fieldVariable\" data-cid=\"score\"></art-field>` (cid can be score / level / a question code). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Summary template. Allows description-scope rich text (headings/lists/links/images/<span> etc.). Supports math formulas: write `<span data-type=\"math-formula\" data-latex=\"x^2+1\"></span>`, rendered by KaTeX on the frontend. Supports variable placeholders `<art-field data-type=\"fieldVariable\" data-cid=\"score\"></art-field>` (cid can be score / level / a question code). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
    • Changedget_form_share_info1 field changed
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, gaTrackingId, tracking, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
    • Changedget_record1 field changed
      • changedOutput schema / properties / metadata / description
        Previous value: -"Channel attribution { utmSource, utmMedium, utmCampaign, utmTerm, utmContent, referrer }"New value: +"Channel attribution { utmSource, utmMedium, utmCampaign, utmTerm, utmContent, referrer, params } — params holds the URL parameters (hidden fields) declared on the quiz"
    • Changedlist_records1 field changed
      • changedOutput schema / properties / items / items / properties / metadata / description
        Previous value: -"Channel attribution { utmSource, utmMedium, utmCampaign, utmTerm, utmContent, referrer }"New value: +"Channel attribution { utmSource, utmMedium, utmCampaign, utmTerm, utmContent, referrer, params } — params holds the URL parameters (hidden fields) declared on the quiz"
    • Changedupdate_form4 fields changed
      • changedInput schema / properties / description / description
        Previous value: -"New description; pass an empty string to clear. Allows description-scope rich text (including <img src>). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"New description; pass an empty string to clear. Allows description-scope rich text (including <img src>). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
      • changedInput schema / properties / report / properties / outcomes / items / properties / description / description
        Previous value: -"Result-page content shown when this outcome wins. Allows description-scope rich text (headings/lists/links/images etc.). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Result-page content shown when this outcome wins. Allows description-scope rich text (headings/lists/links/images etc.). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
      • changedInput schema / properties / report / properties / suggestionsTemplate / description
        Previous value: -"Suggestions template; same rich-text rules as summaryTemplate."New value: +"Suggestions template; same rich-text rules as summaryTemplate. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / report / properties / summaryTemplate / description
        Previous value: -"Summary template. Allows description-scope rich text (headings/lists/links/images/<span> etc.). Supports math formulas: write `<span data-type=\"math-formula\" data-latex=\"x^2+1\"></span>`, rendered by KaTeX on the frontend. Supports variable placeholders `<art-field data-type=\"fieldVariable\" data-cid=\"score\"></art-field>` (cid can be score / level / a question code). This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Summary template. Allows description-scope rich text (headings/lists/links/images/<span> etc.). Supports math formulas: write `<span data-type=\"math-formula\" data-latex=\"x^2+1\"></span>`, rendered by KaTeX on the frontend. Supports variable placeholders `<art-field data-type=\"fieldVariable\" data-cid=\"score\"></art-field>` (cid can be score / level / a question code). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
    • Changedupdate_form_settings6 fields changed
      • changedInput schema / properties / answerSheet / description
        Previous value: -"The answer-sheet sidebar on the answering page: a question navigator that lets respondents jump to any question. Off by default — most quizzes are meant to be answered straight through to the result page; turn it on for long knowledge quizzes."New value: +"The answer-sheet sidebar on the answering page: a question navigator that lets respondents jump to any question. On by default for newly created forms; turn it off for short quizzes meant to be answered straight through to the result page."
      • changedInput schema / properties / booking / properties / description / description
        Previous value: -"Block copy. Plain text or HTML (<p>, <strong>, <em>, <u>, <s>, <a href>, <ul>/<ol>/<li>); no images or video; at most 500 visible characters."New value: +"Block copy. Plain text or HTML (<p>, <strong>, <em>, <u>, <s>, <a href>, <ul>/<ol>/<li>), never Markdown; no images or video; at most 500 visible characters."
      • changedInput schema / properties / feedback / properties / description / description
        Previous value: -"Block copy; empty = built-in default. Plain text or HTML (<p>, <strong>, <em>, <u>, <s>, <a href>, <ul>/<ol>/<li>); no images or video; at most 500 visible characters."New value: +"Block copy; empty = built-in default. Plain text or HTML (<p>, <strong>, <em>, <u>, <s>, <a href>, <ul>/<ol>/<li>), never Markdown; no images or video; at most 500 visible characters."
      • addedInput schema / properties / hiddenFields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "pattern": "^[a-z][a-z0-9_]{0,31}$",
        +        "type": "string"
        +      },
        +      "maxItems": 10,
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "URL parameters to capture with each response (hidden fields), e.g. [\"partner\", \"campaign_id\"]: opening the quiz link with ?partner=acme stores partner=acme on the record, where it shows in record detail, exports and webhook / Zapier payloads. Lowercase names, up to 10; utm_* and system names (email, name, lang, ref, embed…) are reserved. Replaces the whole list; null or [] clears it."
        +}
      • addedInput schema / properties / tracking
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "gtmContainerId": {
        +          "description": "Google Tag Manager container id (GTM-XXXX); only loaded on the team's custom domain",
        +          "type": "string"
        +        },
        +        "includeResultData": {
        +          "description": "Whether conversion events carry the outcome / level / score (default true). Turn off for sensitive topics such as health or finance.",
        +          "type": "boolean"
        +        },
        +        "linkedinConversionIds": {
        +          "additionalProperties": false,
        +          "description": "LinkedIn conversion ids created in Campaign Manager, one per event (quiz start, lead captured, quiz completed, result CTA click, booking)",
        +          "properties": {
        +            "booking": {
        +              "type": "string"
        +            },
        +            "complete": {
        +              "type": "string"
        +            },
        +            "cta": {
        +              "type": "string"
        +            },
        +            "lead": {
        +              "type": "string"
        +            },
        +            "start": {
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "linkedinPartnerId": {
        +          "description": "LinkedIn Insight Tag partner id",
        +          "type": "string"
        +        },
        +        "metaPixelId": {
        +          "description": "Meta Pixel ID, 15-16 digits",
        +          "type": "string"
        +        },
        +        "mode": {
        +          "description": "inherit (default) uses the team's pixels, custom uses only the ids given here, off loads no pixel on this quiz",
        +          "enum": [
        +            "inherit",
        +            "custom",
        +            "off"
        +          ],
        +          "type": "string"
        +        },
        +        "tiktokPixelId": {
        +          "description": "TikTok Pixel code, uppercase letters and digits",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Ad tracking pixels for this quiz (Pro). Replaces the whole group; null clears it back to inheriting the team. Fires standard conversion events (quiz start, lead, completion, CTA click, booking) so ad platforms can optimise on them."
        +}
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, gaTrackingId, tracking, hiddenFields, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
    • Changedupdate_form_translation9 fields changed
      • changedInput schema / properties / booking / properties / description / description
        Previous value: -"Translated booking block description. Plain text or HTML (<p>, <strong>, <em>, <u>, <s>, <a href>, <ul>/<ol>/<li>); no images or video; at most 500 visible characters."New value: +"Translated booking block description. Plain text or HTML (<p>, <strong>, <em>, <u>, <s>, <a href>, <ul>/<ol>/<li>), never Markdown; no images or video; at most 500 visible characters."
      • changedInput schema / properties / description / description
        Previous value: -"Translated form description"New value: +"Translated form description. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / feedback / properties / description / description
        Previous value: -"Translated block description. Plain text or HTML (<p>, <strong>, <em>, <u>, <s>, <a href>, <ul>/<ol>/<li>); no images or video; at most 500 visible characters."New value: +"Translated block description. Plain text or HTML (<p>, <strong>, <em>, <u>, <s>, <a href>, <ul>/<ol>/<li>), never Markdown; no images or video; at most 500 visible characters."
      • changedInput schema / properties / fields / items / properties / content / description
        Previous value: -"Statement-style blocks: translated body text."New value: +"Statement-style blocks: translated body text. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / fields / items / properties / description / description
        Previous value: -"Translated question note."New value: +"Translated question note. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / fields / items / properties / explain / description
        Previous value: -"Knowledge quiz: translated answer explanation shown in the answer review."New value: +"Knowledge quiz: translated answer explanation shown in the answer review. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / report / properties / outcomeAnalysis / properties / outcomes / items / properties / description / description
        Previous value: -"Translated outcome result-page content."New value: +"Translated outcome result-page content. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / report / properties / overallAnalysis / properties / suggestionsTemplate / description
        Previous value: -"Translated suggestions template (keep the placeholders intact)."New value: +"Translated suggestions template (keep the placeholders intact). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
      • changedInput schema / properties / report / properties / overallAnalysis / properties / summaryTemplate / description
        Previous value: -"Translated summary template (keep the placeholders intact)."New value: +"Translated summary template (keep the placeholders intact). Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
    • Changedupdate_question3 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"Statement block only: the new body text, which is the whole block. Same rich-text rules as description. It cannot be emptied — delete_question the block if you no longer want it. This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"Statement block only: the new body text, which is the whole block. Same rich-text rules as description. It cannot be emptied — delete_question the block if you no longer want it. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
      • changedInput schema / properties / description / description
        Previous value: -"New question note; pass an empty string to clear. This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."New value: +"New question note; pass an empty string to clear. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\". This field also accepts an inline image: put an <img src=\"...\"> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one."
      • changedInput schema / properties / explain / description
        Previous value: -"New answer explanation (the question's \"answer explanation\" field, not the question note); pass an empty string to clear. Same rich-text rules as description."New value: +"New answer explanation (the question's \"answer explanation\" field, not the question note); pass an empty string to clear. Same rich-text rules as description. Write HTML, never Markdown: <strong>bold</strong> not **bold**, <ul><li> not \"- item\", <h2> not \"## heading\"."
  14. 2 tool updates
    • Changedcreate_form1 field changed
      • changedInput schema / properties / report / properties / aiReport / properties / length / description
        Previous value: -"Report length: brief (about 150 words, verdict + 1-2 findings + next steps), standard (default, about 300 words, 2-4 sections, one chart) or detailed (about 650 words, up to 6 sections and 3 charts). null restores standard. A length rule written in style takes precedence."New value: +"Report length: brief (about 150 words, verdict + 1-2 findings + next steps), standard (default, about 300 words, 2-4 sections, one chart) or detailed (about 650 words, up to 6 sections and 3 charts). null restores standard. brief and standard are hard caps: a longer word count, more sections or more detail asked for in instructions or style is ignored. Only detailed lets a length rule written in style take precedence."
    • Changedupdate_form1 field changed
      • changedInput schema / properties / report / properties / aiReport / properties / length / description
        Previous value: -"Report length: brief (about 150 words, verdict + 1-2 findings + next steps), standard (default, about 300 words, 2-4 sections, one chart) or detailed (about 650 words, up to 6 sections and 3 charts). null restores standard. A length rule written in style takes precedence."New value: +"Report length: brief (about 150 words, verdict + 1-2 findings + next steps), standard (default, about 300 words, 2-4 sections, one chart) or detailed (about 650 words, up to 6 sections and 3 charts). null restores standard. brief and standard are hard caps: a longer word count, more sections or more detail asked for in instructions or style is ignored. Only detailed lets a length rule written in style take precedence."
  15. 2 tool updates
    • Changedget_form_stats5 fields changed
      • changedInput schema / properties / days / description
        Previous value: -"Look-back window in days, default 30, max 180"New value: +"Length of the daily trend in days, default 30, max 180. Does not filter the other blocks."
      • changedOutput schema / properties / answerDistributions / description
        Previous value: -"Per-question answer distribution (choice-style questions only)"New value: +"All-time answer distribution of the first 10 SingleCheck / DropDown / Rate / TrueFalse questions"
      • addedOutput schema / properties / answerDistributions / items / properties / items / items / properties / label
        Added value: +{
        +  "description": "Choice text for that value; absent when the value is not a choice code (Rate / TrueFalse)",
        +  "type": "string"
        +}
      • changedOutput schema / properties / answerDistributions / items / properties / items / items / properties / value / description
        Previous value: -"Answer value"New value: +"Stored answer value (a choice code for choice questions)"
      • changedOutput schema / properties / days / description
        Previous value: -"Look-back window actually used"New value: +"Length of the daily trend actually used (other blocks are all-time)"
    • Changedget_record1 field changed
      • changedOutput schema / properties / reportResult / description
        Previous value: -"The complete frozen report { status, overallAnalysis, dimensionAnalysis, outcome, aiEvaluation }"New value: +"The sanitized report { status, errorCode, overallAnalysis, dimensionAnalysis, outcome, aiReport, aiEvaluation }; excludes internal diagnostics"
  16. 1 tool update
    • Changedupdate_form_settings1 field changed
      • changedInput schema / properties / answerSheet / description
        Previous value: -"The answer-sheet sidebar on the answering page"New value: +"The answer-sheet sidebar on the answering page: a question navigator that lets respondents jump to any question. Off by default — most quizzes are meant to be answered straight through to the result page; turn it on for long knowledge quizzes."
  17. 1 tool update
    • Changedupdate_form_settings3 fields changed
      • changedInput schema / properties / allowPdfDownload / description
        Previous value: -"Let respondents download their full report as a PDF. Pro only (switching it on is rejected on the Free plan). Takes effect only on gated quizzes — submissionAccess login_to_view_report or examinee_only — because the download is tied to the signed-in respondent."New value: +"Let respondents download their full report as a PDF. Pro only (switching it on is rejected on the Free plan). Takes effect only on gated quizzes (submissionAccess login_to_view_report) because the download is tied to the signed-in respondent."
      • changedInput schema / properties / submissionAccess / description
        Previous value: -"public = anyone answers and sees the report; login_to_view_report = anyone answers but must sign in to see the report (the default, this is how leads get captured); examinee_only = a login is required before answering at all"New value: +"public = anyone answers and sees the report; login_to_view_report = anyone answers but must sign in to see the report (the default, this is how leads get captured)"
      • changedInput schema / properties / submissionAccess / enum
        Previous value: -[
        -  "public",
        -  "login_to_view_report",
        -  "examinee_only"
        -]New value: +[
        +  "public",
        +  "login_to_view_report"
        +]
  18. 3 tool updates
    • Changedcreate_form1 field changed
      • addedInput schema / properties / report / properties / aiReport / properties / length
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "brief",
        +        "standard",
        +        "detailed"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Report length: brief (about 150 words, verdict + 1-2 findings + next steps), standard (default, about 300 words, 2-4 sections, one chart) or detailed (about 650 words, up to 6 sections and 3 charts). null restores standard. A length rule written in style takes precedence."
        +}
    • Changedupdate_form1 field changed
      • addedInput schema / properties / report / properties / aiReport / properties / length
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "brief",
        +        "standard",
        +        "detailed"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Report length: brief (about 150 words, verdict + 1-2 findings + next steps), standard (default, about 300 words, 2-4 sections, one chart) or detailed (about 650 words, up to 6 sections and 3 charts). null restores standard. A length rule written in style takes precedence."
        +}
    • Changedupdate_form_settings1 field changed
      • changedInput schema / properties / instantFeedback / description
        Previous value: -"Knowledge quizzes only (knowledge_quiz / random_knowledge_quiz). When on, the respondent submits each page on its own and sees whether they were right, the correct answer and the question's explanation; submitted questions lock before they move on, and the last page ends with a \"See results\" button that finishes the quiz. Off by default. Turns the quiz into a learn-as-you-go challenge; it does reveal answers question by question, so leave it off when the score is used for placement."New value: +"Knowledge quizzes only (knowledge_quiz / random_knowledge_quiz). When on, the respondent submits each page on its own and sees whether they were right, the correct answer and the question's explanation; submitted questions lock before they move on, and the last page ends with a \"See results\" button that finishes the quiz. On by default for newly created knowledge quizzes except level tests (useCase level_test); existing quizzes keep whatever they had. Turns the quiz into a learn-as-you-go challenge; it does reveal answers question by question, so leave it off when the score is used for placement."
  19. 4 tool updates
    • Changedcreate_form1 field changed
      • removedInput schema / properties / report / properties / hideOverallScore
        Removed value: -{
        -  "description": "Hide scores on the result page: the overall score (score ring / number / percentile) AND every dimension score (score / max score / progress bar / score rate) are hidden together, keeping level names, level descriptions, the level ladder, dimension levels and the summary. Note the summary template still renders its score variable if you left one in. Scored scenes only (ignored for outcome). Default false.",
        -  "type": "boolean"
        -}
    • Changedget_form_share_info1 field changed
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
    • Changedupdate_form2 fields changed
      • changedInput schema / properties / report / description
        Previous value: -"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate/suggestionsTemplate/hideOverallScore) replaces overallAnalysis, except that an omitted formula keeps the current one (pass formula: \"\" to remove it and fall back to the default sum); passing dimensionAnalysis replaces the dimension list (scored_quiz only; codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); passing sectionOrder replaces the result-page section order ([] restores the default); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)."New value: +"Report configuration, merged by sub-key into form.report: passing overallAnalysis fields (title/formula/levels/summaryTemplate/suggestionsTemplate) replaces overallAnalysis, except that an omitted formula keeps the current one (pass formula: \"\" to remove it and fall back to the default sum); passing dimensionAnalysis replaces the dimension list (scored_quiz only; codes are kept by code or by name, omitted title / radar settings are preserved; an empty dimensions array clears it; a dimension still referenced by a question's dimensionScores or by report.formula cannot be removed); in the outcome_quiz scene passing outcomes replaces the outcome list (matched by code, existing images kept; cannot be emptied, and removing an outcome still referenced by question votes is rejected); passing sectionOrder replaces the result-page section order ([] restores the default); unspecified parts are kept. Common usage: either set custom question codes in create_form and pass report.formula / dimensionAnalysis in the same call, or call create_form first to get the auto-generated field codes, then update_form to fill in report.formula and/or dimensionAnalysis (which reference question codes)."
      • removedInput schema / properties / report / properties / hideOverallScore
        Removed value: -{
        -  "description": "Hide scores on the result page: the overall score (score ring / number / percentile) AND every dimension score (score / max score / progress bar / score rate) are hidden together, keeping level names, level descriptions, the level ladder, dimension levels and the summary. Note the summary template still renders its score variable if you left one in. Scored scenes only (ignored for outcome). Default false.",
        -  "type": "boolean"
        -}
    • Changedupdate_form_settings2 fields changed
      • addedInput schema / properties / hideScores
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Hide every score the respondent sees: the result page's overall score (score ring / number / percentile) and every dimension score, the points badge on each question while answering, the score in instant feedback, and the per-question scores in the answer review. Level names, level descriptions, the summary and right / wrong verdicts stay. The team still sees scores in the dashboard. Scenes with scores only (knowledge_quiz / random_knowledge_quiz / scored_quiz). Note the summary template still renders its score variable if one is left in. Off by default.",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "enabled"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, hideScores, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
  20. 2 tool updates
    • Changedget_form_share_info1 field changed
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"
    • Changedupdate_form_settings2 fields changed
      • addedInput schema / properties / instantFeedback
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Knowledge quizzes only (knowledge_quiz / random_knowledge_quiz). When on, the respondent submits each page on its own and sees whether they were right, the correct answer and the question's explanation; submitted questions lock before they move on, and the last page ends with a \"See results\" button that finishes the quiz. Off by default. Turns the quiz into a learn-as-you-go challenge; it does reveal answers question by question, so leave it off when the score is used for placement.",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "enabled"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / delivery / description
        Previous value: -"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"New value: +"Delivery state: { isActive, submissionAccess, reportGateRequireCode, timeLimit, sharing, answerSheet, crowdCompare, instantFeedback, booking, feedback, allowPdfDownload, gaTrackingId, sharedWithAll, searchIndexable }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)"

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Remote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    23 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources