Skip to main content
Glama

RooQuiz

Server Details

Create and manage quizzes, leads, and respondents on RooQuiz, a lead-capture assessment platform.

Ownership verified
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

Available Tools

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

ParametersJSON Schema
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

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

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing team-only visibility, the 2000-character limit, optional recordId context, and the non-idempotent behavior with timeout risk and duplicate-creation potential. This gives the agent critical operational knowledge that the annotations do not cover.

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 deliver the core purpose, visibility scope, constraints, an alternative retrieval path, and idempotency warning without filler. The most important operational warning (non-idempotency) is clearly highlighted at the end and the content is front-loaded.

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 write operation with three parameters and detailed annotations, this description is complete. It covers what the note is, who can see it, how long it can be, how to optionally link a record, where to read existing notes, and how to handle retries safely. No essential guidance 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?

The schema already documents all three parameters fully, so the baseline is 3. The description adds contextual meaning for recordId ('as context') and explicitly restates the character limit, adding a bit of purpose beyond the schema definitions. Still, the schema does the heavy lifting, so this is not a 5.

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 names the exact action ('Write an internal follow-up note') and the specific resource ('a lead of the current team'), and adds the meaningful scope of being visible only to team members, never to the respondent. This distinguishes the tool clearly from other lead-related or comment-related tools in the sibling list.

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 clearly communicates the intended audience and context, and points the agent to retrieve existing notes using get_lead(includeComments: true). It lacks an explicit 'use this tool when... not when...' statement, but the internal-vs-respondent distinction and the retry warning effectively convey appropriate and inappropriate use.

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

add_questionAInspect

Append an item to the end of a form. type is a question type, Breaker (page break — only formId + type are needed, other fields are ignored) or a display block (Statement / Swiper). Question types: SingleCheck / MultiCheck / TrueFalse; FillBlank (free text — scored in quiz via correctAnswer, an unscored data-collection field in scored_quiz); DropDown (single or multiple via multiple — prefer it over SingleCheck/MultiCheck past 20 choices); Cascade (hierarchical via choices[i].children, scored_quiz only); Ordering (quiz only, order-sensitive grading); DateField / TimeField (unscored data-collection fields, scored_quiz only, no correctAnswer/score); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the submitted 1..steps rating is the question score unless per-star scores are set in the web app). Display blocks carry no answer: { type: "Statement", content } renders a rich-text passage (intro, section lead-in, disclaimer) and { type: "Swiper", items } an image carousel; both work in every scene. Configure random_knowledge_quiz question banks in the web app. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxNoNumberField only: maximum allowed input value (must be >= min). Rejected for other question types.
minNoNumberField only: minimum allowed input value (respondents cannot submit a smaller number). Rejected for other question types.
codeNoOptional stable identifier for this question (field code). Omit it to let the server auto-generate one. Set a meaningful code (e.g. "q1") when report.formula or a dimension needs to reference this question, so you can write the formula as `{{q1}}` in the same call instead of round-tripping via get_form. Rules: start with a letter or underscore, then only letters/digits/underscores (no hyphens, spaces, or leading digit), at most 64 chars, and not a reserved math word (e, E, pi, PI, tau, phi, i, Infinity, NaN, true, false, null, undefined). Must be unique among all items in the form.
nameNoQuestion stem text. Allows plain text or restricted HTML (tag allowlist: <p> <strong>/<b> <em>/<i> <u> <s> <mark> <span> <sup> <sub> <br>; other tags are stripped and the text kept).
typeYesQuestion type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer
unitNoNumberField only: display unit suffix shown after the input, e.g. "kg" / "$" / "min". Rejected for other question types.
itemsNoSwiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type.
scoreNoPoints this question is worth, default 0 (not scored). Quiz scene: awarded when the answer matches correctAnswer, and a positive value is required once correctAnswer is set. Scored Quiz scene: pairing it with correctAnswer enables the fallback mode above, but choices[i].score is more flexible. Rejected in the outcome_quiz scene, for DateField / TimeField / Rate, and — in the scored_quiz scene — for NumberField (where the submitted number itself is the score) and FillBlank (collected only, never scored).
stepsNoRate only: number of rating steps, i.e. the highest rating (3-10, default 5). In the scored_quiz scene the submitted rating value (1..steps) is the question score, unless a per-star score is configured in the web app. Rejected for other question types.
wordsNoRate only: optional scale labels evenly distributed under the rating control, e.g. ["Poor", "Excellent"] for the two endpoints (up to 5 labels). Rejected for other question types.
formIdYesThe form ID to append the item to
aiMatchNoOnly for FillBlank in the knowledge_quiz scene. Enables AI grading: the AI compares the respondent answer against correctAnswer and scores by accuracy, instead of requiring an exact string match. Requires correctAnswer (the standard answer) and score > 0 (the score earned when accuracy reaches the threshold). Pass an empty object {} to enable with default settings; omit for plain exact-match grading.
choicesNoChoice-based questions only (SingleCheck / MultiCheck / DropDown / Ordering / Cascade), where it is required; ignored for every other type, including TrueFalse — its two options come from trueLabel / falseLabel. Per-type limits: SingleCheck / MultiCheck 2-20 items — for a longer list use DropDown (2-100 items) instead; Ordering 2-10 items; Cascade nests via choices[i].children (up to 3 levels, at most 100 nodes in total). IMPORTANT (knowledge_quiz scene): vary the position of the correct option(s) across questions — do NOT always place the correct answer first. Distribute correct answers roughly evenly over all positions so they are not predictable.
contentNoStatement 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.
explainNoOptional 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.
shuffleNoOrdering only: shuffle the displayed choice order for each respondent. Defaults to true for MCP-created questions — the stored choices order would otherwise leak the correct order when correctAnswer matches it. Pass false only when the initial order is intentionally meaningful. Rejected for other question types.
multipleNoDropDown only: allow selecting multiple options (default false = single select). Affects the quiz-scene correctAnswer shape: an array of labels/codes when true, a single one when false. Rejected for other question types (SingleCheck/MultiCheck are inherently single/multi).
requiredNoWhether the question is required, default false
precisionNoDateField / TimeField only: picker precision. DateField accepts year | month | day | hour | minute | second (default day; e.g. "month" shows a year-month picker, "second" a full datetime picker). TimeField accepts only minute | second (default minute). Ignored for other question types.
trueLabelNoTrueFalse only: custom display text for the "true" option (e.g. "Yes" / "Agree"). Ignored for other question types. Leave empty to fall back to the built-in default for the form language ("Correct" in English forms). Does not change the stored answer value, which stays "true".
falseLabelNoTrueFalse only: custom display text for the "false" option (e.g. "No" / "Disagree"). Ignored for other question types. Leave empty to fall back to the built-in default for the form language ("Incorrect" in English forms). Does not change the stored answer value, which stays "false".
descriptionNoOptional 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.
trueOutcomesNoOutcome scene + TrueFalse only (required there together with falseOutcomes): the outcome codes that answering "true" votes for. Use [] for a side that votes for nothing. Rejected for other question types / scenes.
correctAnswerNoThe "correct answer" of the knowledge_quiz scene; setting it makes the question scored, so pair it with a positive `score`. The shape follows the question type — see the anyOf branches; a choice is referenced by its label or its code, so reference it by code whenever the same label appears more than once (Ordering rejects an ambiguous label outright). Required on SingleCheck / MultiCheck / DropDown / Ordering in the knowledge_quiz scene, optional on FillBlank / NumberField there. NumberField answers must be typeable within min / max and decimalPlaces. Rejected for DateField / TimeField / Rate (data-collection and rating fields; configure date/time scoring in the web app), rejected for FillBlank in the scored_quiz scene (free text is collected only there), and rejected in the outcome_quiz scene (no right or wrong answers there). In the scored_quiz scene prefer choices[i].score per option; passing correctAnswer + score there only falls back to "the matching choice gets score, others get 0".
decimalPlacesNoNumberField only: how many decimal places respondents may enter (stored as the field's numeric precision), default 0 = integers only. Rejected for other question types. Note this is different from the string `precision` of DateField / TimeField.
falseOutcomesNoOutcome scene + TrueFalse only (required there together with trueOutcomes): the outcome codes that answering "false" votes for. Use [] for a side that votes for nothing. Rejected for other question types / scenes.
trueDimensionScoresNoscored_quiz scene + TrueFalse only: the points answering "true" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.
falseDimensionScoresNoscored_quiz scene + TrueFalse only: the points answering "false" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fieldNoThe created question, including its generated code
formIdNoThe form that was edited
itemCountNoQuestion / page-break count after the append

TDQS

A4.3/5.0
Behavior5/5

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

The description explicitly warns that the call is not idempotent: if it times out it may still have succeeded, so retrying blindly can create a duplicate and the agent should check first. It also discloses that fields irrelevant to a given type are ignored or rejected, and that some types are scene-restricted. These behaviors go well beyond the bare readOnlyHint/destructiveHint annotations.

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

Conciseness3/5

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

The description is front-loaded with the core purpose and ends with the critical non-idempotency warning, which is good. However, it is very long and duplicates much of the detailed per-parameter guidance already present in the input schema, so not every sentence earns its place. A tighter scene/type summary would be more concise without losing value.

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 complexity — 14 question types, 4 quiz scenes, 28 parameters, nested objects, and scene-specific scoring rules — the description is remarkably complete. It covers type availability, field applicability, ignored/rejected behavior, and the retry-after-timeout risk. The output schema exists, so not describing return values is acceptable.

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%, and each parameter already has a detailed explanation of meaning, applicability, and rejection rules. The tool description adds helpful summarization and type-selection guidance, but it largely restates what the schema already provides, so the baseline of 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?

The description opens with a specific verb and resource: "Append an item to the end of a form." This clearly distinguishes it from sibling tools like insert_question, move_question, update_question, and delete_question. It also enumerates the supported question types, so an agent can immediately understand the tool's scope.

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 context for when to use the tool: it is for appending an item to the end of a form, and it explains type-specific usage preferences such as preferring DropDown over SingleCheck/MultiCheck past 20 choices. It does not explicitly name alternatives like insert_question for non-end placement or update_question for edits, but the append-to-end semantics make the primary use case unambiguous.

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

assign_leadsAInspect

Assign one or more leads of the current team to a member, or clear the assignee. Pass every lead id in a single call (up to 50) — do not loop one call per lead. The assignee must be an active non-viewer member (see list_lead_settings.assignableMembers); pass "me" for yourself, or omit / null to unassign. Each change is recorded on the lead's timeline, and the assignee gets one aggregated notification for the whole batch.

ParametersJSON Schema
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

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

TDQS

A4.9/5.0
Behavior5/5

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

The description explains important behavioral facets beyond annotations: each change is recorded on the lead timeline, the assignee gets one aggregated notification, and omitting/null clears the assignee. This informs the agent of mutation effects without needing to infer 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?

Each sentence earns its place: purpose, batching instruction, assignee eligibility, unassign behavior, and side effects. It is compact yet complete and well-organized.

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 two-parameter tool with an output schema, the description covers all essential call semantics: what to pass, how to unassign, member constraints, and result behavior. No additional context or inference is necessary for correct invocation.

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 covers 100% of parameters with clear descriptions. The description adds meaningful context above that: leads must belong to the current team, the assignee must be an active non-viewer member, and the batch limit is emphasized.

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 operation ('Assign one or more leads of the current team to a member, or clear the assignee'), making the tool's purpose unmistakable. It is distinct from siblings like set_lead_tags or update_lead.

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 guidance: pass every lead id in a single call up to 50, do not loop, use 'me' for yourself, and omit/null to unassign. It also states the assignee eligibility requirement clearly.

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

create_formAInspect

Create a form in the team this token is bound to. Pass the questions array and report configuration in one call instead of following up with per-question calls. In the outcome_quiz scene report.outcomes is REQUIRED at create time (TrueFalse votes via trueOutcomes/falseOutcomes). 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, then fill in a scored_quiz report.formula (e.g. q_a + q_b) or a report.dimensionAnalysis via update_form / set_dimension_analysis. Creates the primary language only; add other languages with create_form_translation. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.

ParametersJSON Schema
NameRequiredDescriptionDefault
sceneYesquiz=exam, scored_quiz=scored_quiz, outcome=typing quiz (votes decide which outcome type wins)
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)
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, optional for the knowledge_quiz scene). outcome: only the outcomes key is allowed, and it is required at create time.
languageNoDefault zh_CNzh_CN
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 only); Ordering (quiz only, correctAnswer = all choices in the correct order); DateField/TimeField as unscored data-collection fields (scored_quiz only); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the 1..steps rating value is the question score unless per-star scores are set in the web app). 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>). 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

ParametersJSON Schema
NameRequiredDescription
idNoThe new form id
urlNoAdmin edit URL
sceneNoknowledge_quiz / scored_quiz / outcome_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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark openWorldHint=true and destructiveHint=false, and the description adds substantive behavioral context on top: not idempotent (timeout may still succeed, retry can duplicate), creates primary language only, returns question codes in structuredContent, and requires outcomes at create time. This goes well beyond what annotations alone communicate.

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 dense but organized: it front-loads the core verb, then use-case specifics, then retry behavior. Every sentence earns its place and none merely repeats schema text, though it is long enough that a reader must parse carefully. The structure is tight and information-dense, which justifies a 4.

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?

There is a rich output schema and a 100% documented input schema, so the description does not need to restate return values. It covers all the gaps an agent would otherwise hit: when outcomes are required, how to handle codes/formulas across calls, language handling, and the timeout/duplicate caveat. Nothing essential is missing.

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?

Schema description coverage is 100%, so the baseline is 3, but the description adds high-value meaning beyond the schema: it explains the create-time vs follow-up ordering, the requirement that outcome_quiz needs report.outcomes at creation, the interplay between codes and formulas in one call, and the non-idempotency retry rule. It also orients the agent to the returned fields for later update steps.

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 + resource ('Create a form in the team this token is bound to') and distinguishes itself from siblings by clarifying it creates the primary language only (add other languages via create_form_translation). The one-call philosophy is explicit, and it is clearly differentiated from create_form_from_template as a create-from-scratch tool.

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 gives concrete when-to-use guidance: it tells the agent to pass questions and report together in one call instead of following up per question, explains which scene needs outcomes at create time, and routes follow-on work (formula, dimensionAnalysis) to update_form / set_dimension_analysis. It also explicitly warns about a non-idempotent timeout behavior and how to handle it.

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe new form id
urlNoAdmin edit URL
sceneNoknowledge_quiz / scored_quiz / outcome_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.7/5.0
Behavior5/5

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

The description meaningfully extends the annotations (readOnlyHint=false, destructive=false) by detailing cloning scope, title override semantics, and post-creation mutability. Crucially, it discloses non-idempotency and the retry-after-timeout risk with actionable guidance to check before retrying. This is exactly the behavioral context agents need beyond structured 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?

Four sentences, each earning its place: purpose plus template ID source, cloning scope and title override, post-creation workflow, and idempotency warning. Front-loaded with the primary action, then progressively operational details. No filler or repetition yields a tight, high-signal definition.

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 moderate complexity and the presence of an output schema, the description covers everything needed to invoke it correctly: input format, where to get the ID, what gets cloned, why to prefer it, and what to do on timeout. The non-idempotency warning is especially valuable for reliable agent execution.

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 value by pointing to list_templates as the source for valid template IDs and by clarifying that title overrides the template title, paralleling the schema. It doesn't fully expand parameter meanings, but the added context is helpful and non-redundant.

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 precise verb-resource pair: 'Create a new form in the current team from a public template.' It also names the sibling tool it is not — create_form — and emphasizes this is the template-based pathway. Clear, unambiguous, and distinct from siblings.

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 explicitly guides when to choose this tool: 'This is the fastest way to build a quiz when a suitable template exists — prefer it over building from scratch with create_form.' It also references list_templates for finding IDs and update_form/update_question for subsequent changes. It does not exhaustively state when not to use it (e.g., no template exists), 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.

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

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

Output Schema

ParametersJSON 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

TDQS

A4.7/5.0
Behavior5/5

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

The description thoroughly discloses behavior beyond annotations: it clones source text as the initial draft, returns the draft for immediate editing, requires keeping codes identical, and enforces one translation per language and language differing from primary. This gives the agent a clear mental model of what will happen.

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 compact, front-loaded description that packs essential info into three sentences: the action, the return and workflow, and the constraints. No filler or redundant restating of the schema.

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 description fully covers what an agent needs to invoke this tool correctly: the purpose, the workflow, constraints, and where to verify uniqueness. The output schema covers return-value details, so the description completes the behavioral picture.

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 meaningful context for 'language' (must differ from primary, one per language) and clarifies that 'formId' is the source form. It also explains that clones source text, tying parameters to the behavior.

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.' It clearly differentiates from related siblings like update_form_translation (for saving edits) and list_form_translations (for checking existing translations).

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 usage context: use this to create a translation, then save with update_form_translation, and check list_form_translations for uniqueness. It could be more explicit about when not to use it or which alternative covers different cases, but the workflow is well communicated.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
formIdYesThe form UUID to move to trash

Output Schema

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

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only provide destructiveHint=true, and the description substantially expands on that: soft-delete semantics, 5-day retention then auto-purge, submission records preserved until permanent purge, and the restore path. This is exactly the behavioral context an agent needs beyond a bare destructive flag, and it does not contradict the annotations (destructiveHint=true aligns with moving to trash).

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 filler: core action and scope, recovery window with the restore path, then permissions and submission handling. The most decision-relevant fact (this is a soft delete, not a permanent deletion) is front-loaded in the first sentence.

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 single-parameter mutation tool with a present output schema and a destructiveHint annotation, the description covers action, scope, retention, recovery, permissions, and side effects on submissions. Remaining gaps such as idempotent re-deletion or permission-denied error codes are minor edge cases, and the output schema covers return-value expectations.

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 formId is already documented as 'The form UUID to move to trash.' The description adds the 'current team' scoping, which usefully constrains which formId is valid, but it provides no additional format or validation guidance beyond the schema. Baseline 3 is appropriate when the schema already carries the 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 opens with a specific verb and resource: 'Move a form into the trash (soft delete) in the current team,' which immediately clarifies not only what the tool does but its non-permanent nature. It also differentiates from siblings by naming restore_form as the inverse and by making the resource (form) distinct from delete_form_translation and delete_question. An agent can disambiguate without opening schemas.

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 names restore_form as the explicit recovery alternative, tells the agent the hidden-from-list_forms consequence, and states the permission precondition (form owner or team owner/admin). It stops short of an explicit when-not-to-use directive, but since no hard-delete sibling exists, the guidance is clear and actionable for the tool family.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
formIdYesThe source form UUID
languageYesWhich language version to delete

Output Schema

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

TDQS

A4.7/5.0
Behavior5/5

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

The annotations only indicate destructiveHint=true, so the description adds valuable behavioral detail: submission records are anchored to the source form and are NOT deleted, historical reports fall back to source text, and the primary language cannot be removed through this tool. This is exactly the kind of side-effect disclosure that helps an agent predict real-world impact.

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 make the core action, the critical side effects, and the primary-language restriction very clear. Nothing is redundant, and the most important behavioral caveat about submissions is placed early.

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?

This is a small tool with two well-documented parameters and destructive semantics. The description fully covers what gets deleted, what does not get deleted, what happens to historical reports, and which language is off-limits. No material information needed to invoke the tool safely 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?

The input schema already fully documents both parameters and the language enum, so the baseline is 3. The description adds meaningful parameter-level context by confirming that the language parameter refers to a translation version and that the primary language is not a valid candidate for this deletion.

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 and resource: delete one language version (translation) of a form. It also distinguishes this from deleting the whole form by noting the primary language cannot be deleted this way, which helps an agent differentiate it from delete_form.

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 a clear usage context: deleting a translation while preserving submission records, and it explicitly excludes the primary language. It does not explicitly name delete_form as the alternative for removing the primary language, but the phrase 'it lives on the form itself' makes that route reasonably clear.

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

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

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

Output Schema

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

TDQS

A4.5/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, so the description correctly doesn't repeat the mutation warning. It adds genuine value beyond the annotations with the 'deleting the last one is allowed (a form can be an empty shell)' edge case, which prevents an agent from assuming a minimum-item guard exists.

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, roughly 30 words, fully front-loaded: action and scope in the first sentence, the one critical edge case in the second. Every sentence earns its place and nothing repeats schema or annotation content.

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?

Complete for a low-complexity tool: both required parameters are fully described in the schema, destructiveHint covers the safety profile, and an output schema covers return values. The only behaviors an agent needs to call it correctly — what can be deleted, by which identifier, and the last-item allowance — are all present.

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 one meaningful clarification: 'by code' confirms the code parameter is the deletion identifier, and it corrects the schema's narrow 'question' wording by revealing that code may reference breakers and display blocks as well as questions.

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 resource ('a single item from a form'), then disambiguates the resource by enumerating the three deletable item types (question, Breaker, Statement/Swiper). This clearly distinguishes it from sibling delete_form (whole form) and from the question-management siblings (add_question, insert_question, update_question, move_question).

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 usage scope is clear: single-item deletion within a form, with the admissible item types enumerated so an agent knows the tool is not limited to questions. It implicitly contrasts with delete_form (whole-form deletion) via the 'single item from a form' phrasing, though it never names the alternative or states an explicit when-not condition.

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe new (copied) form id
urlNoAdmin edit URL of the copy
sceneNoknowledge_quiz / scored_quiz / outcome_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?

The description materially extends the annotations by revealing non-idempotence: if the call times out it may still have succeeded and blind retries can create duplicates. It also discloses ownership transfer, fresh share links, and that records/integrations/ban state are not copied. This is exactly the kind of behavioral nuance an agent needs beyond the readOnly/destructive hints.

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 front-loaded with the core action, then quickly states inclusions, exclusions, and a use case. The non-idempotence warning is placed last but earns its place as a critical caveat. No filler or redundant restatement of the tool name/schema.

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 two-parameter tool with an output schema and annotations already present, the description covers the essential behavior: what is created, what is excluded, ownership, and the non-idempotence risk. It also gives a realistic use case. Nothing relevant to invoking it correctly is absent.

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%: sourceFormId and newTitle are fully described in the input schema, including the default title behavior. The description does not add parameter-level derivation information itself. This matches the baseline for a high-coverage 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?

The description states a precise verb and resource — 'Duplicate a form in the current team' — then enumerates exactly what is cloned (structure, scoring, report, visual settings, translations) and what is not (submissions, sharing, integrations, ban state). This clearly distinguishes the tool from sibling create/restore/update operations without ambiguity.

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 clear context: use it to clone an existing proven quiz and then tweak the copy. It also defines scope by stating what is not copied, which implicitly tells an agent when this tool would not suffice (e.g., if submissions or sharing must be preserved). It stops short of explicitly naming alternatives or when to prefer create_form_from_template, so it earns a 4 rather than a 5.

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

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

ParametersJSON Schema
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

ParametersJSON 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.4/5.0
Behavior4/5

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

The description explains that the tool verifies storage, records the object, and returns a media id plus public URL. This goes beyond the annotations, which only indicate readOnly=false/destructive=false. It does not describe failure handling or idempotency, but the key behavioral steps are 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 sentences, all front-loaded: the very first clause identifies the step and prerequisite. Every sentence adds a distinct, necessary piece of information: when to call, what it does, and what to do with the result. There is no filler or redundancy.

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 that an output schema exists, the description need not list return fields. It covers the workflow position, prerequisite, effect, and downstream integration. It could optionally mention failure behavior or idempotency, but for invoking this step correctly, the description is 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%, and each parameter is already described (key, filename, mimeType). The description adds the workflow context that these values must match the prepare step, but it largely repeats what the schema descriptions already say. 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?

The description opens with a specific verb and resource: 'Step 2 of 2 for adding an image' and states it 'verifies the uploaded object, records it in the team media library and returns a media id + public URL.' It clearly distinguishes itself from prepare_image_upload by explicitly naming it as the preceding step and from update_form as a later consumer of its media id.

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 gives the exact timing ('call this AFTER you have PUT the file to the uploadUrl returned by prepare_image_upload'), the alternative usage ('to use the image as a quiz cover or landing-page cover, call update_form with flagImg or landingImage'), and the sequencing. No ambiguity remains about when to invoke this tool versus its siblings.

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

get_active_tenantA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoTeam id
nameNoTeam name
roleNoYour role in this team
slugNoTeam slug
examineeSignupDisabledNotrue = 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

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as safe and read-only, and the description adds substantial behavioral context beyond them: the team is the default for all write tools, and examineeSignupDisabled means new respondents cannot sign in at login-gated quizzes. This greatly helps the agent interpret results without contradicting 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 two sentences, front-loads the core purpose, then explains an important diagnostic flag. Every clause earns its place; no filler or repeated structural metadata.

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 output schema handles return structure and there are no params, this description provides the contextual information an agent needs to interpret and use the result, including the critical examineeSignupDisabled nuance and its user-facing consequences.

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 schema description coverage is 100%, so there is nothing for the description to clarify. Baseline 4 is appropriate since there is no parameter burden.

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 operation with verb and resource: "Return the team (tenant) this token is currently operating against." It also clarifies the team's role as write default, making it instantly distinguishable from siblings like list_my_tenants and switch_active_tenant.

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 context for when to call it: to identify the active tenant before write operations and specifically to check examineeSignupDisabled before diagnosing submission failures. It does not explicitly name alternatives, but practical use cases are clear and no exclusions are needed.

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

get_booking_availabilityA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
toDateYesRange end (exclusive), ISO datetime
fromDateYesRange start, ISO datetime
bookingIdNoOptional: compute availability for rescheduling this booking, excluding the slot it currently occupies. Omit to see availability for the team as a whole.

Output Schema

ParametersJSON Schema
NameRequiredDescription
slotsNoBookable start times as ISO datetimes — reschedule_booking only accepts one of these
enabledNofalse when the team has booking off or the plan does not include it
timezoneNoThe team's booking timezone
slotSeatsNoPer-slot capacity
requireApprovalNoWhether new requests need approval (returned when booking is off)
slotDurationMinutesNoLength of one slot

TDQS

A4.9/5.0
Behavior5/5

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

Even though readOnlyHint is already true, the description adds useful behavioral context that annotations do not provide: the enabled:false state for disabled plans, exclusion of a booking's own slot during rescheduling, and server-side clamping of over-long date ranges. 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?

Four sentences, each carrying distinct value: core operation, edge-case return, rescheduling workflow, and range limit behavior. The most important use-case instruction is clearly placed, and there is no filler or repetition of schema details.

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 schema and output schema available, the description covers the query behavior, conditional logic, critical rescheduling prerequisite, and server-side adjustments. It gives an agent everything needed to call it correctly in the main workflow.

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 three parameters well, including ISO datetime semantics and exclusivity of toDate. The description adds extra meaning by explaining bookingId's exclusion behavior and the server-side range clamp, which helps an agent understand edge cases without opening additional 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 states a specific verb and resource: 'Read the current team's bookable time slots in a date range.' It also explains the calculation rule ('weekly booking rules minus what is already taken'), which makes the tool's purpose concrete and distinguishable from siblings like list_bookings or reschedule_booking.

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 agents to 'always call this before reschedule_booking' and gives the reason: a start time outside the available slots is rejected. It also provides conditional guidance for when to pass bookingId and when to omit it, which is actionable and clear.

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoMasked name (J*n)
emailNoMasked email (j***g@example.com); never pass it back as an argument
avatarNoUploaded avatar as { id, url }
statusNoAccount status
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 key, when no image was uploaded
emailVerifiedNoWhether the email has been verified

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover readOnlyHint and destructiveHint, and the description adds useful behavioral details: scoping to the current team and explicitly stating that sensitive auth fields are never returned.

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 concise, front-loaded sentences with no filler. It covers the key facts in order: action, scope, identifier, included data, and an important security guarantee.

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 one well-documented parameter, read-only annotations, and an output schema being present, the description is complete enough for an agent to correctly select and call the tool. Team scope, ID source, included data, and excluded fields are all stated.

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 examineeId as the business ID shown in list_examinees. The description repeats the same example and adds little beyond what the parameter schema already 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 states a specific verb ('View the full detail of one examinee') and a specific resource, clearly distinguishing a full single-record lookup from list_examinees. It also mentions the key identifier and that customData is included.

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 clearly sets the context: use this on an examinee in the current team, and find the examineeId from list_examinees. It does not explicitly name alternatives or exclusions, but the intended read-only retrieval flow is clear.

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

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

ParametersJSON Schema
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

ParametersJSON Schema
NameRequiredDescription
idNoForm id
sceneNoknowledge_quiz / scored_quiz / outcome_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

A4/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and destructiveHint=false, and the description is fully consistent with a pure read operation. The description adds value by disclosing where outcome codes live (report.outcomeAnalysis.outcomes) and that language is the primary language with others listed in translationLanguages. It does not mention rate limits or pagination, but with a read-only safety profile these are minor rather than critical gaps.

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 front-loads the main purpose in the first sentence and keeps the follow-up snippet compact. The dense references to fields[], report configuration, outcome codes, and language are informative; no filler or repeated schema information. It is slightly more technical than it needs to be, but each clause 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?

The output schema exists, annotations cover the safety profile, and all parameters are documented in the input schema. The description closes the remaining gap — understanding how the response is organized — by pointing exactly where outcome codes and language variants live. Nothing an agent needs to invoke this tool correctly is absent.

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 even without extra parameter context. The description's notes about outcomeAnalysis and translationLanguages describe the response shape rather than the input parameters, so it doesn't materially enrich the meanings of the already clearly documented id/includeFields/includeReport parameters.

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 form of the current team in full', then states precisely what is returned (fields[] and the report configuration). It naturally differentiates from siblings like get_form_stats, get_form_funnel, get_form_translation, and list_forms, since the scope is a single complete form definition.

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 usage context is implied — a caller needing the full form detail, including question fields and report config, would reach for this tool. However, the description never names any alternatives or excludes when the agent should prefer a sibling like get_form_stats, get_form_translation, or list_forms. The selection rule has to be inferred from sibling names and the 'in full' wording.

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

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

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

Output Schema

ParametersJSON 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 }
channelsNoFunnel split by channel
utmCombosNoFunnel split by UTM combo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly and non-destructive behavior, so the description doesn't need to echo those. It additionally discloses what data is used ('form_sessions telemetry'), what breakdowns are computed, and the drop-off analysis, going beyond the annotations and leaving no surprising behavioral traits.

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 one dense sentence with no filler. It front-loads the tool's core purpose, then adds only high-value specifics: telemetry source, overall stages, channel breakdown, UTM combos, and drop-off points. Every phrase 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?

With an output schema, a complete input schema, and annotations covering read-only safety, the description provides the remaining operational context: the exact funnel event stages, per-channel and UTM dimensions, and the prescribed use case. An agent has everything needed to decide and call 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?

Since the schema already fully documents the parameters (formId and days with defaults and limits), the baseline is high. The description adds meaningful scope by saying 'for a form in the current team' and 'over last N days', tying the parameters to the intended semantic context without repeating schema fields.

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 'Read the conversion funnel for a form', names the telemetry source, and pinpoints the scope ('current team', 'last N days'). It also lists the exact analytics dimensions (channels, UTM, stages, drop-off points), making it obviously distinct from siblings like get_form or 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?

The explicit closing guidance 'Use this to find where respondents drop and improve conversion' gives a clear when-to-use context. Exclusions or direct alternative names are not stated, but the description is enough for an agent to select it for funnel diagnostics.

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

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

ParametersJSON Schema
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

ParametersJSON 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, booking, gaTrackingId, sharedWithAll }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)
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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true and destructiveHint=false; the description adds useful behavioral context by explaining what the tool reveals, including whether the form will accept responses. It does not contradict any 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 information-dense without fluff: it packs the return contents, the utmSource tagging effect, and the sibling tool reference into two sentences. Every clause 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 read-only getter with rich output, strong annotations, and complete schema descriptions, this description gives the agent everything it needs to decide when to call it and what it will get back. No meaningful gap remains.

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 covers all 4 parameters at 100% with detailed descriptions, so the baseline is 3. The description adds some context for utmSource (tagging links/snippets for one channel) but does not meaningfully go beyond the schema's existing 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 identifies the tool's purpose with specific deliverables: public answer link, custom domain status, embed snippets, and delivery settings. It explicitly names the sibling tool update_form_settings to distinguish the read/get nature of this operation.

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 explicit use cases: answering 'give me the link / the embed code' and sanity-checking a launch. It also directly states when to switch to update_form_settings, giving the agent clear routing guidance among siblings.

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

get_form_statsA
Read-only
Inspect

Read submission statistics for a form in the current team over the last N days: KPI overview (total / today / last 7 / last 30, unique examinees, anonymous, report status counts, average score, latest submission), daily submission trend, channels (by utm_source), UTM combos, login types (anonymous vs registered), device breakdown, and per-question answer distributions. Use this to gauge how a quiz is performing and to suggest improvements.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysNoLook-back window actually used
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
answerDistributionsNoPer-question answer distribution (choice-style questions only)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds useful behavioral context beyond that: the tool is scoped to the current team, respects a time window, and returns an aggregation of metrics rather than raw records. This goes beyond what the annotations alone convey.

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 front-loaded with the main purpose, followed by an organized enumerated list of statistics, ending with a useful intent statement. The list is somewhat long, but every element provides meaningful context about the return value; no filler or redundant information is present.

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 that the tool has an output schema and a rich description listing the exact statistics returned, the description is nearly complete. It covers scope, time span, and the metrics available, though it could go slightly further in differentiating from closely related tools like get_form_funnel or specifying the current-team prerequisite more explicitly.

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 formId and days with descriptions, and schema description coverage is 100%. The description adds 'over the last N days' and the notion of 'current team', but it does not provide additional parameter-level meaning beyond what the schema already gives. A 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?

The description opens with a specific verb and resource: 'Read submission statistics for a form in the current team over the last N days.' It then enumerates the exact categories of statistics returned, making the tool's function unmistakable and clearly distinct from siblings like get_form or list_examinees.

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 closing sentence gives a clear use case: 'Use this to gauge how a quiz is performing and to suggest improvements.' This provides context on when the tool is appropriate, though it does not explicitly name exclude alternatives or state 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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
formIdYesThe source form UUID
languageYesWhich language version to read

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleNoTranslated title
fieldsNoTranslated questions, mirroring the source codes
formIdNoThe source form
reportNoTranslated report copy
isActiveNoWhether this language version is live
languageNoLanguage of this version
shareUrlNoPublic link for this language
updatedAtNoISO datetime
systemTextNoTranslated system copy
descriptionNoTranslated description

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, signaling a safe read. The description adds meaningful context beyond that: it discloses the error condition ('Returns an error if that language version does not exist yet') and the precondition. It also reveals what is disclosed via the fields listing. It does not describe response format, but an output schema exists, so the need is minimal.

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 short sentences cover purpose, workflow usage, and error condition with zero filler. The purpose is front-loaded; the workflow guidance and precondition follow logically. No sentence is wasted.

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 simplicity (2 params, 100% schema coverage, output schema present), the description covers everything an agent needs: what it reads, how it should be used in the translate workflow, and what happens when the language version is missing. Nothing essential 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%, with both formId and language fully documented. The description adds context by explaining that 'language' selects a 'language version (translation)' and that codes must remain identical to the source form, but it does not go deep on what formId's value means beyond the source form's UUID. Baseline 3 is appropriate on schema does the heavy lifting.

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 uses a specific verb-resource pair: 'Read the full content of one language version (translation) of a form,' and names the exact scope ('mirrored fields[] and report'). This cleanly separates it from the base get_form and from the other translation tools by specifying that it targets a language-specific variant.

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 embeds the tool in a workflow: 'Use the content to populate an onboarding request the current draft before translating ... then save with update_form_translation.' It also tells the agent when NOT to call it - if the translation doesn't exist, create it first. This is ideal guidance without any additional effort.

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

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

ParametersJSON Schema
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

ParametersJSON 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 mark this as read-only and non-destructive. The description goes beyond annotations by disclosing exactly what the read returns, what each optional include expands, and that identifier lookup is scoped to the current team. The masked-email warning is a helpful behavioral constraint not present in the schema alone.

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 with no redundancy: the main action and return fields are front-loaded, optional behavior is listed compactly, and the key identifier caution is a short final clause. 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?

With an output schema present and annotations covering the safety profile, the description fills the remaining gaps: what data is included, what optional includes add, and how to correctly reference lead and respondent. 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 description coverage is 100%, so the schema already documents each parameter. The description still adds value by specifying that leadId is the leadId returned by list_leads, reinforcing which identifier to pass, and warning against using masked emails. Optional flags are semantically clear in both schema and description.

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 and resource ('View one lead'), names the lead identifier, and enumerates exactly what data is returned (status, assignee, tags, respondent block, next upcoming booking). This is clearly distinct from sibling tools like list_leads or get_examinee because the scope is explicitly 'one lead of the current team'.

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 clearly indicates when to use this tool: to view a single lead in the current team. It also explains how to reference identifiers ('by its leadId ... never by a masked email') and when to enable optional inclusions such as submission history, internal comments, and change timeline. It does not explicitly name sibling alternatives like list_leads for broad queries, but the use context is unambiguous.

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

get_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 complete frozen report result (overall / dimensions / outcome / AI evaluation). Answers are returned as the respondent wrote them, except that any email address or phone number inside them comes back masked.

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

Output Schema

ParametersJSON 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 }
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 complete frozen report { status, overallAnalysis, dimensionAnalysis, outcome, aiEvaluation, aiSuggestion }
serialNumberNoPer-form sequence number of the submission

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already indicate this is a read-only, non-destructive operation. The description adds meaningful behavioral transparency beyond the annotations: it discloses privacy masking of email addresses and phone numbers in submitted answers and explains that the answer are the submitter's answers except for that masking. This is valuable context for an agent deciding whether results are raw or scrubbed.

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 structured with the primary action and key facts front-loaded: the specific resource, the source of the id, and the detailed content of the returned record. The second sentence adds important masking behavior. It is fairly long, but the detail is pertinent and each 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?

Given the tool has a rich output schema, the description does not need to enumerate the return fields. It appropriately covers how to locate the record (`id` from list_records), the team scope, the inclusion of UTM metadata, the frozen report, and the masking behavior. Nothing critical seems missing for an agent to invoke this tool correctly.

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 fully documents `recordId` as 'The record id (the `id` returned by list_records)'. The description essentially repeats the same information without adding new parameter nuances such as formats, constraints, or valid values. With 100% schema coverage, the baseline of 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 identifies a specific action ('View') and resource ('one submission record / lead'), and details exactly what is contained in the returned detail. It also ties the resource to the `id` field from list_records. It does not explicitly contrast itself with siblings like get_lead or get_examinee, so it lacks complete sibling differentiation.

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 context on when to use the tool: after obtaining a record id from list_records, for viewing the full detail of a submission in the current team. It does not explicitly state when not to use it or which alternatives to prefer, but the intended entry point of use is clear.

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

insert_questionAInspect

Insert an item at a specific position: a question, a page break (Breaker) or a display block (Statement with content / Swiper with items). Use after / before to reference an existing field code (from get_form's field.code). To insert at the very front: before references the first field's code. To insert at the end, use add_question. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxNoNumberField only: maximum allowed input value (must be >= min). Rejected for other question types.
minNoNumberField only: minimum allowed input value (respondents cannot submit a smaller number). Rejected for other question types.
codeNoOptional stable identifier for this question (field code). Omit it to let the server auto-generate one. Set a meaningful code (e.g. "q1") when report.formula or a dimension needs to reference this question, so you can write the formula as `{{q1}}` in the same call instead of round-tripping via get_form. Rules: start with a letter or underscore, then only letters/digits/underscores (no hyphens, spaces, or leading digit), at most 64 chars, and not a reserved math word (e, E, pi, PI, tau, phi, i, Infinity, NaN, true, false, null, undefined). Must be unique among all items in the form.
nameNoQuestion stem text. Allows plain text or restricted HTML (tag allowlist: <p> <strong>/<b> <em>/<i> <u> <s> <mark> <span> <sup> <sub> <br>; other tags are stripped and the text kept).
typeYesQuestion type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer
unitNoNumberField only: display unit suffix shown after the input, e.g. "kg" / "$" / "min". Rejected for other question types.
afterNoInsert after this code; choose either after or before
itemsNoSwiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type.
scoreNoPoints this question is worth, default 0 (not scored). Quiz scene: awarded when the answer matches correctAnswer, and a positive value is required once correctAnswer is set. Scored Quiz scene: pairing it with correctAnswer enables the fallback mode above, but choices[i].score is more flexible. Rejected in the outcome_quiz scene, for DateField / TimeField / Rate, and — in the scored_quiz scene — for NumberField (where the submitted number itself is the score) and FillBlank (collected only, never scored).
stepsNoRate only: number of rating steps, i.e. the highest rating (3-10, default 5). In the scored_quiz scene the submitted rating value (1..steps) is the question score, unless a per-star score is configured in the web app. Rejected for other question types.
wordsNoRate only: optional scale labels evenly distributed under the rating control, e.g. ["Poor", "Excellent"] for the two endpoints (up to 5 labels). Rejected for other question types.
beforeNoInsert before this code; choose either after or before
formIdYesThe form ID to insert the item into
aiMatchNoOnly for FillBlank in the knowledge_quiz scene. Enables AI grading: the AI compares the respondent answer against correctAnswer and scores by accuracy, instead of requiring an exact string match. Requires correctAnswer (the standard answer) and score > 0 (the score earned when accuracy reaches the threshold). Pass an empty object {} to enable with default settings; omit for plain exact-match grading.
choicesNoChoice-based questions only (SingleCheck / MultiCheck / DropDown / Ordering / Cascade), where it is required; ignored for every other type, including TrueFalse — its two options come from trueLabel / falseLabel. Per-type limits: SingleCheck / MultiCheck 2-20 items — for a longer list use DropDown (2-100 items) instead; Ordering 2-10 items; Cascade nests via choices[i].children (up to 3 levels, at most 100 nodes in total). IMPORTANT (knowledge_quiz scene): vary the position of the correct option(s) across questions — do NOT always place the correct answer first. Distribute correct answers roughly evenly over all positions so they are not predictable.
contentNoStatement 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.
explainNoOptional 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.
shuffleNoOrdering only: shuffle the displayed choice order for each respondent. Defaults to true for MCP-created questions — the stored choices order would otherwise leak the correct order when correctAnswer matches it. Pass false only when the initial order is intentionally meaningful. Rejected for other question types.
multipleNoDropDown only: allow selecting multiple options (default false = single select). Affects the quiz-scene correctAnswer shape: an array of labels/codes when true, a single one when false. Rejected for other question types (SingleCheck/MultiCheck are inherently single/multi).
requiredNoWhether the question is required, default false
precisionNoDateField / TimeField only: picker precision. DateField accepts year | month | day | hour | minute | second (default day; e.g. "month" shows a year-month picker, "second" a full datetime picker). TimeField accepts only minute | second (default minute). Ignored for other question types.
trueLabelNoTrueFalse only: custom display text for the "true" option (e.g. "Yes" / "Agree"). Ignored for other question types. Leave empty to fall back to the built-in default for the form language ("Correct" in English forms). Does not change the stored answer value, which stays "true".
falseLabelNoTrueFalse only: custom display text for the "false" option (e.g. "No" / "Disagree"). Ignored for other question types. Leave empty to fall back to the built-in default for the form language ("Incorrect" in English forms). Does not change the stored answer value, which stays "false".
descriptionNoOptional 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.
trueOutcomesNoOutcome scene + TrueFalse only (required there together with falseOutcomes): the outcome codes that answering "true" votes for. Use [] for a side that votes for nothing. Rejected for other question types / scenes.
correctAnswerNoThe "correct answer" of the knowledge_quiz scene; setting it makes the question scored, so pair it with a positive `score`. The shape follows the question type — see the anyOf branches; a choice is referenced by its label or its code, so reference it by code whenever the same label appears more than once (Ordering rejects an ambiguous label outright). Required on SingleCheck / MultiCheck / DropDown / Ordering in the knowledge_quiz scene, optional on FillBlank / NumberField there. NumberField answers must be typeable within min / max and decimalPlaces. Rejected for DateField / TimeField / Rate (data-collection and rating fields; configure date/time scoring in the web app), rejected for FillBlank in the scored_quiz scene (free text is collected only there), and rejected in the outcome_quiz scene (no right or wrong answers there). In the scored_quiz scene prefer choices[i].score per option; passing correctAnswer + score there only falls back to "the matching choice gets score, others get 0".
decimalPlacesNoNumberField only: how many decimal places respondents may enter (stored as the field's numeric precision), default 0 = integers only. Rejected for other question types. Note this is different from the string `precision` of DateField / TimeField.
falseOutcomesNoOutcome scene + TrueFalse only (required there together with trueOutcomes): the outcome codes that answering "false" votes for. Use [] for a side that votes for nothing. Rejected for other question types / scenes.
trueDimensionScoresNoscored_quiz scene + TrueFalse only: the points answering "true" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.
falseDimensionScoresNoscored_quiz scene + TrueFalse only: the points answering "false" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.

Output Schema

ParametersJSON 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

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses a critical behavioral trait beyond the all-false annotations: '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.' This non-idempotency warning with a check-first-retry recipe is exactly the safety context an agent needs for a mutation tool, and it appears nowhere in the annotations or 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?

Four sentences, each with a distinct job: what can be inserted, how positioning works, edge cases (front/end), and the retry-safety warning. The core purpose is front-loaded and there is zero filler — impressive given the enormous schema it accompanies.

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 30-parameter tool with a rich schema-level FIELD APPLICABILITY block and a present output schema, the prose covers the agent-facing gaps: sibling routing, reference-code sourcing, edge-positioning behavior, and idempotency. Nothing an agent needs to decide between insert_question and add_question, or to position an item 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 the baseline is 3; the description pushes above it by explaining where the before/after values come from ('reference an existing field code (from get_form's field.code)') and how to encode the front-insection case. The schema's own entries for before/after are thin ('Insert after this code; choose either after or before'), so this resolves a real ambiguity, though the remaining 28 parameters are left to the schema, which fully documents them.

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: 'Insert an item at a specific position: a question, a page break (Breaker) or a display block (Statement with `content` / Swiper with `items`)' — naming exactly what the tool creates and where. It also differentiates from the closest sibling by routing end-of-form inserts to add_question.

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?

States the when explicitly: insert at a position referenced via after/before against an existing field code. It names the alternative (add_question) for appending at the end, explains the front-insertion edge case ('before references the first field's code'), and tells the agent where to source reference codes (get_form's field.code).

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

invite_memberAInspect

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

ParametersJSON Schema
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

ParametersJSON Schema
NameRequiredDescription
roleNoRole granted by the invite
emailNoAddress the invite was sent to
inviteUrlNoThe invite link that was emailed — you may relay it to the user
inviteTokenNoToken embedded in the invite link
membershipIdNoThe created membership record
isUserRegisteredNoWhether that address already had a RooQuiz account

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 discloses that an invitation email is sent, that a join link is returned, and that non-admin roles are rejected. It also lists concrete failure conditions such as existing membership, pending invites, and hitting the member limit. This matches the readOnlyHint=false and openWorldHint=true annotations without contradiction.

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 dense but every clause carries useful information: core action, return value, authorization, role constraints, failure modes, and tenant targeting. It is front-loaded with the main behavior and does not include filler or redundant material beyond acceptable reinforcement.

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 available, the return value structure is already specified, and the description still covers the join-link return, authorization requirements, role constraints, failure conditions, and the active-tenant dependency. An agent has enough context to invoke the tool correctly and handle expected errors.

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%, and the schema already documents role defaults and meanings. The tool description adds the 'cannot invite as owner' constraint and some email-related failure conditions, but it largely restates what the input schema already provides, so it adds only marginal semantic value.

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-resource pair: 'Invite someone to the active team (tenant) by email.' It also clarifies the outcome by stating that an invitation email is sent and the join link is returned. This clearly separates it from team-scoping siblings like list_my_tenants and switch_active_tenant by noting it operates on the active tenant.

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 states who may invoke the tool: only the team owner or an admin, with rejection for other roles. It also tells the agent to use list_my_tenants or switch_active_tenant first if a different team is intended, which is direct usage guidance and alternative routing.

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

list_bookingsA
Read-only
Inspect

List the 1:1 bookings (discovery calls / consultations booked from a quiz report page) of the current team, earliest first. Each item carries the time range, status, meeting type, the attendee, the source quiz and submission, and the lead owner who should handle it. Filter by status / quiz / respondent / time range. Typical use: status "pending" lists the approval queue waiting on someone. Reference a booking by its bookingId; the attendee name / email come back masked.

ParametersJSON Schema
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 awaiting approval (the team has requireApproval on), 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

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

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses important runtime behavior: bookings are scoped to the current team, results are returned earliest-first, attendee name/email are masked, and pending status depends on requireApproval. The mention of masking and the approval model is genuinely valuable and not visible from the 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 compact and well organized: what is listed, what fields come back, what filters exist, a typical use, and a key PII mask. Every sentence earns its place, with no filler or restating of the tool name.

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 listing tool with nine optional parameters, the description covers the payload shape, filtering semantics, sorting, a pragmatic example, and the data masking behavior. Combining this with a complete schema and output schema leaves almost no open questions for invoking the tool 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%, so the baseline is solid, but the description adds real semantic value: it maps formId to quiz, recordId to submission record, and clarifies that examineeId is the internal id from get_lead's respondent.id, not the business code. It also explains what status 'pending' means in 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?

The description states a specific verb ('List') plus a clearly bounded resource: '1:1 bookings of the current team.' It gives the booking origin, the sort order, and what each item contains, which unambiguously distinguishes it from siblings like reschedule_booking, review_booking, or update_booking_status.

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 a concrete use case ('status "pending" lists the approval queue') and explains when requester approval applies. It does not explicitly contrast against alternative booking-related tools, but the context is clear enough for an agent to know this is the read-side listing tool.

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoHow many are returned in this page
itemsNoThe page of respondents (newest first), PII masked
totalNoTotal respondents matching the filter

TDQS

A4.7/5.0
Behavior5/5

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

The description adds meaningful behavior beyond the readOnlyHint annotation: sensitive auth fields are never returned, the business ID is returned unmasked, results are scoped to the current team, and results are newest first. This helps the agent understand privacy guarantees and naming semantics without assuming from the 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 three tightly written sentences with no filler. It front-loads the core action and scope, then states the privacy guarantee, and closes with actionable routing to sibling tools.

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 schema, full schema parameter coverage, an output schema, and annotations declaring read-only non-destructive behavior, the description still adds crucial context about current-team scope, ordering, sensitive-field filtering, and the returned ID's role in get/update operations. Nothing essential for correct invocation 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?

Input schema coverage is 100% and each parameter (limit, search, status) already has a clear description. The tool description adds no extra parameter semantics, so the baseline score of 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 names a specific verb and resource ('List the examinees'), specifies the scope ('of the current team'), and gives the ordering ('newest first'). It further clarifies the domain by noting examinees are also called respondents, and distinguishes itself from get_examinee by stating the list returns an unmasked examineeId used by that tool.

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 directs the agent: 'Use get_examinee for one examinee's full detail including customData.' It also explains that the returned examineeId is what get_examinee / update_examinee take, making the retrieval-and-update workflow clear. This is strong routing guidance relative to siblings.

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

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

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

Output Schema

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark it as read-only and non-destructive. The description adds meaningful behavioral context: ordering by creation date, exclusion of question content, and team scoping. These details are valuable beyond the annotation flags.

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 concise sentences, no filler, with the core behavior front-loaded and the pointer to get_form added without awkwardness. Every phrase 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 simple read-only list tool, the description plus full schema plus output schema provides everything an agent needs: scope, ordering, content exclusions, filtering options, and next-step guidance for details. Nothing essential 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?

Input schema covers 100% of parameters with descriptions for limit, scene, and titleContains, so the schema already carries the parameter documentation. The description does not add parameter-level details, which is acceptable given the high schema coverage.

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 concrete verb and resource ('List the forms of the current team') and adds essential output behavior: reverse chronological order and no question content. This clearly differentiates it from get_form, which is explicitly referenced for details.

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: this is for browsing forms of the current team, and get_form is the alternative when detailed question content is needed. It does not enumerate every sibling distinction, but the key alternative route is explicit.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
formIdYesThe source form UUID

Output Schema

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark this as read-only and non-destructive. The description adds useful behavioral context by disclosing exactly what is returned (language, isActive flag, public share link, timestamps) and what is excluded (primary language). This 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 tightly written sentences with no filler. The main operation is stated first, followed by return details and a useful scope clarification. 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 simple read-only list tool with a single fully documented parameter and an output schema, the description is complete. It tells the agent what the tool does, what it returns, and what it deliberately omits.

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 provides high coverage with a well-described required parameter formId. The description adds no additional parameter guidance, which is acceptable given the schema covers the only 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, using a specific verb and resource. It also differentiates itself from get_form by explicitly noting the primary language is not included.

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 clear context by indicating that primary language is handled via get_form.language and is excluded here. It does not explicitly mention alternatives like get_form_translation for single translations, but the scope is clearly communicated.

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

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

ParametersJSON Schema
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

ParametersJSON 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
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, which is a strong safety signal. The description adds behavioral context beyond annotations: the returning structure of leads, 'Newest activity first by default', and scope across all forms. It doesn't discuss pagination edge behaviors, but the schema covers those details and there is no contradiction with 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?

The description is compact and front-loaded: the first sentence explains the resource and scoping, the second covers default behavior, the third gives the filter dimensions, and the last gives two critical usage caveats. No redundant phrases or repeated schema text; every sentence adds 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?

The annotations, full parameter schema, and output schema together already provide much of the low-level detail. The description covers the rest: core scope, default sort, filter categories, and the essential 'never guess' warning. There is no significant missing context an agent would need to invoke this tool 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 description coverage is 100%, so the baseline is 3. The description adds genuine value on top: the reminder that status and tag codes are team-defined and must come from list_lead_settings, and the warning to reference leads by explicit identifiers rather than masked emails. These are crucial practical semantics not completely derivable from the parameter descriptions 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?

Clearly states a specific verb and resource: 'List the leads (CRM records) of the current team', with explicit scoping 'one lead per respondent across all forms'. It carries meaningful detail about fields like follow-up status, assignee, tags, submission count, and next upcoming booking, which distinguishes it from sibling list tools such as list_examinees and list_records.

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 context for when to use this tool: listing leads with filters and default ordering. It also provides important prerequisite guidance: status and tag codes are team-defined and must be fetched from list_lead_settings first, with the instruction to never guess. It does not explicitly exclude alternatives like get_lead for single-lead retrieval, but the use case is otherwise well scoped.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON 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 disclose readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds meaningful behavioral context beyond annotations by specifying what configuration is returned and why it matters for later writes, including the rejection of unknown values. It does not go into authentication or rate limits, but they are not needed here.

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 fluff. The core purpose is front-loaded, and the critical 'call before writes' warning is placed prominently in the second sentence. Every phrase 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?

With zero input parameters, an output schema present, and readOnly/not destructive annotations, this description fully covers what an agent needs: what is read, why it is read, and how it affects planned write calls. Nothing critical 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?

The input schema has zero parameters and the description correctly does not attempt to invent parameter semantics. The description focuses on what is returned rather than inputs, which is appropriate for a no-parameter read tool.

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 operation as reading the current team's lead configuration and enumerates exactly what is included: follow-up status codes with label/colour/display order, the colour tag library, and assignable members. Its scope is distinct from sibling list tools because it focuses on configuration, not records.

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 gives explicit guidance: call this tool before update_lead / set_lead_tags / assign_leads, with the reason that status codes, tag codes, and member ids are team-specific and the write tools reject unknown values. This clearly routes the agent to use this tool as a prerequisite for those write operations.

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

list_my_tenantsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON 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, covering the safety profile. The description adds valuable semantic context about the token/user scoping and what isActive represents, so the agent understands that the list is scoped to the current authenticated context.

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 tight sentences. The first sentence states the primary purpose, and the second adds the one essential field clarification. There is no filler or repetition of schema/annotation data.

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 zero-parameter, read-only listing tool with an output schema, the description provides all necessary contextual input: the exact scope of the list and the meaning of the key field isActive. Nothing an agent needs for correct invocation 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?

The input schema has zero properties, so there are no parameters for the description to elaborate on. The rating aligns with the baseline for zero-parameter tools, since no additional parameter guidance is needed.

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 ('List') and a clear resource ('all teams (tenants) the current user belongs to'), making it obvious what the tool does. It also clarifies the meaning of isActive, which differentiates it from sibling tools such as get_active_tenant and switch_active_tenant.

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 context for when to use the tool: when you need to list all teams belonging to the current user. It does not explicitly contrast against siblings like get_active_tenant, but the scope is unambiguous enough that an agent can select this tool without confusion.

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

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

ParametersJSON Schema
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

Output Schema

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

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses important behavioral traits beyond the annotations: results are scoped to the current team, newest first, and returns a compact report summary. It also warns that emails and phone numbers are masked and instructs callers to reference respondents by examineeId, which is valuable privacy-aware guidance. No contradiction with the readOnlyHint=true annotation.

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 reasonably compact and front-loaded: it states the main purpose, the returned fields, and the available filters early. The masking and examineeId warning adds length but is operationally important, so it 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?

Given that an output schema exists and annotations mark the call as read-only, the description fully covers what an agent needs: scope, sort order, item content, optional filters, masking behavior, and a pointer to get_record for detail. Nothing critical 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 description coverage is 100%, so the schema already documents each parameter. The description adds a high-level grouping of filters — by form, report status, and submitted-at range — but does not add meaning beyond the schema's own descriptions.

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 and resource: 'List submission records (leads) of the current team, newest first.' It also lists what each item contains and supports optional filters, making the tool's purpose unmistakable. It stands apart from the sibling get_record, which is explicitly reserved for full detail.

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 context for when to use this tool: when you need a list of short submission records with filters, and it mentions the default sort order. It explicitly points to get_record for full record detail, but it does not clarify how this differs from list_leads or list_examinees among the siblings.

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

list_templatesA
Read-only
Inspect

List active templates in the public template library (id, title, scene, description, category, recommended flag, usage count), most-used first. Use this to find a template, then call create_form_from_template with its id to create a form from it — the fastest way to build a quiz when a suitable template exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoItems per page, default 20, max 100
sceneNoFilter by scene, optional
categoryIdNoFilter by category id, optional
isRecommendedNoWhen true, only return recommended templates
titleContainsNoFuzzy match by title, optional

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNoThe page of templates
totalDocsNoTotal templates matching the filter

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true and destructiveHint=false. The description adds behavioral context beyond the annotations: only active templates are listed, it accesses the public library, and results are ordered by usage count. These details are useful and align with the read-only annotation, adding insight without contradicting it.

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 exactly two sentences and earns both: the first packs the resource, scope, output composition, and ordering; the second gives the workflow context. Nothing is redundant, and key integration information is front-loaded.

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 listing purpose, public scope, output fields, ordering, and recommended successor tool are all stated, and the output schema covers the return structure. With optional parameters fully documented in the schema and read-only semantics declared in annotations, the description is complete for an agent to invoke and integrate the tool correctly.

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%: all 5 parameters (limit, scene, categoryId, isRecommended, titleContains) have descriptions and defaults/limits. The description does not add parameter-level meaning beyond what the schema already 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 states a specific verb and resource: 'List active templates in the public template library', and enumerates the returned fields and ordering. It clearly distinguishes itself from sibling tools by scoping to templates and pointing to create_form_from_template as the next step.

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 gives explicit when-to-use guidance: use it to find a template, then call create_form_from_template with its id, framing this as the fastest way to build a quiz when a suitable template exists. This also implicitly tells the agent when not to use it, when no suitable template exists, while mentioning a named alternative workflow.

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

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

ParametersJSON Schema
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

ParametersJSON 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.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so this is a mutation without data destruction. The description adds useful behavioral details: it explains that the operation uses after/before to position an item, and specifically how to move to the front (target the first field) and to the end (target the last field). It also clarifies that after and before are mutually exclusive by saying 'choose either'. This goes beyond the bare 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?

The description is three sentences long and front-loaded with the core action. Each sentence earns its place: the first states the purpose, the second explains the after/before mechanism, and the third covers the front/end edge cases. It contains no fluff or repetition, making it efficient and easy to scan.

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 the tool has an output schema (which covers return values), the description need not explain those. It adequately covers the essential operational details: what to move, how to specify a relative position, and how to achieve first/last placement. It does not mention error conditions like 'code not found' or 'both after and before provided', but the schema's required fields and the explicit 'choose either' mitigate that. Overall, an agent has enough information to call 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%, so each parameter is already described in the schema. The description adds semantic value by explaining the relationship between 'code' (the item to move) and 'after'/'before' (the reference points), and by providing the front/end strategy. It clarifies the meaning of the parameters beyond their individual descriptions, which lifts it above the baseline 3.

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 ('Move an existing item'), the resource types (question, page break, display block), and the mechanism (by code, positioning relative to another field). It distinguishes from sibling tools by focusing on reordering existing items rather than creating or updating content, and it gives concrete examples for moving to the front or end.

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 implicit usage guidance by stating the tool moves existing items, which rules out creation scenarios, and explains how to achieve front/end positioning. It does not explicitly mention alternatives like insert_question or delete_question, but the mechanics of after/before and the front/end examples give the agent enough context to decide when this tool is appropriate. A bit more explicit exclusion of creating new items would push it to 5.

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

prepare_image_uploadA
Read-only
Inspect

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.

ParametersJSON Schema
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

ParametersJSON 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.9/5.0
Behavior5/5

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

The description goes beyond the readOnlyHint by clarifying that the tool itself does not upload or receive image bytes, and by documenting the 5MB limit, the temporary-file lifecycle, the HTTP PUT step with Content-Type, and the required finalize step. This fully discloses the tool's role in a multi-step flow and warns about the practical upload requirement.

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 and dense, but the length is justified by the two-phase upload flow, the size-limit constraint, and the need for executable examples. It is front-loaded with the key mental model ('this tool does NOT receive image bytes') before giving the step-by-step workflow. It could be tightened slightly, but every included sentence serves a functional role.

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 output schema exists and the annotations cover the read-only/destructive hints, the description provides everything an agent needs to call this tool and continue the workflow. It covers prerequisites, the 5MB cap, accepted MIME types, the separation between this tool and finalize_image_upload, and even concrete curl/sips snippets for execution. Nothing essential is missing.

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?

Although the schema already documents all three parameters, the description adds meaningful context: fileSize is described as the size after compression and as the target of an up-front quota check, with the authoritative check deferred to finalize_image_upload. The description also ties filename, mimeType, and fileSize to the actual upload flow, which enriches the schema's literal definitions.

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 tool as 'Step 1 of 2 for adding an image' to the team media library and explains that it produces a presigned upload URL rather than receiving image bytes. This distinguishes it sharply from the sibling finalize_image_upload and gives the agent an accurate mental model of the operation.

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 gives a numbered 6-step workflow covering when to call this tool, what to do before calling it (compress files over 5MB), and what to do afterward (PUT to the returned URL, then call finalize_image_upload). It also explicitly states the accepted MIME types and the rejection condition for oversized uploads, so the agent can decide correctly when 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.

reschedule_bookingAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
startAtYesThe new start time, ISO datetime — must be one of the slots from get_booking_availability
bookingIdYesThe booking id (the bookingId returned by list_bookings)

Output Schema

ParametersJSON Schema
NameRequiredDescription
endAtNoNew end, ISO datetime
statusNoBooking status after the move
startAtNoNew start, ISO datetime
timezoneNoTimezone of the new slot
bookingIdNoThe booking that was moved
slotDurationMinutesNoLength of the slot

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only carry shallow flags (readOnlyHint=false, destructiveHint=false, openWorldHint=true); the description shoulders the full disclosure burden and does so thoroughly. It reveals the attendee email side effect, the re-armed 24h reminder, the booking.rescheduled integration event, and two concrete rejection modes. There is no contradiction with 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?

The description is four efficient sentences ordered logically: action, prerequisite, side effects, and failure conditions. Every sentence delivers new, necessary information and none of them repeat the schema or annotations. The primary purpose is front-loaded in sentence one.

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 a sequential dependency, external side effects, and race-condition failures, the description covers all essential elements: the prerequisite call, the slot selection, the effects of the operation, and the cases where it will be rejected. Since an output schema is present, omitting return-value details is acceptable, leaving no notable gap.

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 documents both parameters with 100% coverage, including the requirement that startAt must be a slot from get_booking_availability. The description adds meaningful context beyond this baseline: the booking belongs to the current team, the acting role must be the organiser, and the startAt must be selected from that specific booking's availability call. This helps an agent choose the right values without being redundant.

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 the specific action and resource: 'Move a confirmed booking of the current team to a different time, as the organiser.' It precisely limits scope to the current team and an organiser role, which distinguishes it in a glance from siblings like update_booking_status, review_booking, and get_booking_availability. An agent can tell exactly what resource is being changed without opening any 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 description explicitly instructs the agent to call get_booking_availability with the bookingId first and to pick a startAt from the returned slots, which is a mandatory ordering constraint. It also states rejection conditions (slot taken, respondent already has an active booking, booking not scheduled), clarifying when the call will fail. It stops short of a 5 because it does not name alternatives for different intent (e.g., when to use update_booking_status or review_booking), but the context is very clear.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
formIdYesThe form UUID to restore from trash

Output Schema

ParametersJSON Schema
NameRequiredDescription
formIdNoThe form restored from trash
messageNoHuman-readable result

TDQS

A4.3/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: it is a mutation (consistent with readOnlyHint=false), requires specific roles, and fails if the form is not in the trash. It does not mention any side effects like permanently deleting or overwriting data, but the annotation destructiveHint=false covers that concern.

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 wasted words. It front-loads the core purpose, then adds constraints in a logical order, making it easy for an agent to parse quickly.

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 single-parameter tool with an output schema and annotations, the description covers the essential operational details: what the restore does, who may perform it, and when it will error. An agent has enough information to invoke the tool correctly in the intended workflow.

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 documents formId with a clear description, and the tool description does not add significant parameter-level detail. With 100% schema description coverage, the baseline of 3 is appropriate; the description adds context about team scope but not about the parameter itself.

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 ('Restore a form from the trash'), the resource (form), and the scope ('current team'). It also ties directly to its inverse operation ('undo delete_form'), making its purpose unambiguous and distinguishable from sibling tools like update_form or create_form.

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 usage context: use this to undo a deletion of a form in the current team. It specifies permission requirements and an error condition, but does not explicitly name alternative tools for cases like creating a new form or editing an existing one, so it stops short of 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.

review_bookingAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
decisionYesapprove = confirm the meeting and release the address; decline = reject the request
bookingIdYesThe booking id (the bookingId returned by list_bookings)
meetingLinkNoApprove only: the meeting URL for this meeting. Empty falls back to the team setting.
declineReasonNoDecline only: the reason shown to the attendee, max 500 chars. Optional.
meetingInstructionsNoApprove only: how to join / what to prepare, max 1000 chars. Empty falls back to the team setting.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoscheduled after approving, cancelled after declining
bookingIdNoThe booking that was reviewed
reviewedAtNoISO datetime of the review

TDQS

A4.5/5.0
Behavior5/5

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

The description discloses real side effects beyond the write annotations: it sends the attendee a confirmation with the address, sends a 'not approved' note, and can override team-level meeting settings for a single booking. This is exactly the behavioral context an agent needs for a side-effecting approval/decline workflow.

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?

Every sentence adds operational value: main action, notification behavior, constraints, permissions, and optional overrides. It is compact, front-loaded, and contains no redundant statements.

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?

Together with the complete input schema and the output schema, the tool description covers the state machine (pending/reviewable, passed-only-decline), authorization scope, external messaging effects, and optional parameters. Nothing needed to safely call the tool 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 documents all five parameters at 100% coverage, so the description adds only modest extra meaning: approval-path vs decline-path mapping and fallback to team-level settings. This matches the baseline for a fully schema-documented parameter set.

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 precise action verbs: 'Approve or decline a pending booking request.' It names the resource, the target state after approval, and the notification behavior, which makes it easy to distinguish from siblings like list_bookings or reschedule_booking.

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 eligibility conditions: only pending bookings, only team owner/admin/lead owner, and already-passed meetings can only be declined. It does not explicitly mention when to use a sibling tool instead, but the stated constraints make the intended use unambiguous.

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

set_dimension_analysisAInspect

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. In the knowledge_quiz scene each dimension needs fieldCodes (question codes); in the scored_quiz scene a formula is optional — dimensions that questions score into via choices[i].dimensionScores sum those automatically, so only give a formula to dimensions no question scores directly. 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 random_knowledge_quiz forms.

ParametersJSON Schema
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

ParametersJSON Schema
NameRequiredDescription
formIdNoThe form that was edited
dimensionsNoThe dimensions after the replace
dimensionCountNoHow many dimensions are configured now (0 = cleared)

TDQS

A4.9/5.0
Behavior5/5

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

Annotations carry no safety hints (all flags false), so the description bears the full behavioral burden — and it delivers: replacement semantics, preservation of omitted settings, code-stability rule, removal constraints for dimensions referenced by question dimensionScores or report.formula, empty-array clearing behavior, and the unsupported form type. 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?

Seven sentences, each carrying distinct information — core semantics, stability rule, scene requirements, failure mode, clearing behavior, prerequisite, exclusion — with zero redundancy. The core behavior is front-loaded in the first sentence, and the density is justified by the tool's genuine complexity.

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 tool with 5 parameters, a nested dimensions array, scene-dependent behavior, and an output schema, the description covers mutation semantics, partial-update behavior, failure modes, clearing, prerequisites, and exclusions. An output schema already exists so return values need no explanation. 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 coverage is 100% with rich per-field descriptions, so the baseline is 3. The description adds meaningful contextual semantics beyond the schema: the code-stability rule (same name preserves existing code), the automatic summation of choices[i].dimensionScores and when a formula is actually needed, and the removal constraint linking to report.formula. These are behavioral clarifications that the schema's per-field docs do not fully convey.

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 — 'Set the multi-dimension analysis (form.report.dimensionAnalysis) of a form' — and precisely describes the mutation semantics: replacing the dimension list while preserving omitted overallAnalysis settings. This clearly differentiates it from general form setters like update_form and update_form_settings among the siblings.

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 explicit when-to-use scene guidance (knowledge_quiz requires fieldCodes; scored_quiz makes formula optional with automatic dimensionScores summing), a concrete prerequisite ('Call get_form first to read the question and dimension codes'), and a clear when-not exclusion ('Not supported for random_knowledge_quiz forms'). An agent knows exactly when and how to invoke this tool.

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

set_lead_tagsAInspect

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.

ParametersJSON Schema
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

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

TDQS

A4.8/5.0
Behavior5/5

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

Even though the destructiveHint and readOnlyHint annotations already indicate this tool mutates data, the description goes further by disclosing that replace overwrites the whole tag set, that add/remove prevents wiping other leads' tags, that tag codes must exist in the library, and that changes appear on each lead's timeline. No contradiction with 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?

Every sentence in the description is useful and dense. The core operation is stated first, followed by batching, mode semantics, tag validation, and the timeline side effect. It gives high value without unnecessary 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?

With an output schema present, the description does not need to explain return values. It covers the batching limit, all three modes, tag source and validation, stale-code behavior for remove, and the timeline effect. This is complete enough for an agent to select and call the tool correctly without needing lookups beyond the referenced tag library.

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?

The schema has 100% field coverage, so the baseline is 3, but the description substantially adds meaning: it explains leadIds should be batched, tags come from a specific library, remove accepts stale codes, and why the mode choices matter. This guidance is not derivable from the schema 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?

The description states a specific verb ('set') and resource ('colour tags on one or more leads of the current team'), immediately clarifying what the tool does. It also explains the scope limits and the three modes, which distinguishes it from generic lead-update tools like update_lead.

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 operational guidance: pass all lead IDs in a single call, never loop, and use replace vs add/remove based on whether you are editing one lead or many with different tags. It also directs users to list_lead_settings.tags for valid codes. It stops short of explicitly contrasting with sibling tools such as update_lead, so it gets a 4 rather than a 5.

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

switch_active_tenantAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tenantIdYesTarget team ID. Use list_my_tenants to discover.

Output Schema

ParametersJSON 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 only indicate readOnlyHint=false and destructiveHint=false, so the description adds meaningful behavioral context: the switch is persistent across sessions and requires team membership. This communicates the side-effect nature of the tool 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?

The description is two short sentences with no filler. The most important behavioral facts—what it does, persistence, and membership requirement—are front-loaded efficiently.

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 single-parameter switching tool with an output schema and annotations, the description covers the essential operational context: target tenant, persistence, and membership requirement. It could mention what happens when the caller is not a member, but the core guidance for a successful call is 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?

The parameter schema fully describes tenantId and even suggests list_my_tenants for discovery, so the tool description itself does not add additional parameter-level semantics. This matches the baseline expectation for high schema coverage.

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 ('Switch') and clear resource ('active team/tenant') with the exact effect: changing the tenant for the token. It distinguishes itself from related read/list tools by focusing on switching rather than querying.

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 useful context: the change persists across sessions and the caller must be a member of the target team. It also includes a prerequisite via the parameter description referencing list_my_tenants, though it stops short of explicitly naming alternatives or when not to use the tool.

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

update_booking_statusAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYescompleted = the meeting happened, no_show = the attendee did not turn up, cancelled = call it off and notify them
bookingIdYesThe booking id (the bookingId returned by list_bookings)

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNocompleted / no_show / cancelled
bookingIdNoThe booking that was closed out
cancelledAtNoISO datetime, set when the booking was cancelled

TDQS

A4.7/5.0
Behavior5/5

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

Given no annotations providing safety details, the description carries the full burden, and it delivers: it discloses cancellation sends attendee email and fires booking.cancelled, while completed/no_show are internal and contact no one. It also states precondition requirements, going well 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?

The description is dense, front-loaded, and contains no filler. The core action and allowed states come first, then preconditions and side effects, then the routing note about review_booking. Every sentence adds 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?

The tool has only two parameters and an output schema. The description covers allowed transitions, preconditions, side effects, and the boundary versus review_booking. There is no missing guidance an agent needs to invoke this safely and correctly.

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% and the schema already documents both status meanings and bookingId. The description does not add new parameter-level meaning beyond what the schema provides, though it does contextualize behavior around them. 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?

The description uses a specific verb ('Close out a confirmed booking') and enumerates the exact status transitions: completed, no_show, or cancelled. It also explicitly distinguishes itself from review_booking. An agent can immediately understand what this tool targets and how it differs from siblings.

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 when-to-use conditions are explicit: it only works on bookings with scheduled status, completed/no_show require the meeting to have started, and pending requests should use review_booking instead. This is precise, actionable guidance that prevents misuse and correctly routes to the alternative.

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

update_examineeA
Destructive
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew examinee name
statusNoEnable (active) or disable the examinee
customDataNoCustom field values as a code→value map, validated against the team's examineeFields definitions (required / unique / type / regex). The keys are that team's own field codes — get_examinee shows which codes exist, but only send values the user gave you: this replaces the whole customData object, and re-sending a value you read back (phone fields come back masked) wipes or corrupts it.
examineeIdYesThe examinee business ID (e.g. AB1234567890) to update

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoMasked name (J*n)
emailNoMasked email (j***g@example.com); never pass it back as an argument
avatarNoUploaded avatar as { id, url }
statusNoAccount status
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 key, when no image was uploaded
emailVerifiedNoWhether the email has been verified

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, and the description over-delivers by explaining exactly what is dangerous: customData REPLACES the whole object, masked phone values will be rejected, and re-sending read values can wipe or corrupt phone fields. It also discloses that email/tenant/examineeId cannot be changed, which goes well beyond the annotation hints.

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 dense but each clause earns its place: it identifies the identifier, lists editable and immutable fields, and gives a critical operational warning. Slightly on the long side, but the length is justified given the destructive behavior that the agent must understand to avoid data loss.

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 a nested-object parameter, a destructive warning, and an output schema, the description covers all needed decision points: which fields are mutable, what validation applies to customData, and the replace semantics. Nothing essential is missing for an agent to call it correctly.

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 provides descriptions for every parameter, including enum options, regex/E.164 requirements, and detailed customData semantics. The description reinforces the replacement semantics and the don't-resend warning, which is valuable, but it adds marginal net value because the schema already carries the full load (100% coverage).

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 ('Update an examinee'), identifies it by examineeId, and clearly names which fields are editable vs immutable. The description also references list_examinees as the source of the business ID, which helps distinguish its purpose from sibling tools like get_examinee and list_examinees.

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?

Explicitly lists editable fields (name, status, customData) and immutable fields (email, tenant, examineeId), and warns against re-sending customData read from get_examinee. It also explains that customData must only contain values the user provided, giving concrete when-to-use rules and a critical exclusion.

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

update_formAInspect

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.

ParametersJSON Schema
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/suggestionsTemplate/hideOverallScore) replaces overallAnalysis; passing dimensionAnalysis replaces the dimension list (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); 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>). 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

ParametersJSON Schema
NameRequiredDescription
idNoForm id
sceneNoknowledge_quiz / scored_quiz / outcome_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.6/5.0
Behavior5/5

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

Beyond the annotations, the description discloses meaningful behaviors: report and openGraph merge by sub-key, systemText is replaced wholesale, empty strings clear image/og fields, language changes are restricted while translations exist, scene is never changeable, outcome removal can be rejected, and landingImage only sets the image—it does not toggle the landing page. These are exactly the behaviors an agent needs to predict 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.

Conciseness4/5

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

The description is dense but efficient: it starts with the field inventory and then groups related behavioral rules in a logical order (images, merge semantics, scene constraints, sub-resource routing). It is a single block of text without bullets or headings, so slightly harder to parse, but every sentence carries needed guidance and nothing is wasted.

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 complex tool with 11 parameters, nested report/openGraph objects, scene-specific rules, and an output schema, the description plus the fully-described schema cover media handling, merge semantics, clearing behavior, language restrictions, and alternative sibling tools. The output schema handles return-value expectations, so nothing critical is missing for safe invocation.

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 every parameter well. The description adds cross-parameter semantics not obvious from individual schemas: the shared media-source convention (finalize_image_upload ID, media URL, or empty string), the merge-vs-replace distinction between report/openGraph and systemText, and the scene-specific outcome behavior. That is valuable added meaning on top of 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?

The description opens with a specific verb+resource statement — 'Update a form of the current team' — and explicitly enumerates the fields it handles: title, description, isActive, flagImg, landingImage, theme, report, openGraph, language, systemText. It also distinguishes itself from sibling tools by directing questions to add_question/update_question/delete_question/move_question and dimensionAnalysis to set_dimension_analysis. This makes the tool's scope unmistakable.

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 clearly identifies the form-level update use case and explicitly tells agents which sibling tools to use for sub-resources (questions, dimensionAnalysis), so the agent is routed correctly for those cases. It does not explicitly compare with update_form_settings, but the precise field list and sub-resource routing make the intended usage context clear.

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

update_form_settingsAInspect

Change how a form of the current team is delivered, as opposed to what it says (use update_form for title / questions / report / theme). Editable: submissionAccess (who may answer and whether seeing the report needs a login — this is the lead-capture gate), reportGateRequireCode (whether that login gate collects an emailed verification code, trading completion rate against lead quality), timeLimit, sharing (the result-page share button and personalised share card, which is what drives organic spread), answerSheet, booking (the result-page booking block that feeds the 1:1 call queue), gaTrackingId, sharedWithAll (whether every team member can see this form), and slug (the custom path that gives the public link a memorable, SEO-friendly address). Only the keys you pass are changed. Read the current values with get_form_share_info.

ParametersJSON Schema
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. The bookable hours live in the team's booking settings, not here — this is only the switch and the copy. Bookings that come in are handled with list_bookings / review_booking.
sharingNoResult-page sharing: the share button, the personalised share card and the public summary. Turning this off stops respondents spreading their results.
timeLimitNoAnswer-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.
answerSheetNoThe answer-sheet sidebar on the answering page
gaTrackingIdNoGoogle Analytics measurement id (G-XXXXXX) or Universal Analytics id (UA-XXXX-Y). Pass an empty string to clear.
sharedWithAllNoWhether every member of the team can see and open this form
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); examinee_only = a login is required before answering at all
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

ParametersJSON 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, booking, gaTrackingId, sharedWithAll }; get_form_share_info adds the team-level examineeSignupDisabled (respondent self-signup off = a login-gated quiz turns away anyone not on the roster)

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already signal this is a mutating call (readOnlyHint=false), and the description adds meaningful non-obvious behavior: partial updates, the lead-capture trade-off for submissionAccess/reportGateRequireCode, and the sharing/booking effects. It does not cover side effects like slug breakage, but the schema already documents that.

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 the tool has 10 parameters and nested objects. The first clause front-loads the main purpose and sibling distinction, and the long list of editable fields is dense rather than 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?

Given the output schema, 100% schema coverage, and annotations, nothing essential is missing: it names the sibling for content edits, points to the read tool for current values, and explains the conceptual role of every mutable 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?

Schema coverage is 100%, so the schema carries the formal parameter details. The description still adds semantic context beyond the schema by framing fields as lead-capture gates, completion-rate trade-offs, organic-spread drivers, and 1:1-call queue feeders, which helps an agent choose correct values.

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 names a specific verb and resource ('Change how a form of the current team is delivered') and immediately contrasts it with update_form, which handles content. It also enumerates the editable fields, so an agent can tell exactly what this tool is for.

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 routes content edits to update_form ('use update_form for title / questions / report / theme') and tells the agent to read current values with get_form_share_info. The partial-update note ('Only the keys you pass are changed') also sets clear invocation expectations.

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

update_form_translationAInspect

Save translated copy for one language version of a form. Pass the translated title / description / fields / report / systemText / booking, mirroring the shape returned by get_form_translation; fields you omit keep their current value and partial translation is allowed. Translation fields[] must not introduce codes that do not exist on the source form. Pass isActive=false to pause just this language version, independently of the form's overall isActive.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoTranslated form title
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.
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.
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

Output Schema

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

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the annotations by explaining the update model: omitted fields keep current value, partial translation is allowed, isActive is independent of the form's overall flag, and invalid field codes are rejected. It also discloses subtle behaviors such as keys being stored but never rendered, placeholders needing to stay intact, source levels being matched by position when no id exists, and scores/formulas/thresholds always coming from the source. No contradiction with the annotations exists.

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 dense sentences: purpose first, then payload/mirroring and merge semantics, then the isActive behavior. Every sentence adds decision-relevant information, and none restates the schema. The pronoun and structure are efficient despite the tool's high complexity.

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 the tool's complexity — nine parameters, deeply nested objects, matching rules, and fallback behavior — the definition is remarkably complete. It explains merge-by-code, position fallback, source-of-truth behavior for non-text fields, and how to pause a language. The only notable gap is not explicitly stating that a language version must already exist and that create_form_translation should be used to create a new one. With an output schema present, return-value documentation is not needed.

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 exceptionally high, so the schema already documents every parameter in depth. The top-level description adds useful cross-cutting meaning: the whole payload mirrors get_form_translation's shape, omitted fields keep current values, and partial translation is allowed. Since the schema itself carries the detailed per-field semantics, a 4 appropriately credits the description's added context without overstating it.

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 starts with a specific, action-oriented purpose: 'Save translated copy for one language version of a form.' It names the affected resource (a form translation) and immediately distinguishes this update operation from general form editing by listing the translation-specific sections: title, description, fields, report, systemText, booking. This is easily distinguishable from siblings like update_form or 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 gives clear operational guidance: pass the translated shape mirrored from get_form_translation, omit fields to keep current values, partial translation is allowed, and isActive=false pauses the language independently. The schema adds that the draft should come from get_form_translation or the clone returned by create_form_translation. What is missing is an explicit sentence telling the agent to use create_form_translation first when the language version does not exist yet; this is implied by the update semantics but not stated.

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

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

ParametersJSON Schema
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

ParametersJSON Schema
NameRequiredDescription
leadIdNoThe lead that was moved
statusNoStatus code after the move

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses that the change is recorded on the lead's timeline and that status codes are team-defined, adding meaningful behavioral context beyond the annotations. It does not describe rollback or error behavior, but the annotations already mark it as a non-destructive mutation.

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 short, valuable sentences: first states the action and example, second adds the timeline effect, third gives the crucial prerequisite. No redundant filler, and all essential information is front-loaded.

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 2-parameter mutation tool with a complete output schema and full schema description coverage, the description covers purpose, scope, prerequisite, and behavioral side effects. Nothing critical is missing for an agent to call 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?

The input schema already documents leadId and status thoroughly, and the description adds an important extra dimension: status codes are team-defined and must be obtained dynamically from list_lead_settings. This goes beyond the schema by emphasizing that magic values must never be guessed.

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 operation as moving one lead to another follow-up status, with a concrete example (new → contacted). It distinguishes this tool from siblings like set_lead_tags and add_lead_comment by focusing on the lead's status field.

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 tells the agent to call list_lead_settings first to obtain valid status codes, and warns never to guess. This gives clear contextual guidance, even though it doesn't explicitly mention alternative tools for status changes.

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

update_questionAInspect

Update a single question of an existing form, located by code. Changeable: name / description / explain / required / score / correctAnswer / aiMatch (FillBlank AI grading) / precision (DateField/TimeField picker precision) / min / max / unit / decimalPlaces (NumberField) / words (Rate scale labels) / choices (replaces ALL choices of a choice-based question). NOT changeable — delete_question then add_question instead: question type, Rate steps, DropDown multiple, Ordering shuffle. DateField / TimeField / Rate reject score / correctAnswer / aiMatch (configure date/time scoring in the web app). The scored_quiz and outcome_quiz scenes reject the top-level score / correctAnswer / aiMatch as well: pass choices carrying choices[i].score or choices[i].outcomes instead (TrueFalse outcome votes still need delete + recreate). 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.

ParametersJSON Schema
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. 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.
requiredNoWhether the question is required
precisionNoDateField / TimeField only: new picker precision. DateField accepts year | month | day | hour | minute | second; TimeField accepts only minute | second. 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. 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

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

TDQS

A4.8/5.0
Behavior5/5

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

With annotations of all false (readOnlyHint, openWorldHint, destructiveHint), the description carries the full behavioral burden and does so thoroughly. It discloses that choices 'replaces ALL choices', that Swiper 'replacing all slides' causes fresh ids invalidating translated slide titles/notes, and that scored_quiz/outcome_quiz reject top-level score/correctAnswer/aiMatch in favor of choices[i].score/outcomes. It also notes display blocks reject every question key and that content cannot be emptied. 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.

Conciseness4/5

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

The description is long, but the tool is complex and every clause carries necessary information: the changeable list, the explicit non-changeable list, scene-specific rejections, and display-block rules. It is front-loaded with the core action and then organized by constraint category, though it remains a dense single paragraph rather than a lightly scannable structure.

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 20-parameter, scene-dependent mutation tool, the description covers the essential selection logic: what can be changed, what requires delete+recreate, which scenes reject which fields, and how display blocks are handled. Combined with the fully documented schema and the output schema, nothing critical is missing for an agent to select and invoke this tool 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 description coverage is 100%, so the baseline is 3. The description adds cross-cutting parameter semantics beyond the schema: it groups parameters by question type, explains scene-specific rejections, clarifies that choices replacement requires preserving codes to keep identity, and states display blocks accept only their own keys. This is meaningful added value, though individual parameter details are already well-covered by 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?

The description opens with a specific action and resource: 'Update a single question of an existing form, located by code.' It enumerates exactly which fields are changeable, distinguishes the tool from add_question/delete_question for non-changeable aspects, and extends scope to display blocks with their own keys. This makes the tool's purpose and boundaries 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 explicitly states when NOT to use it: 'NOT changeable — delete_question then add_question instead' for question type, Rate steps, DropDown multiple, and Ordering shuffle. It also routes TrueFalse outcome votes to delete + recreate, and directs date/time scoring configuration to the web app. These explicit alternatives leave no ambiguity about when this tool is the right choice.

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

update_tenant_slugAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesThe new team address

Output Schema

ParametersJSON Schema
NameRequiredDescription
slugNoThe new team address — the first path segment of every platform-domain quiz link
tenantIdNoThe team that was renamed

TDQS

A4.5/5.0
Behavior5/5

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

The description substantially discloses behavior beyond the annotations: changing the slug 'moves EVERY public quiz link of the team at once', the old address stops resolving, and cached entries may linger. It also mentions permissions, uniqueness, and inability to clear the slug. No contradiction exists with 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?

The description is dense but every sentence adds necessary context: primary effect, meaning of the field, permissions, format constraints, uniqueness, destructive link consequences, and read alternative. The core action is front-loaded, and nothing is 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 single-parameter mutation tool, the description explains the full call surface: the effect, validation requirements, ownership requirements, secondary impacts, and the alternative read tool. Since an output schema exists, documenting return values in prose is not necessary.

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 provides the only parameter with 100% description coverage, so the baseline is 3. The description adds genuinely useful format rules such as lowercase letters, digits, hyphens, underscores, 4–32 characters, and start/end constraints, which go beyond the schema phrase 'the new team address'.

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 names the exact verb ('change the team address') and a concrete resource ('of the current team'), then defines precisely what a team address is: 'the first path segment of every quiz link'. It clearly differentiates this tool from siblings like get_active_tenant and broader update tools.

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 states who can perform the action (owner/admin only) and when it is appropriate: 'a rare, deliberate rename — not routine tuning'. It also routes reads to get_active_tenant. It lacks a more explicit list of when-not-to-use 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 6 tool updates
    • Changedadd_question5 fields changed
      • addedInput schema / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / choices / items / properties / children / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / choices / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / falseDimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene + TrueFalse only: the points answering \"false\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / trueDimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene + TrueFalse only: the points answering \"true\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.",
        +  "type": "object"
        +}
    • Changedcreate_form13 fields changed
      • addedInput schema / properties / questions / items / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / questions / items / properties / choices / items / properties / children / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / questions / items / properties / choices / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / questions / items / properties / falseDimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene + TrueFalse only: the points answering \"false\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / questions / items / properties / trueDimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene + TrueFalse only: the points answering \"true\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.",
        +  "type": "object"
        +}
      • changedInput schema / properties / report / properties / dimensionAnalysis / description
        Previous value: -"Multi-dimension analysis (radar chart + per-dimension breakdown). Each dimension gets a server-generated code returned in structuredContent. In the knowledge_quiz scene set fieldCodes per dimension; in the scored_quiz scene set a formula. Dimensions reference question codes: if you set custom question codes you can configure dimensions in the same create_form call; otherwise create the questions first, then get_form to read the auto-generated codes."New value: +"Multi-dimension analysis (radar chart + per-dimension breakdown). Each dimension has a stable code (pass dimensions[].code or let the server generate one; returned in structuredContent). In the knowledge_quiz scene set fieldCodes per dimension. In the scored_quiz scene every dimension needs a formula over question codes (e.g. `{{q1}} + {{q2}}`); a question may override its score for one dimension via choices[i].dimensionScores, otherwise the formula uses its plain choice score. If you set custom question codes you can configure everything in one create_form call; otherwise create the questions first, then get_form to read the auto-generated codes."
      • addedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / code
        Added value: +{
        +  "description": "Optional stable identifier for the dimension (same rules as question codes: starts with a letter or underscore, letters/digits/underscores only). Set it when questions reference the dimension via choices[i].dimensionScores in the same create_form call. When updating, pass the existing code to keep it; if omitted, a dimension with the same name keeps its current code, otherwise one is generated.",
        +  "maxLength": 64,
        +  "type": "string"
        +}
      • changedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / fieldCodes / description
        Previous value: -"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene."New value: +"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene, where the formula decides which questions count."
      • changedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / formula / description
        Previous value: -"Required in the scored_quiz scene: the dimension score formula. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene."New value: +"Required in the scored_quiz scene: the dimension score formula, usually the sum of the questions in this dimension. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Inside a dimension formula `{{q}}` is the question's score for THIS dimension: its choices[i].dimensionScores override when set, otherwise the plain choice score. A dimension formula cannot reference other dimensions (only report.formula can). Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene."
      • changedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / standardScore / description
        Previous value: -"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). Default 0."New value: +"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). When omitted in the scored_quiz scene it defaults to the attainable maximum: the formula evaluated with every referenced question at its highest score for this dimension (choices[i].dimensionScores override, else the choice score); 0 when that cannot be estimated, e.g. the formula uses NumberField / date questions. knowledge_quiz defaults to 0."
      • changedInput schema / properties / report / properties / formula / description
        Previous value: -"Total-score formula for the scored_quiz scene, and the ONLY source of the overall score there — summing question scores is the knowledge_quiz rule, so a scored_quiz without this formula scores null and no level ever matches. Required whenever levels are set. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` for custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ); every referenced code must exist in the current form. Setting dimension formulas does NOT cover this — the overall formula is separate."New value: +"Total-score formula for the scored_quiz scene, and the ONLY source of the overall score there — summing question scores is the knowledge_quiz rule, so a scored_quiz without this formula scores null and no level ever matches. Required whenever levels are set. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` for custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. It may also reference dimension codes the same way (e.g. `{{dim_d}} * 2 + {{dim_i}}`): dimensions are computed first, so the overall score can be a weighted sum of dimension scores; a dimension referenced here cannot be removed later. Supported operators: + - * / ( ); every referenced code must exist in the current form (questions and dimensions). Setting dimension formulas does NOT cover this — the overall formula is separate."
      • changedInput schema / properties / report / properties / levels / items / properties / cta / properties / newWindow / description
        Previous value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window."
      • changedInput schema / properties / report / properties / outcomes / items / properties / cta / properties / newWindow / description
        Previous value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window."
    • Changedinsert_question5 fields changed
      • addedInput schema / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / choices / items / properties / children / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / choices / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / falseDimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene + TrueFalse only: the points answering \"false\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / trueDimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene + TrueFalse only: the points answering \"true\" adds to each dimension, as a map of dimension code → score (same semantics as choices[i].dimensionScores). Rejected for other question types / scenes.",
        +  "type": "object"
        +}
    • Changedset_dimension_analysis4 fields changed
      • addedInput schema / properties / dimensions / items / properties / code
        Added value: +{
        +  "description": "Optional stable identifier for the dimension (same rules as question codes: starts with a letter or underscore, letters/digits/underscores only). Set it when questions reference the dimension via choices[i].dimensionScores in the same create_form call. When updating, pass the existing code to keep it; if omitted, a dimension with the same name keeps its current code, otherwise one is generated.",
        +  "maxLength": 64,
        +  "type": "string"
        +}
      • changedInput schema / properties / dimensions / items / properties / fieldCodes / description
        Previous value: -"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene."New value: +"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene, where the formula decides which questions count."
      • changedInput schema / properties / dimensions / items / properties / formula / description
        Previous value: -"Required in the scored_quiz scene: the dimension score formula. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene."New value: +"Required in the scored_quiz scene: the dimension score formula, usually the sum of the questions in this dimension. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Inside a dimension formula `{{q}}` is the question's score for THIS dimension: its choices[i].dimensionScores override when set, otherwise the plain choice score. A dimension formula cannot reference other dimensions (only report.formula can). Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene."
      • changedInput schema / properties / dimensions / items / properties / standardScore / description
        Previous value: -"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). Default 0."New value: +"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). When omitted in the scored_quiz scene it defaults to the attainable maximum: the formula evaluated with every referenced question at its highest score for this dimension (choices[i].dimensionScores override, else the choice score); 0 when that cannot be estimated, e.g. the formula uses NumberField / date questions. knowledge_quiz defaults to 0."
    • Changedupdate_form9 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; passing dimensionAnalysis replaces it (an empty dimensions array clears it); 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); 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/hideOverallScore) replaces overallAnalysis; passing dimensionAnalysis replaces the dimension list (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); 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)."
      • changedInput schema / properties / report / properties / dimensionAnalysis / description
        Previous value: -"Multi-dimension analysis (radar chart + per-dimension breakdown). Each dimension gets a server-generated code returned in structuredContent. In the knowledge_quiz scene set fieldCodes per dimension; in the scored_quiz scene set a formula. Dimensions reference question codes: if you set custom question codes you can configure dimensions in the same create_form call; otherwise create the questions first, then get_form to read the auto-generated codes."New value: +"Multi-dimension analysis (radar chart + per-dimension breakdown). Each dimension has a stable code (pass dimensions[].code or let the server generate one; returned in structuredContent). In the knowledge_quiz scene set fieldCodes per dimension. In the scored_quiz scene every dimension needs a formula over question codes (e.g. `{{q1}} + {{q2}}`); a question may override its score for one dimension via choices[i].dimensionScores, otherwise the formula uses its plain choice score. If you set custom question codes you can configure everything in one create_form call; otherwise create the questions first, then get_form to read the auto-generated codes."
      • addedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / code
        Added value: +{
        +  "description": "Optional stable identifier for the dimension (same rules as question codes: starts with a letter or underscore, letters/digits/underscores only). Set it when questions reference the dimension via choices[i].dimensionScores in the same create_form call. When updating, pass the existing code to keep it; if omitted, a dimension with the same name keeps its current code, otherwise one is generated.",
        +  "maxLength": 64,
        +  "type": "string"
        +}
      • changedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / fieldCodes / description
        Previous value: -"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene."New value: +"Required in the knowledge_quiz scene: the question codes this dimension covers (dimension score = sum of these field scores). Each code must exist in the form. Ignored in the scored_quiz scene, where the formula decides which questions count."
      • changedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / formula / description
        Previous value: -"Required in the scored_quiz scene: the dimension score formula. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene."New value: +"Required in the scored_quiz scene: the dimension score formula, usually the sum of the questions in this dimension. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` when you set custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Inside a dimension formula `{{q}}` is the question's score for THIS dimension: its choices[i].dimensionScores override when set, otherwise the plain choice score. A dimension formula cannot reference other dimensions (only report.formula can). Supported operators: + - * / ( ). Ignored in the knowledge_quiz scene."
      • changedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / standardScore / description
        Previous value: -"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). Default 0."New value: +"Standard score (the radar-chart standard line; in the scored_quiz scene it also acts as the dimension full mark). When omitted in the scored_quiz scene it defaults to the attainable maximum: the formula evaluated with every referenced question at its highest score for this dimension (choices[i].dimensionScores override, else the choice score); 0 when that cannot be estimated, e.g. the formula uses NumberField / date questions. knowledge_quiz defaults to 0."
      • changedInput schema / properties / report / properties / formula / description
        Previous value: -"Total-score formula for the scored_quiz scene, and the ONLY source of the overall score there — summing question scores is the knowledge_quiz rule, so a scored_quiz without this formula scores null and no level ever matches. Required whenever levels are set. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` for custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. Supported operators: + - * / ( ); every referenced code must exist in the current form. Setting dimension formulas does NOT cover this — the overall formula is separate."New value: +"Total-score formula for the scored_quiz scene, and the ONLY source of the overall score there — summing question scores is the knowledge_quiz rule, so a scored_quiz without this formula scores null and no level ever matches. Required whenever levels are set. Question codes must be wrapped in `{{code}}` (e.g. `{{q1}} + {{q2}}` for custom question codes, or `{{__field_abc}} + {{__field_def}}` for auto-generated ones); bare codes are rejected. It may also reference dimension codes the same way (e.g. `{{dim_d}} * 2 + {{dim_i}}`): dimensions are computed first, so the overall score can be a weighted sum of dimension scores; a dimension referenced here cannot be removed later. Supported operators: + - * / ( ); every referenced code must exist in the current form (questions and dimensions). Setting dimension formulas does NOT cover this — the overall formula is separate."
      • changedInput schema / properties / report / properties / levels / items / properties / cta / properties / newWindow / description
        Previous value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window."
      • changedInput schema / properties / report / properties / outcomes / items / properties / cta / properties / newWindow / description
        Previous value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window."
    • Changedupdate_question3 fields changed
      • addedInput schema / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / choices / items / properties / children / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
      • addedInput schema / properties / choices / items / properties / dimensionScores
        Added value: +{
        +  "additionalProperties": {
        +    "maximum": 100,
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "description": "scored_quiz scene only: the points this choice adds to each dimension when selected, as a map of dimension code → score, e.g. { \"dim_d\": 3, \"dim_i\": 1 }. Any choice carrying it switches the question to per-dimension scoring: for each dimension the question contributes the selected choices' scores for that dimension (a dimension not listed on the chosen choice counts 0), and a dimension without a formula automatically sums these contributions across questions. Codes must exist in report.dimensionAnalysis.dimensions — give dimensions[].code and reference them in the same create_form call. `score` remains the overall score fed to report.formula. Rejected in the knowledge_quiz / outcome_quiz scenes.",
        +  "type": "object"
        +}
  2. 2 tool updates
    • Changedcreate_form1 field changed
      • changedInput schema / properties / report / properties / hideOverallScore / description
        Previous value: -"Hide the overall score on the result page (the score ring / number / percentile), keeping the level name, level description and summary. Scored scenes only (ignored for outcome). Default false."New value: +"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."
    • Changedupdate_form1 field changed
      • changedInput schema / properties / report / properties / hideOverallScore / description
        Previous value: -"Hide the overall score on the result page (the score ring / number / percentile), keeping the level name, level description and summary. Scored scenes only (ignored for outcome). Default false."New value: +"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."
  3. 1 tool update
    • Changedupdate_form_settings1 field changed
      • changedInput schema / properties / timeLimit / description
        Previous value: -"Answer-time countdown"New 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."
  4. 1 tool update
    • Changedupdate_form_translation3 fields changed
      • addedInput schema / properties / fields / items / properties / explain
        Added value: +{
        +  "description": "Knowledge quiz: translated answer explanation shown in the answer review.",
        +  "type": "string"
        +}
      • addedInput schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / levels / items / properties / cta
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Only the CTA button text is translatable; the link and its settings come from the source.",
        +  "properties": {
        +    "text": {
        +      "description": "Translated CTA button text.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / report / properties / overallAnalysis / properties / levels / items / properties / cta
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Only the CTA button text is translatable; the link and its settings come from the source.",
        +  "properties": {
        +    "text": {
        +      "description": "Translated CTA button text.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
  5. 1 tool update
    • Changedinvite_member1 field changed
      • changedInput schema / properties / role / description
        Previous value: -"Role to grant. Defaults to \"member\". \"admin\" can only be granted by the team owner."New value: +"Role to grant. Defaults to \"member\": \"viewer\" is read-only, \"admin\" manages the whole team. Cannot be \"owner\"."
  6. 5 tool updates
    • Changedadd_question5 fields changed
      • changedInput schema / description
        Previous value: -"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`. 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`. 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`). 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 are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."New value: +"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`. 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`). 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 are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."
      • addedInput schema / properties / content
        Added value: +{
        +  "description": "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.",
        +  "maxLength": 5000,
        +  "type": "string"
        +}
      • addedInput schema / properties / items
        Added value: +{
        +  "description": "Swiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Optional slide note. Web editor only, same as title.",
        +        "maxLength": 1000,
        +        "type": "string"
        +      },
        +      "image": {
        +        "description": "The slide image: a media ID returned by finalize_image_upload, or the media URL of an image already in this team library. Required — the answer page renders the images and nothing else.",
        +        "type": "string"
        +      },
        +      "title": {
        +        "description": "Optional slide label. Shown in the web editor only (the answer page renders the image), and translatable per language.",
        +        "maxLength": 200,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "image"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 10,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"Question type; Breaker means a page break, no name/choices etc. needed"New value: +"Question type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer"
      • changedInput schema / properties / type / enum
        Previous value: -[
        -  "SingleCheck",
        -  "MultiCheck",
        -  "TrueFalse",
        -  "FillBlank",
        -  "DateField",
        -  "TimeField",
        -  "NumberField",
        -  "Rate",
        -  "DropDown",
        -  "Cascade",
        -  "Ordering",
        -  "Breaker"
        -]New value: +[
        +  "SingleCheck",
        +  "MultiCheck",
        +  "TrueFalse",
        +  "FillBlank",
        +  "DateField",
        +  "TimeField",
        +  "NumberField",
        +  "Rate",
        +  "DropDown",
        +  "Cascade",
        +  "Ordering",
        +  "Breaker",
        +  "Statement",
        +  "Swiper"
        +]
    • Changedcreate_form6 fields changed
      • changedInput schema / properties / questions / description
        Previous value: -"Optional. 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 only); Ordering (quiz only, correctAnswer = all choices in the correct order); DateField/TimeField as unscored data-collection fields (scored_quiz only); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the 1..steps rating value is the question score unless per-star scores are set in the web app). Insert a page break with { type: \"Breaker\" }, which the AI can interleave between questions to paginate. At most 100 items."New value: +"Optional. 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 only); Ordering (quiz only, correctAnswer = all choices in the correct order); DateField/TimeField as unscored data-collection fields (scored_quiz only); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the 1..steps rating value is the question score unless per-star scores are set in the web app). 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."
      • changedInput schema / properties / questions / items / description
        Previous value: -"One question, or a page break. 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`. 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`. 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`). 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 are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."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`. 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`). 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 are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."
      • addedInput schema / properties / questions / items / properties / content
        Added value: +{
        +  "description": "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.",
        +  "maxLength": 5000,
        +  "type": "string"
        +}
      • addedInput schema / properties / questions / items / properties / items
        Added value: +{
        +  "description": "Swiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Optional slide note. Web editor only, same as title.",
        +        "maxLength": 1000,
        +        "type": "string"
        +      },
        +      "image": {
        +        "description": "The slide image: a media ID returned by finalize_image_upload, or the media URL of an image already in this team library. Required — the answer page renders the images and nothing else.",
        +        "type": "string"
        +      },
        +      "title": {
        +        "description": "Optional slide label. Shown in the web editor only (the answer page renders the image), and translatable per language.",
        +        "maxLength": 200,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "image"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 10,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / questions / items / properties / type / description
        Previous value: -"Question type; Breaker means a page break (the frontend pushes subsequent questions to the next page), no name/choices etc. needed"New value: +"Question type; Breaker means a page break (the frontend pushes subsequent questions to the next page), no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer"
      • changedInput schema / properties / questions / items / properties / type / enum
        Previous value: -[
        -  "SingleCheck",
        -  "MultiCheck",
        -  "TrueFalse",
        -  "FillBlank",
        -  "DateField",
        -  "TimeField",
        -  "NumberField",
        -  "Rate",
        -  "DropDown",
        -  "Cascade",
        -  "Ordering",
        -  "Breaker"
        -]New value: +[
        +  "SingleCheck",
        +  "MultiCheck",
        +  "TrueFalse",
        +  "FillBlank",
        +  "DateField",
        +  "TimeField",
        +  "NumberField",
        +  "Rate",
        +  "DropDown",
        +  "Cascade",
        +  "Ordering",
        +  "Breaker",
        +  "Statement",
        +  "Swiper"
        +]
    • Changedinsert_question5 fields changed
      • changedInput schema / description
        Previous value: -"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`. 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`. 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`). 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 are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."New value: +"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`. 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`). 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 are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."
      • addedInput schema / properties / content
        Added value: +{
        +  "description": "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.",
        +  "maxLength": 5000,
        +  "type": "string"
        +}
      • addedInput schema / properties / items
        Added value: +{
        +  "description": "Swiper only, and required there: the carousel slides in display order, 1-10 of them. Upload the images with prepare_image_upload / finalize_image_upload first and pass the returned media IDs. Rejected for every other type.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Optional slide note. Web editor only, same as title.",
        +        "maxLength": 1000,
        +        "type": "string"
        +      },
        +      "image": {
        +        "description": "The slide image: a media ID returned by finalize_image_upload, or the media URL of an image already in this team library. Required — the answer page renders the images and nothing else.",
        +        "type": "string"
        +      },
        +      "title": {
        +        "description": "Optional slide label. Shown in the web editor only (the answer page renders the image), and translatable per language.",
        +        "maxLength": 200,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "image"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 10,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"Question type; Breaker means a page break, no name/choices etc. needed"New value: +"Question type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer"
      • changedInput schema / properties / type / enum
        Previous value: -[
        -  "SingleCheck",
        -  "MultiCheck",
        -  "TrueFalse",
        -  "FillBlank",
        -  "DateField",
        -  "TimeField",
        -  "NumberField",
        -  "Rate",
        -  "DropDown",
        -  "Cascade",
        -  "Ordering",
        -  "Breaker"
        -]New value: +[
        +  "SingleCheck",
        +  "MultiCheck",
        +  "TrueFalse",
        +  "FillBlank",
        +  "DateField",
        +  "TimeField",
        +  "NumberField",
        +  "Rate",
        +  "DropDown",
        +  "Cascade",
        +  "Ordering",
        +  "Breaker",
        +  "Statement",
        +  "Swiper"
        +]
    • Changedmove_question1 field changed
      • changedInput schema / properties / code / description
        Previous value: -"The field code to move (a question or a Breaker)"New value: +"The field code to move (a question, a Breaker or a display block)"
    • Changedupdate_question2 fields changed
      • addedInput schema / properties / content
        Added value: +{
        +  "description": "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.",
        +  "maxLength": 5000,
        +  "type": "string"
        +}
      • addedInput schema / properties / items
        Added value: +{
        +  "description": "Swiper 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.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "description": {
        +        "description": "Optional slide note. Web editor only, same as title.",
        +        "maxLength": 1000,
        +        "type": "string"
        +      },
        +      "image": {
        +        "description": "The slide image: a media ID returned by finalize_image_upload, or the media URL of an image already in this team library. Required — the answer page renders the images and nothing else.",
        +        "type": "string"
        +      },
        +      "title": {
        +        "description": "Optional slide label. Shown in the web editor only (the answer page renders the image), and translatable per language.",
        +        "maxLength": 200,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "image"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 10,
        +  "minItems": 1,
        +  "type": "array"
        +}
  7. 48 tool updates
    • First observedadd_lead_comment
    • First observedadd_question
    • First observedassign_leads
    • First observedcreate_form
    • First observedcreate_form_from_template
    • First observedcreate_form_translation
    • First observeddelete_form
    • First observeddelete_form_translation
    • First observeddelete_question
    • First observedduplicate_form
    • First observedfinalize_image_upload
    • First observedget_active_tenant
    • First observedget_booking_availability
    • First observedget_examinee
    • First observedget_form
    • First observedget_form_funnel
    • First observedget_form_share_info
    • First observedget_form_stats
    • First observedget_form_translation
    • First observedget_lead
    • First observedget_record
    • First observedinsert_question
    • First observedinvite_member
    • First observedlist_bookings
    • First observedlist_examinees
    • First observedlist_form_translations
    • First observedlist_forms
    • First observedlist_lead_settings
    • First observedlist_leads
    • First observedlist_my_tenants
    • First observedlist_records
    • First observedlist_templates
    • First observedmove_question
    • First observedprepare_image_upload
    • First observedreschedule_booking
    • First observedrestore_form
    • First observedreview_booking
    • First observedset_dimension_analysis
    • First observedset_lead_tags
    • First observedswitch_active_tenant
    • First observedupdate_booking_status
    • First observedupdate_examinee
    • First observedupdate_form
    • First observedupdate_form_settings
    • First observedupdate_form_translation
    • First observedupdate_lead
    • First observedupdate_question
    • First observedupdate_tenant_slug

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    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.
    52
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables creating and administering multiple quizzes, adding questions, registering participants, validating answers, reviewing responses, and managing leaderboards through MCP, accessible locally via stdio or remotely over HTTP.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI clients to create, manage, and configure Roo smart shortlinks and their add-ons, such as QR codes, scheduled redirects, and webhooks, through MCP tools.
    14
    344
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.2/5.0
Disambiguation4/5

Most tools have clearly distinct purposes, especially the form, question, and translation families. The main ambiguity is between the lead/record tools: list_leads/get_lead vs list_records/get_record both describe entities as 'leads' even though one is the CRM lead and the other is the submission record. update_form vs update_form_settings is also a minor naming overlap, but the descriptions resolve it.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern: get_*, list_*, create_*, update_*, delete_*, add_*, set_*, etc. Even paired image upload tools follow the same convention with prepare_/finalize_. There is no camelCase or mixed verb-style chaos.

Tool Count2/5

48 tools is far above the 25-tool threshold for a heavy tool surface. While the server covers a broad platform (forms, translations, leads, bookings, examinees, tenants, images), the sheer number will burden an agent's tool-selection step. Each tool may earn its place, but the overall set is too large for easy navigation.

Completeness4/5

The toolset provides solid lifecycle coverage for forms, questions, translations, leads, bookings, examinees, and tenant administration. Minor gaps exist, such as no lead deletion/export and no way to create or delete examinees, but agents can work around these for the core quiz-and-CRM workflow. The form/translation/question CRUD surface is especially thorough.

Resources