Skip to main content
Glama

Server Details

Create and manage quizzes, question banks, and translations; capture and manage leads, respondents, and bookings; and pull stats and funnel analytics on RooQuiz — a lightweight assessment platform for lead capture and viral sharing.

Ownership verified
Status
Healthy
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.9/5.0
Behavior5/5

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

The annotations only say readOnlyHint=false and destructiveHint=false, which is minimal. The description adds valuable behavioral context: notes are visible to team members only, never to the respondent, max length is 2000 characters, and the operation is not idempotent — a timeout may still mean success, so blind retries can create duplicates. This goes 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 efficiently structured: purpose and visibility first, then constraint, optional parameter context, read alternative, and idempotency warning. Every sentence adds information and no space 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 write tool with an output schema, the description covers all necessary context: what the operation does, visibility rules, constraints, how to read existing notes, and the retry hazard. The agent has enough information to correctly invoke the tool and handle unusual outcomes.

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 extra nuance by explaining that recordId is optional 'context' about the submission, which clarifies its role more practically than the schema's phrasing. It also reinforces the body length limit in line with the schema's maxLength.

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 action ('Write an internal follow-up note on a lead') and the resource ('lead of the current team'), while distinguishing it from sibling tools like update_lead or add_question by specifying it is an internal, team-only comment. The purpose is immediately evident and unambiguous.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool and points to an alternative for related behavior: 'Read existing notes with get_lead(includeComments: true).' It also gives important retry guidance by warning about the non-idempotent timeout behavior and how to handle it, leaving no ambiguity about when or how to retry.

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

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

Annotations say only that the tool is not read-only and not destructive, so the description carries the full burden — and it delivers. The non-idempotency warning ('if the call times out it may still have succeeded... retrying blindly can create a duplicate') is exactly the behavioral disclosure an agent cannot infer. It also clarifies ignore-vs-reject semantics ('other fields are ignored', 'rejected for other question types'), preventing misuse.

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 first sentence names the core operation, and the long body earns its length because the tool genuinely spans 14 enum values and three scoring scenes. The nested parentheticals ('scored via correctAnswer, an unscored data-collection field in scored_quiz') reduce scanability, so a structured per-type summary would be clearer — but nothing in the prose 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 28-parameter tool with nested objects and complex scene/type interactions, the description plus the schema's own field-applicability summary cover every call-shaping decision: per-type required fields, scene restrictions, rejection behavior, and retry safety. An output schema exists, so return-value documentation is appropriately left out of the description's job.

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 one of the 28 parameters, but the description adds cross-field semantics the schema cannot: which fields to omit per type, the correctAnswer-shape dependency on `multiple`, and the scene-level interplay (e.g., 'the submitted number feeds report formulas' for NumberField). This meaningfully raises the value above the baseline 3 that full schema coverage alone earns.

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

Purpose5/5

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

Opens with a specific verb plus resource — 'Append an item to the end of a form' — and pins the position ('end'), which sets it apart from the sibling insert_question without needing to name it. The body then enumerates the 14 item types and contrasts them with display-only blocks, so an agent knows exactly what this tool creates versus 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?

Gives strong situational guidance: prefer DropDown over SingleCheck/MultiCheck past 20 choices, maps each question type and field to its scene (quiz / scored_quiz / outcome_quiz), and routes random_knowledge_quiz bank setup to the web app as an explicit exclusion. It does not name sibling insertion/update tools as alternatives, so the append-vs-insert contrast is implied rather than stated — the only gap from a 5.

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

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

Beyond the annotations, it discloses notable side effects: 'me' or null to unassign, timeline recording for each change, and one aggregated notification for the whole batch. It also sets the member eligibility constraint, which is behavioral context the annotations don't 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 core action and then packs behavioral details into a compact statement. It's slightly longer than necessary but every sentence adds distinct value, with no redundancy or 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 a complete schema, annotations consistently marking mutation/non-destruction, and an output schema present, the description supplies the remaining essential context: batching limits, assignee viability requirement, and side effects. It gives an agent enough information to call the tool correctly in one pass.

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 provides 100% coverage for both parameters, including max 50 and 'me' semantics. The description adds extra meaning by clarifying that omitting or passing null unassigns, and by explaining the batching constraint directly in the tool's workflow rather than only in 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 states a specific verb ('assign') and resource ('leads') and clarifies the dual behavior: assign to a member or clear the assignee. It clearly distinguishes from siblings like update_lead by focusing on the assignment operation and batching rules.

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 actionable usage guidance: pass all lead ids in a single call up to 50, don't loop per lead, and the assignee must be an active non-viewer member. It references list_lead_settings for valid assignees, though it doesn't explicitly mention alternative tools or 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.

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

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

Annotations cover readOnlyHint=false and destructiveHint=false; the description adds crucial behavioral context beyond them: creates primary language only, is not idempotent, timeout may still mean success, and retrying blindly can create duplicates. It also discloses that structuredContent.fields carries question codes and that the user must read them first before filling formulas. This is substantial behavioral disclosure.

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 information-dense but not bloated. It front-loads the key purpose and workflow before diving into scene-specific details, and every sentence carries meaningful guidance. It could arguably be slightly shorter, but the density is justified given the tool's 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?

Given the tool's very high complexity (nested report and question schemas, three scenes, multiple scoring modes) and the fact that an output schema exists, the description covers the essential workflow seams: what must be provided at create time, what must be deferred to update calls, the idempotency warning, and the language restriction. Nothing an agent needs to decide between creating vs. updating is left ambiguous.

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 elevates this by providing cross-parameter workflow semantics (e.g., the relationships between questions codes, report.formula, dimensionAnalysis, and the returned structuredContent). It explains creation-time dependencies that the schema's individual field descriptions cannot express, though much of the parameter meaning is already in 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 and resource ('Create a form in the team this token is bound to') and immediately differentiates itself from sibling tools by noting it passes questions and report configuration in one call rather than per-question follow-ups. It clearly distinguishes the create operation from update_form, set_dimension_analysis, and create_form_translation, which are named explicitly.

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 to use create_form vs. update_form / set_dimension_analysis (fill in formula and dimensionAnalysis afterwards) and vs. create_form_translation (primary language only, add other languages separately). It also gives precise scene-specific guidance (outcome_quiz requires report.outcomes at create time; scored_quiz dimensions must be defined in the same call).

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

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

The description goes far beyond annotations by disclosing that the call clones structure, scoring/report configuration, visual settings, and all language versions in one call. It also surfaces the critical non-idempotency behavior: timeouts may have succeeded, so blind retries can create duplicates. This is exactly the kind of behavioral nuance an agent needs.

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 contributes: what it does, what it copies, how to override the title, where to find template IDs, when to prefer it, and the duplicate-risk caveat. It is front-loaded with the core action and includes no filler.

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

Completeness5/5

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

For a two-parameter creation tool with an output schema, the description covers the essential context: source of IDs, scope of cloning, post-creation workflow, alternatives, and unique failure behavior. The non-idempotency warning addresses the most important edge case an agent could encounter.

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 already 100%, so the schema documents both parameters. The description adds practical meaning by explaining how to discover a templateId via list_templates and how title overrides the template title. This supplements the schema without repeating 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 states a specific verb and resource: 'Create a new form in the current team from a public template.' It further distinguishes this tool from sibling create_form by positioning it as the template-based path, and points to list_templates for ID lookup. This is unambiguous and well-separated from related tools.

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: prefer this when a suitable template exists, versus building from scratch with create_form. It also references list_templates for finding template IDs and mentions post-creation adjustment via update_form / update_question. This effectively routes the agent to the correct tool among many siblings.

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

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

Beyond the annotations, it discloses key behaviors: the source text is cloned into the new version, the result is returned for immediate translation, and code fields must stay identical to the source. This gives the agent a clear model of what happens on invocation.

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 main action and outcome are in the first sentence, followed by essential workflow constraints in the second. No filler or redundant restatement.

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 covers the purpose, constraints, next steps, and relationship to sibling tools. With an output schema present and annotations providing safety cues, nothing critical is 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 documents both formId and language with 100% coverage. The description adds contextual meaning (language must differ, translation is per-language) but does not introduce new parameter details beyond the schema.

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

Purpose5/5

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

The description clearly states the action: add a language version (translation) to a form. It also distinguishes itself from related siblings like update_form_translation and list_form_translations by explaining the cloning and post-save workflow.

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 explicit context: language must differ from primary, at most one translation per language, and the workflow of editing then calling update_form_translation. It also points to list_form_translations for checking existing translations. It could be more explicit about when not to use this tool, but the constraints strongly imply that.

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

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

The annotations already indicate destructive behavior, but the description adds substantial context beyond that: soft delete semantics, 5-day recoverable window, auto-purge behavior, and that submission records are preserved until permanent purge. 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?

Three sentences with the core action front-loaded, followed by recovery, permissions, and data-retention details. Every sentence contributes meaningful information without redundancy.

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

Completeness5/5

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

For a one-parameter soft-delete tool, the description covers the essential context: what happens to the form, how long it remains recoverable, how to restore it, who has permission, and what happens to submissions. The output schema and annotations cover the rest.

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 single parameter formId is already described as 'The form UUID to move to trash.' The description adds the 'current team' scope but otherwise relies on the schema, which is acceptable at the baseline for full 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 precise verb and resource: 'Move a form into the trash (soft delete) in the current team.' It clearly differentiates from siblings like restore_form and delete_form_translation by naming the exact operation and scope.

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 says when to use restore_form as the recovery alternative, notes that the form is hidden from list_forms after deletion, and states the permission requirement (form owner or team owner/admin). This gives clear guidance on when and by whom the tool can be used.

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?

Even though the destructiveHint annotation already marks this as a destructive operation, the description goes further by stating that submission records are anchored to the source form, are not deleted, and that historical reports fall back to the source text. This is exactly the kind of behavioral consequence an agent needs before calling a delete operation.

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

Conciseness5/5

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

Three sentences no unnecessary words. The main action appears immediately, followed by the two most important side-effect insights, then a constraint. Everything is structured for fast parsing by an agent.

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

Completeness5/5

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

The description covers the purpose, the exact scope (per-language translation), the side-effect safety guarantee (submissions not deleted), the report fallback behavior, and the primary-language restriction. With the input schema and output schema present, nothing relevant to 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 schema covers both parameters with 100% coverage, so a baseline of 3 is appropriate. The description adds additional meaning by clarifying that the 'language' parameter must be a non-primary translation language, which is important selection guidance beyond the bare enum 'Which language version to delete.'

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 action-verb and resource: 'Delete one language version (translation) of a form.' That clearly identifies what the tool does and naturally sets it apart from deleting an entire form. The final sentence reinforces the boundary by noting the primary language is not affected by 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 Guidelines4/5

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

The description gives a clear intended use—deleting a translation language—and explicitly warns that the primary language cannot be removed through this tool. It does not name sibling alternatives like 'delete_form' when a full form deletion is intended, so a small routing gap remains.

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.0
Behavior4/5

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

Annotations already mark destructiveHint=true, so the description's mention of 'delete' is consistent. The description adds valuable behavioral context beyond annotations: it explicitly states that deleting the last item is permitted (form can be empty), and clarifies that it handles non-question entities (page breaks, display blocks). This transparency about edge cases exceeds what 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.

Conciseness5/5

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

The description is two sentences, front-loaded with the core action and scope. It efficiently packs key information: the primary purpose, the range of deletable item types, and an important edge rule (deleting the last one). No redundant words or irrelevant details; every sentence earns its place.

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

Completeness4/5

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

For a simple delete operation with only two well-described parameters and an existing output schema, the description covers the essential behavioral gaps: what can be deleted and the rule about the last item. It would be improved by mentioning any side effects or cascading behavior, but for this tool's simplicity the coverage is nearly complete.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (formId and code) are already documented. The description's phrase 'by code' reinforces the code parameter but adds no new semantics not present in the schema. With high coverage, a baseline of 3 is appropriate; the description does not need to compensate.

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 ('Delete'), a specific resource ('a single item from a form'), and enumerates the allowed item types (question, page break, display block). It clearly separates this tool from delete_form and delete_form_translation by scoping to individual components. The addition of the 'last one is allowed' rule further clarifies the exact scope.

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 description implies usage by specifying what it deletes, but it does not explicitly contrast with alternatives like delete_form or state when to choose this over other deletion tools. The context (sibling names) makes the distinction obvious, but the description itself lacks explicit when-to-use or when-not-to-use guidance.

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

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

The description goes far beyond the schema: it states exact cloned fields, what is deliberately excluded, that share links are regenerated, and that the operation is not idempotent after a timeout. This is especially important for a mutating tool with no annotations to disclose side effects.

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

Conciseness5/5

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

The description is front-loaded, covers what, what-not, and how-to-avoid-duplication in four dense sentences. Every sentence adds meaningful value, and the non-idempotency warning is high-value rather than filler.

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

Completeness4/5

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

Given there is no output schema, the description thoroughly covers selection and side-effect safety. The only notable gap is that it does not explicitly state what the tool returns (such as the new form object/id), which would be helpful in a multi-step 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 input schema already documents both parameters fully, including the default title for newTitle. The description adds no significant parameter-level meaning beyond what the schema provides, so a baseline score 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 uses a specific verb and resource ('duplicate a form') and precisely enumerates what is and is not cloned, making its purpose unmistakable. It also distinguishes itself from related sibling tools by stating it creates a brand-new copy with fresh share links.

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

Usage Guidelines4/5

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

It gives clear usage context: 'useful for cloning a proven quiz and tweaking it', and warns against relying on it for things like preserving submission records or sharing. It does not name a specific alternative tool to use instead, but the 'does not copy' list clearly communicates 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.

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

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

The description clearly discloses the state-changing effects: verifying the object, recording it in the team media library, and returning a media ID and public URL. This adds behavior beyond annotations. It also implicitly warns that the upload must exist for verification, though it does not fully describe error cases.

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 compact sentences capture the full workflow. The front-loaded 'Step 2 of 2' orients the user immediately, and every sentence in the description adds useful information with no redundancy.

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 covers the prerequisite sequence, the side effects, the return value, and downstream usage. With an output schema available and a complete parameter schema, nothing critical is missing 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?

Schema coverage is 100%, so the baseline is 3. The description adds coordination semantics by noting that key, filename, mimeType are the values from prepare_image_upload, which is critical for correct invocation. Alt text is not described in the prose but is already explained in 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 states the specific verb 'finalize', positions it as 'Step 2 of 2' for adding an image, and clearly distinguishes it from prepare_image_upload. It says exactly what the tool does: verifies the upload, records it in the media library, and returns a media ID and public URL.

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?

Usage is explicit: call this AFTER the PUT request to the uploadUrl from prepare_image_upload. It also provides downstream guidance for using the returned media id with update_form for covers. This makes when-to-use vs. alternatives unmistakable.

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

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

Annotations already cover read-only behavior, so the description adds valuable context beyond them: it reveals the additional `examineeSignupDisabled` field and explains why it matters for quizzes requiring login. This is useful behavioral insight that an agent would otherwise not infer from 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.

Conciseness4/5

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

The description is slightly longer than the most minimal needed, but each clause carries meaning, including the nuanced exam-signup explanation. It is front-loaded with the core purpose and elaborates in a way that earns its length.

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

Completeness5/5

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

With zero parameters and an output schema, the only important context an agent needs is what the active tenant means and how to interpret the notable field. The description covers the full usage scenario, including the 'nobody can submit' pitfall, making it complete for the tool's complexity.

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

Parameters4/5

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

The tool has no parameters, so the description rightly spends no time on them. The baseline is 4 since there is no parameter semantics gap to compensate for; the description's focus on the return fields is the appropriate semantic equivalent.

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 specifies a clear verb ('Return') and resource ('team (tenant) this token is currently operating against') while also clarifying the relevant scope: active tenant, as opposed to a list of all tenants or switching. The added detail about write tools defaulting to this team further disambiguates this from sibling getters.

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 tells when to check the active tenant ('Check it before blaming a quiz for "nobody can submit"') and explains the field's implications for signup behavior. It does not explicitly name alternatives or exclusion cases, but the intent is unambiguous given the context and sibling tools.

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

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

The description goes well beyond the readOnlyHint annotation by disclosing behavioral nuances: returned availability is computed from weekly rules minus taken slots, enabled:false appears when booking is off or plan doesn't include it, the booking's own slot is excluded when rescheduling, and server-side clamping of the date range. This is detailed and non-obvious behavioral 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?

Every sentence adds relevant information: core functionality, failure/disabled state, rescheduling behavior, required ordering, and clamping. It is front-loaded with the core action and flows naturally from general to specific, with no filler or repeated 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?

The description covers the central behavior, edge cases (disabled/enabled:false), rescheduling nuances, server-side constraint, and relationship to required sibling call, leaving little to infer. The existence of an output schema reduces the need to explain return shape; the added context about the bookingId parameter and clamping is more than enough 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.

Parameters3/5

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

The input schema covers 100% of parameters with descriptions, so the baseline is 3. The description additionally enriches the meaning of bookingId by explaining its role in rescheduling and non-counted slots, and warns about server-side range clamping—but it does not substantially expand on fromDate/toDate beyond the schema's 'ISO datetime' and 'exclusive' scope.

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 ('Read'), a resource ('bookable time slots'), and the computation source ('weekly booking rules minus what is already taken'). It is clearly distinguished from sibling tools by its scope (availability vs. bookings/leads/forms), and the mention of reschedule_booking shows where it fits.

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

Usage Guidelines4/5

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

The description provides explicit context for when to use the bookingId variant and the strong instruction to call this before reschedule_booking because out-of-range start times are rejected. It does not explicitly name alternatives to exclude or mention when to prefer list_bookings, but the usage context is clear and practically actionable.

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?

The description discloses useful behavioral context beyond annotations: it says customData is included and that sensitive auth fields are never returned. These are meaningful runtime guarantees that help the agent interpret results and set expectations.

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

Conciseness5/5

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

The description is a single, well-structured sentence that front-loads the core action and resource, adds the key identifying constraint, and closes with the important security behavior. There is no wasted language.

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 this is a simple fetch-by-ID tool with only one required parameter, an output schema, and helpful annotations, the description is complete. It covers scope, identifier provenance, response contents, and the non-return of sensitive fields, so 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?

The schema already documents the parameter at 100% coverage, including the business ID example. The description reinforces that the ID is from list_examinees and gives an example, but adds little new semantic meaning beyond what the schema provides.

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

Purpose5/5

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

The description states a specific verb ('View') and resource ('full detail of one examinee'), with a clear scope ('in the current team') and the exact identifier to use. It also distinguishes itself from list_examinees by clarifying it returns full detail rather than a summary 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 implies when to use this tool: when a caller needs full examinee detail or customData rather than just the identifier list. It does not explicitly name alternatives or exclusions, but the contrast with list_examinees and the single-ID focus provide adequate usage context.

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 mark this as read-only and non-destructive; the description adds value by revealing where outcome codes live and how language versions are represented. This is helpful context beyond the annotations, though it does not discuss errors or edge cases.

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, front-loaded, and every sentence carries meaningful scoping or nesting information. It is easy to scan and contains no filler.

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

Completeness4/5

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

Given the read-only annotations, full schema coverage, and presence of an output schema, the description covers what an agent needs to invoke the tool successfully. It also provides helpful pointers into the response structure, though it could clarify the active-tenant context slightly 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 has 100% coverage and clearly documents id, includeFields, and includeReport with defaults. The description mentions fields[] and report configuration but does not add much parameter-specific guidance beyond what the 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 uses a specific verb ('View one form of the current team in full') and explicitly names the main contents: questions fields[] and the report configuration. This clearly distinguishes it from sibling tools like list_forms, get_form_translation, and get_form_funnel.

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 description implies when to use it — when a single form's full configuration is needed — but it does not explicitly contrast the tool with alternatives or provide when-not-to-use guidance. The 'current team' scope is useful, but the choice between this and related getters is left to the agent.

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

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

Annotations already mark it read-only and non-destructive, and the description adds behavioral context: the data source (form_sessions telemetry), scoping to the current team, the look-back window, and the specific funnel/drop-off reports returned. This goes beyond the annotations and clearly sets expectations.

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 detailed but not padded. It front-loads the core purpose and then enumerates the specific outputs. The funnel stage list and per-channel breakdowns are informative and earn their place, though the sentence is slightly long.

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

Completeness5/5

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

With a rich output schema, high schema parameter coverage, and safety annotations, the description is complete enough for an agent to select and invoke the tool correctly. It specifies scope, data source, output dimensions, and the intended use case.

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 formId and days including default and max/min. The description only reflects the 'last N days' notion without adding new meaning to parameters. This matches the baseline expected when schema carries the semantic load.

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 verb and resource: 'Read the conversion funnel for a form in the current team over the last N days'. It then enumerates the exact funnel stages and breakdowns, making it clearly distinct from generic siblings like get_form_stats or get_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 intended use: 'Use this to find where respondents drop and understand/improve conversion.' It implies this tool is for conversion analysis rather than general form reading or stats, but it doesn't explicitly exclude alternatives or mention 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_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.6/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, and the description is consistent with that. It adds useful context: the tool reflects current team scope, reports whether the custom domain is actually serving, and indicates whether the form will accept responses. This goes beyond the structured 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.

Conciseness4/5

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

The description is dense but not bloated. It front-loads the main output and then lists use cases and the sibling alternative. Every clause contributes meaning, and it keeps the agent-oriented guidance in the final 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?

The tool has an output schema, so return values are covered. The description explains the key context an orchestration agent needs: scope of current team, embed modes, custom domain serving status, and delivery-settings sanity checks. Combined with the rich annotations and complete param schema, 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?

Schema coverage is 100%, so the parameter descriptions already carry the load. The description adds value by explaining utmSource's purpose: 'Pass utmSource to get every link and snippet tagged for one channel.' It does not repeat every schema-field detail, which is appropriate given 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 clearly identifies the tool as a get for form sharing information: public answer links, custom domain serving status, embed snippets in three modes, and delivery settings. It uses a specific verb/resource combination and differentiates itself from siblings by explicitly pointing to update_form_settings for changing switches.

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 explicit use cases: 'Use this to answer "give me the link / the embed code" and to sanity-check a launch; change the switches with update_form_settings.' This tells an agent when to use this tool and when to prefer the sibling instead.

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

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

The annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds useful behavioral context by specifying the scope ('current team', 'last N days') and the precise breadth of what is returned, which goes beyond the raw schema 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 front-loaded with the verb, resource, time scope, and team scope, then lists the returned statistical categories. It is a long single sentence, but each part is useful and not redundant.

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 returns a rich set of analytics, and the description covers the operation, scope, time window, and the actual data product, while the output schema handles formal return details. Nothing important needed to call or interpret the tool correctly appears to be 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?

Parameter schema coverage is 100%, with both formId and days documented. The description adds little semantic detail beyond calling days 'last N days', which aligns with the schema, so the baseline 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 opens with a concrete, non-generic operation: 'Read submission statistics for a form in the current team over the last N days', then enumerates the specific report components it returns. It clearly distinguishes this tool from sibling operations like get_form_funnel or list_records, which serve different purposes.

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 intended use: 'Use this to gauge how a quiz is performing and to suggest improvements.' However, it does not explicitly contrast with alternatives like get_form_funnel or get_form, so it lacks explicit when-not-to-use guidance.

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?

The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds behavioral value by explaining the failure case when a language version does not exist yet and by clarifying that the returned content includes mirrored fields[] and a report.

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

Conciseness5/5

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

Three sentences, each serving a clear purpose: what the tool reads, how to use it in the edit/save workflow, and when it errors. The main purpose is front-loaded and there is no filler or redundancy.

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 operation with two fully documented parameters, a schema, and read-only annotations, the description covers the main function, the mutation workflow it supports, and the error condition. Nothing needed for a correct call 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 documentation covers both parameters completely the formId and language enum, so the baseline is at 3. The description reinforces the language parameter's meaning by calling it a 'language version (translation)', which is consistent with the schema but adds minimal extra semantic detail.

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 verb and resource: 'Read the full content of one language version (translation) of a form', and additionally highlights the mirrored fields[] and report. It also references the relevant sibling operations (update_form_translation, create_form_translation), so an agent can tell it apart from get_form and list_form_translations.

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

Usage Guidelines5/5

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

It gives explicit workflow guidance: use this tool to fetch the current draft before editing, keep codes identical to the source form, then save with update_form_translation. It also states when the call fails and directs the agent to create the translation first with create_form_translation.

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

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

With readOnlyHint=true and destructiveHint=false, the annotations already establish that this is a safe read operation. The description adds useful behavioral context by specifying current-team scope, optional data inclusions, and the leadId/examineeId reference rule. It does not need to explain return format since an output schema is present.

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 focused sentences with no filler. The primary purpose is front-loaded, followed by optional include behavior and a defensible reference rule. Every sentence contributes useful information.

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

Completeness5/5

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

Given the required leadId, optional boolean parameters, read-only annotations, and existing output schema, the description is sufficiently complete for an agent to select and invoke the tool correctly. It covers scope, optional behavior, and a critical lookup guardrail without leaving any obvious missing context.

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 leadId and the three inclusion flags. The description adds context around those flags and reinforces the leadId naming convention, but it does not provide significantly more parameter-level meaning than the input schema itself.

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 the action ('view one lead') and the resource ('by leadId'), and it enumerates the specific data returned: follow-up status, assignee, colour tags, respondent block, and next upcoming booking. It does not explicitly name sibling tools like get_examinee or list_leads, so sibling differentiation is implicit rather than explicit.

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

Usage Guidelines4/5

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

The description gives a clear usage context: retrieving a single lead of the current team by leadId, with control over optional inclusions such as submission history, comments, and activity timeline. It also offers the practical guardrail that respondents are referenced by examineeId and never by masked email. It stops short of 5 because it does not explicitly list alternatives or state when not to use this tool.

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

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

Annotations already state readOnlyHint=true and destructiveHint=false, so this is clearly a safe read operation. The description adds useful behavioral nuance beyond those hints: the report result is 'frozen', and email addresses or phone numbers in answers are masked on return. This gives the agent realistic expectations about data fidelity without needing to call the tool.

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, front-loaded with the primary purpose and resource, followed by a useful enumeration of contents and the key masking behavior. Every clause contributes actionable information, and there is no redundant 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?

Given a one-parameter schema, an existing output schema, and annotations covering safety, the description is complete. It explains how the id is obtained, scopes the record to the current team, lists the key subcomponents, and reveals the masking behavior an agent needs to set expectations before invoking.

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 fully documents recordId and even restates the provenance from list_records. The description largely repeats that same provenance. Since schema_description_coverage is 100%, the baseline is 3; the description does not add much parameter meaning beyond tying the operation to the current team.

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 the full detail of one submission record') and then enumerates the included contents: examinee, answers, UTM metadata, and the frozen report result. This scope is clear enough to distinguish get_record from list_records (one record vs. lists) and from get_form or get_lead, even without naming them as alternatives.

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: use this when you need the complete detail of a single record in the current team, and it explicitly ties the required parameter to the id returned by list_records. It does not name explicit alternatives or when-not-to-use conditions, so it stops short of a 5, but the usage context is unambiguous.

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

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

Annotations only say readOnlyHint=false, openWorldHint=false, destructiveHint=false — they do not convey the critical non-idempotence behavior. The description adds substantial transparency: calls may succeed despite a timeout, blind retries can create duplicates, and the correct recovery procedure is to check first. It also discloses the anchor requirement (existing field code from get_form), which is behavioral context beyond the annotations.

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

Conciseness5/5

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

The description is two dense sentences that front-load the core purpose and most important routing rule, then add the idempotence warning. Every clause earns its place — there is no filler, no restatement of schema content, and the critical operational warning is placed at the end where it completes the mental model rather than competing with the purpose statement.

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?

Despite having 30 parameters, a rich schema, nested objects, an output schema, and a field-applicability matrix in the input schema, the description still covers the key contextual points an agent needs to call it correctly: position anchors, end-insert routing, and non-idempotence recovery. It does not enumerate every type-field combination, but the schema already carries that burden; the description correctly focuses on the decision-level context that the schema does not convey.

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 itself documents every parameter, setting a baseline of 3. The description adds value above that baseline by naming the two anchor parameters (before/after) up front, referencing get_form's field.code as the source, and establishing add_question as the endpoint alternative. The semantic distinction between before/after and end-insert is positioned in the description text, not just in 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 and resource ('Insert an item at a specific position') and enumerates the insertable item kinds (question, page break Breaker, display block Statement/Swiper). It distinguishes itself from add_question (append at end) and references get_form's field.code as the anchor mechanism, which clearly separates it from siblings like update_question or 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 Guidelines5/5

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

The description explicitly states when to use before/after anchors, how to insert at the very front, and that insert-at-end should go to add_question. The not-idempotent warning with a check-then-retry strategy gives concrete operation guidance. This is explicit usage direction that an agent can act on without inference.

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?

Annotations indicate this is a write operation but the description goes further by disclosing that an email is sent, that a join link is returned, and that the call is rejected for non-admin roles. It also clarifies active-tenant scoping and specific failure modes, adding substantial context beyond the annotations.

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

Conciseness5/5

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

The description is front-loaded with the core action and then layers permission, role defaults, failure conditions, and tenant-scoping guidance. Every sentence carries distinct operational value, and nothing is redundant.

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 covers the essential context: target scope, required permissions, role constraints, side effects, return value, and common failure cases. An output schema exists, so return-value details need not be fully spelled out.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents both parameters, including the role enum semantics and default. The description repeats much of this information rather than adding new parameter-level meaning, so the baseline of 3 is appropriate even though the tool context is rich.

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: invite someone to the active team by email. It also names the key outcome, sending an invitation and returning a join link, which distinguishes it from unrelated sibling tools. No ambiguity remains about what operation the tool performs.

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 the permission model, role defaults, and failure conditions, and it tells the caller to use list_my_tenants/switch_active_tenant if a different team should be targeted. This provides clear when-to-use and how-to-prepare guidance.

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

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

Annotations already mark this tool as read-only and non-destructive, and the description adds meaningful behavioral context beyond that: bookings are scoped to the current team, sorted earliest first, tied to a lead owner and source quiz, and attendee names/emails come back masked. These details are not inferable from the annotations 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?

The description is compact and front-loaded with the core purpose, then adds distinct, practical details: item shape, filtering, a typical approval-queue workflow, and the masked attendee caveat. There is no filler or redundant wording.

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

Completeness5/5

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

For a read-only listing tool with 9 optional, well-documented parameters and an output schema, this description is complete enough for selecting and invoking the tool. It covers scope, ordering, item content, filtering behaviors, and a real workflow in several lines, so an agent can confidently decide when and how 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?

Schema description coverage is 100% and each parameter already has a clear description covering time range, status enum semantics, quiz, respondent, pagination, and sort. The tool description reinforces the filtering categories but does not add meaningful parameter-level details beyond what the schema already explains, so 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 starts with a specific verb, 'List', and a concrete resource: '1:1 bookings (discovery calls / consultations booked from a quiz report page) of the current team'. It clearly distinguishes this from sibling tools like get_booking_availability, reschedule_booking, and update_booking_status by stating exactly what resource and scope this operation is about.

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

Usage Guidelines4/5

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

It gives clear usage context: read-only listing of the current team's 1:1 bookings, earliest first, with defined filters and a typical use case ('status pending lists the approval queue waiting on someone'). It does not explicitly name alternative sibling tools or say when not to use this tool, so it is slightly short of fully explicit routing guidance.

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?

Beyond the readOnlyHint and destructiveHint annotations, the description reveals important behavior: sensitive auth fields are never returned, the business ID is unmasked, and ordering is newest first. This is meaningful context the agent cannot infer from annotations or 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?

The description is compact and front-loaded: it states purpose and ordering first, then field-sensitive behavior, then routing guidance. Every sentence earns its place without repetition or 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?

Given the output schema exists, all parameters are documented, and annotations cover the safety profile, the description fills the remaining gaps: scope, ordering, sensitive-field filtering, and selection between siblings. Nothing needed 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?

All three parameters (limit, search, status) are already fully described in the JSON schema, including defaults, enums, and constraints. The description adds no extra parameter-level guidance, 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 uses a specific verb (list), a clear resource (examinees/respondents), and states scope (current team) and ordering (newest first). It also distinguishes itself from get_examinee by explaining the difference in scope and detail.

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 to use get_examinee instead: when full detail including customData is needed. It also explains that examineeId is the value consumed by get_examinee / update_examinee, giving the agent a clear routing rule across 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 declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: results are returned in reverse chronological creation order and omit question content. This helps the agent understand what the response will and will not contain without relying on assumptions.

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 a single lean sentence that fronts the core purpose and immediately appends the most important caveat (no question content) with a pointer to get_form. Every phrase earns its place, there is no fluff, and the structure makes the primary action and the exception equally clear.

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 covers the essential behavioral nuances: team scope, ordering, and exclusion of question content. The tool has an output schema, so return values don't need to be described, and annotations plus full parameter schema cover the rest. Nothing necessary for safe and 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?

Schema description coverage is 100%, and each parameter (limit, scene, titleContains) is documented with enough meaning in the schema itself. The description does not add extra parameter-level semantics, which is acceptable given the baseline of 3 when the schema fully covers the parameter detail.

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?

Description states a specific verb ('List') and a clear resource ('forms of the current team'), and additionally distinguishes the listing behavior from detail retrieval by noting that question content is omitted and pointing to get_form for details. This makes the purpose immediately identifiable and differentiates it from sibling tools like create_form and 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 provides clear usage context: list forms when you need an overview, and use get_form when you need question content or details. It gives explicit guidance on the alternative tool for a different need, though it does not mention other related tools like list_form_translations or list_templates, which would have made the routing even clearer.

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 cover the safe read-only nature of the tool. The description adds valuable behavioral detail: the response includes language, isActive flag, public share links, and timestamps, and the primary language is deliberately not included. This is meaningful beyond what the annotations express.

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: the first states the operation, the second itemizes the returned data, and the third explains an important exclusion. There is no filler, and the most critical recognition comes immediately.

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 read-only list operation with an existing output schema and annotations, the description is complete. It tells the agent what will be listed, what fields are returned, and what is deliberately absent, leaving no important detail missing for correct invocation.

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 only parameter, formId, is fully described in the schema as 'The source form UUID', giving 100% schema description coverage. The description restates the form context but adds no extra semantic detail beyond the schema's own 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?

Description begins with 'List the existing language versions (translations) of a form', which is a specific verb and resource. It also distinguishes itself by noting the primary language lives on the form itself and pointing to get_form.language, so an agent can tell this tool apart from related get_form and get_form_translation 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?

The description clearly conveys the tool's purpose and explicitly excludes the primary language, directing the agent to get_form.language for that concern. However, it does not explicitly mention get_form_translation as the alternative for retrieving a single translation, leaving a small gap in alternative routing.

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

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior beyond annotations and schema: aggregation semantics ("one lead per response across all forms", i.e., dedup does not include), default ordering ("newest activity first by default"), and masked email handling ("never by a masked email"). These are real behavioral traits an agent could not infer from the parameter 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?

Five sentences, each earning its place: purpose + aggregation semantics, default ordering, filter summary, code-domain management, and ID/masking convention. It is front-loaded with the core definition and does not repeat schema boilerplate.

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 10-parameter tool with an output schema, the description covers the decision-critical semantics: aggregation, default sorting, code validation, and masked-employee handling. Pagination bounds, the page-local filtering caveat, and the special assignee value "me" remain in the schema, which is acceptable. The complete is modest — it does not name sibling alternatives for raw-record or single-lead access — so very close to fully complete but not absolutely.

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 parameters are already fully documented and the baseline is 3. The description adds value on top by summarizing the filter dimensions in one line (status / assignee / tags / created-at range / keyword / upcoming booking) and by providing the identifier discipline (leadId vs examineeId, never a masked email) that the schema itself does not state. This moves it above baseline, though it still relies on the schema for precise meanings.

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 + resource + scope: "List the leads (CRM records) of the current team" and immediately disambiguates it from siblings with "one lead per respondent across all forms". It also lists what each lead carries (status, assignee, tags, next upcoming booking), so the agent can distinguish list_leads from list_records and list_examinees without opening their 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?

The description gives clear context: the tool targets the current team's aggregated CRM view, and it adds an explicit prerequisite — "call list_lead_settings first to get the valid ones, never guess." However, it does not explicitly name alternative tools to rule out (e.g., when to use list_records or get_lead instead), so the when-not-to guidance is implied rather than stated.

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

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 declare this read-only and non-destructive, so the safety profile is covered. The description adds useful behavioral context beyond the clues: the returned codes/ids are team-scoped and the write tools will reject unknown values, which explains the side-effect context of a read tool meant as a prerequisite. It does not describe errors or pagination, but those are irrelevant 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?

Two sentences carry all needed information without any waste: the first lists the three concrete outputs, the second gives the essential call-before context and rationale. The most important 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?

Given a zero-parameter input schema, a low-complexity read operation, and an existing output schema, the description is fully adequate. It explains what is returned, that data is team-specific, and how the result should be used before related write calls. Nothing necessary for an agent to invoke 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?

The tool has 0 parameters and an empty input schema, so there is no parameter meaning for the description to add. Per the baseline for zero-parameter tools, this is complete enough without any parameter-specific 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 opens with an explicit verb and resource ('Read the current team's lead configuration') and lists exactly what is returned: follow-up status codes with label/color/order, the color tag library, and assignable members. It also differentiates itself from the write-related siblings because it is positioned as the read-side lookup.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: call it before update_lead / set_lead_tags / assign_leads. It explains why this ordering matters, since the values are team-specific and the write tools reject unknown values. This is strong routing context for an agent.

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.3/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, so the safety profile is covered. The description adds meaningful behavioral context: the result includes all user memberships and the isActive field indicates the token's current operating tenant. No contradictions with annotations.

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

Conciseness5/5

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

The description is one efficient sentence with no fluff. The main action is front-loaded and the field clarification (isActive) is added in a compact clause, earning 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 tool is low-complexity (0 params), has an output schema, and annotations cover the safety profile. The description adequately explains what it lists and how to interpret the key field. 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?

With zero parameters, baseline is 4. There are no parameters to describe, and the schema has nothing to document, so this score is appropriate and the description need not compensate for anything.

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 ('List') and clearly identifies the resource: all teams/tenants the current user belongs to. It also explains the isActive field, distinguishing it from get_active_tenant by noting all tenants are returned and the active one is marked.

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 description implies usage—when you need the full list of tenants for the current user—but does not explicitly mention alternatives like get_active_tenant or switch_active_tenant, nor does it state when to prefer this tool over those. The mention of isActive provides indirect context but not explicit routing.

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

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

Beyond the readOnly/destructive annotations, it discloses meaningful behavioral traits: newest-first ordering, the compact report shape, team-level scoping, automatic masking of emails and phone numbers, and the instruction to reference respondents by examineeId because masks are not stable identifiers. This is genuinely useful context that the annotations alone do not provide.

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 yet compact: one sentence for the core behavior, one for item shape, one for optional filters, and one safety/alternatives tip. Every sentence earns its place, and the most important information is at the front.

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 readOnly annotations, full input-schema coverage, and the presence of an output schema, this description leaves very little unresolved. It explains item contents, filtering, masking constraints, and routes to get_record, so an agent can confidently select and call the tool.

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 6 parameters with 100% coverage, so the baseline is 3. The description does add a concise grouping of the optional filters (form, report status, submitted-at range), but it mostly restates what the parameter descriptions already say rather than introducing new semantic meaning.

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

Purpose5/5

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

The description opens with a specific verb-resource combination: "List submission records (leads) of the current team, newest first." It enumerates what each item includes and explicitly distinguishes itself from get_record, making the tool's scope clear even among many list_* 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 gives clear context on optional filters and on how to reference respondents safely, and it explicitly points to get_record when full detail is needed. It does not explicitly contrast this endpoint with list_leads or list_examinees, but the behavior description and mention of report results make the intended use clear.

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

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

Annotations already cover read-only and non-destructive behavior, so the description adds useful context without needing to repeat safety. It clarifies active-only results, the public library scope, field set, and most-used-first ordering, which helps set expectations for what the call returns.

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 focused sentences with no filler. The first sentence states what the tool lists; the second gives the recommended next action. The key scope 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?

With a full input schema, output schema availability, and annotations defining read-only/non-destructive behavior, there is no meaningful gap in what an agent needs to select and invoke the tool. The description also connects it to the logical follow-up tool.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents limit, scene, categoryId, isRecommended, and titleContains. The description adds workflow-level context about using the template id afterward, but it does not need to add parameter details because the schema fully handles that.

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 object: it lists active templates from the public template library, and enumerates the fields returned. This clearly distinguishes it from list_forms and create_form_from_template because it identifies templates as the resource rather than forms.

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 tells the agent when to use the tool: 'Use this to find a template, then call create_form_from_template with its id.' It also gives the decision criterion ('when a suitable template exists'). It stops short of saying when not to use it or naming an alternative such as create_form.

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 already indicate the tool is not read-only and not destructive; the description adds the nuance that to move to the front or end you must reference the current first/last field's code. It discloses the requirement to reference existing codes and the positional behavior, which goes beyond the annotations without contradicting them.

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

Conciseness4/5

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

Three sentences with minimal redundancy. It leads with the purpose, then explains the mechanism, and finishes with the front/end special cases. Each sentence earns its place, though it could combine the front/end guidance more tightly.

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 high schema coverage and existing output schema, the description covers all essential mechanics: what to move, how to specify position, and how to handle front/end cases. Nothing an agent needs to call this tool 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 a baseline of 3 applies. The description adds meaning by clarifying that 'after' and 'before' are mutually exclusive ('choose either'), and by explaining how to achieve front/end moves using current boundary codes—details not present in 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 names a specific action ('Move'), a specific resource ('existing item (question, page break or display block)'), and explains the positional mechanics with 'after' and 'before'. It clearly separates this from sibling add/delete/update tools by focusing on repositioning.

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 implicitly defines when to use it (to change an item's position) and gives concrete instructions for both relative moves and front/end placement. It does not explicitly name alternatives, but the tool's purpose is self-evident given the sibling set, so an agent can correctly select it.

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

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

Annotations already mark readOnlyHint=true and destructiveHint=false, and the description adds substantial context around that: the tool never sees the image bytes, the returned URL is short-lived, uploads over 5MB are rejected, and the optional fileSize is checked up front against the 5MB cap and storage quota. It also exposes the subtle asymmetry that while this call itself is read-only, the overall workflow is a mutation performed via the direct PUT — which resolves any confusion the readOnlyHint could cause.

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 key concept ('Step 1 of 2... returns a presigned URL... does NOT receive image bytes') and the numbered workflow is clearly structured. It is a bit long and repeats the 5MB rule a couple of times, and the curl example is generous in detail, but every major section earns its place for a tool with a non-obvious two-step protocol.

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 a complex presigned-URL flow, the description is effectively a complete operating manual: preconditions (temp file, compression, allowed MIME), the exact invocation, the follow-up finalize call, and cleanup. An output schema exists and will specify return fields, so the description doesn't need to — the only marginal omission (what to do on a failed PUT status) is below the bar for an MCP-tool description.

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, and the description adds value beyond the schema: it clarifies fileSize should be the post-compression size ('the file you will actually upload, after any compression' is expanded by the compression step instructions), and it ties mimeType to the requirement that the PUT Header's Content-Type must match. It doesn't deeply enumerate each parameter, but with a fully documented schema that burden is already carried.

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 concrete, scoped purpose: 'Step 1 of 2 for adding an image (PNG / JPEG / GIF / WebP) to the current team media library.' It explicitly distinguishes its contract — it does NOT receive image bytes, it returns a presigned URL — and the sibling finalize_image_upload is directly named, so an agent immediately knows what this tool is and what it is not.

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

Usage Guidelines5/5

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

The description provides a complete procedural guide: compress/downscale any file >5MB first (with concrete sips/magick examples), call this tool with filename/mimeType/fileSize, HTTP PUT the file to the returned uploadUrl, then call finalize_image_upload, then delete the temp file. It also states hard applicability rules (5MB cap, four allowed MIME types) and explicitly names the required follow-up sibling, so an agent knows exactly when and how to use it.

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

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

Beyond the annotations, the description discloses concrete behavioral consequences: the attendee is emailed, the 24-hour reminder is re-armed, and a booking.rescheduled integration event fires. It also explains rejection conditions, which is valuable context for a mutating operation that is not marked destructive.

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 dense sentences cover purpose, required prerequisite call, parameter constraints, side effects, and failure conditions without wasted words. The most important scoping information comes first and the practical how-to guidance 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 description is complete for a two-parameter mutation with an output schema: it states preconditions, valid input origin, side effects, event behavior, and rejection cases. Nothing an agent needs to call this tool correctly or anticipate failures 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 schema already documents both parameters. The description adds useful context by connecting bookingId to get_booking_availability and specifying that startAt must be selected from that call's slots, but most of the parameter meaning is already present in 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-plus-resource statement: 'Move a confirmed booking of the current team to a different time, as the organiser.' This clearly distinguishes it from siblings like get_booking_availability, review_booking, and update_booking_status by focusing on the rescheduling action and the organizer/team scope.

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 get_booking_availability with this bookingId first, pick a startAt from its slots, and provide that as the new time. It also states when it will not work: rejected if the slot was taken or if the respondent already has another active booking, and only applies to confirmed/scheduled bookings.

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

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description adds meaningful behavioral details: the restore operation's authorization requirements and its error condition when the form is not trashed. It does not fully explore side effects, but for a single-parameter restore action with an output schema, this is substantive additional 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 with no filler. It front-loads the core purpose ('Restore a form from the trash'), then adds the inverse-operation reference and the key constraints. 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 low-complexity tool with one fully documented parameter, an output schema, and annotations indicating mutation but non-destructiveness, the description provides sufficient context: purpose, scope, permissions, and failure condition. The agent has everything needed to decide whether and how to invoke restore_form 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%: formId is documented as 'The form UUID to restore from trash'. The tool description does not add further parameter-level detail, but nor is it required to because the schema already fully explains the only parameter. Baseline 3 is appropriate given the high 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 clearly states the operation: 'Restore a form from the trash in the current team'. It explicitly frames it as 'undo delete_form', which distinguishes it from both delete_form and the various create/update siblings. The verb and resource are specific and unambiguous.

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

Usage Guidelines5/5

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

The description gives explicit conditions for use: it is the inverse of delete_form, applies within the current team, and is only permitted for the form owner or team owner/admin. It also states when it will fail ('errors if the form is not in the trash'), giving the agent clear call-time guardrails.

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 enriches the annotations with real behavioral detail: approval sends confirmation with the meeting address, declining sends a note, expired requests cannot be approved, meeting link/instructions may fall back to team settings, and access is limited to owner/admin/lead owner. This is exactly the context beyond readOnly/destructive hints that is useful.

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 carries distinct information: the decision action, notification side effects, state constraints, per-meeting overrides, and authorization. It is dense yet not bloated, and it front-loads the core purpose.

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 is present and the input schema is fully documented, the description covers all critical decision-relevant context: status preconditions, time-based limitation, side effects, optional parameter implications, and permission rules. 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%, and each parameter has a descriptive schema entry already. The description adds some usage context around approval vs decline behavior, but it largely mirrors the schema text for meetingLink, meetingInstructions, and declineReason. Thus it meets but does not exceed the baseline for complete 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 clearly states a specific action ('Approve or decline'), a specific resource ('a pending booking request'), and the current team scope. It differentiates the tool from siblings like update_booking_status by specifying the pending-status condition and the approval/decline decision structure.

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 provides explicit conditions: only pending bookings can be reviewed, and past-dated requests can only be declined. It does not name sibling alternatives directly, but the conditions on booking status effectively define when this tool is appropriate.

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

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

Annotations only say readOnlyHint=false and destructiveHint=false, so the description carries the behavioral burden and it excels: it discloses partial-update behavior (omitted title/radar settings are kept), dimension code stability rules, the removal constraint for dimensions referenced by question dimensionScores or report.formula, scene-dependent treatment of formula/fieldCodes, and the standardScore auto-computation defaults. Notably it tempers destructiveHint=false by explaining exactly what can and cannot be removed, with no contradiction to the annotations.

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

Conciseness4/5

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

A single dense paragraph of roughly 230 words that is front-loaded with the core purpose and where every sentence carries operational information. It loses one point because the dense wall-of-text formatting makes scene-specific rules harder to scan — short scene-labeled segments or bullets would improve parseability — but there is no padding or redundancy.

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, nested dimension objects, two scene variants, and an output schema, the description covers everything an agent needs to call it correctly: prerequisites, unsupported forms, preservation semantics, code stability, removal constraints, and clearing behavior. Return values are already handled by the output schema, so their absence from the description is not a gap. The only minor omission is explicit error behavior for invalid references, which the schema partially covers ('Each code must exist in the form').

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, and the description adds meaningful cross-parameter semantics beyond individual schema descriptions: which parameters apply in which scene, how formula and fieldCodes interact, how standardScore defaults are derived, and how the empty dimensions array triggers a clear. It does not need to restate per-field constraints since the schema already documents them, but the scene-conditional behavior is genuine added value, warranting a 4.

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

Purpose5/5

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

Opens with a specific verb-resource pair — 'Set the multi-dimension analysis (form.report.dimensionAnalysis) of a form' — and immediately clarifies the exact mutation semantics: replaces the dimension list while preserving overallAnalysis. It is clearly distinguishable from all siblings (update_form, create_form, get_form) because it names the precise report field it operates on and states its unsupported form type.

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

Usage Guidelines5/5

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

Gives explicit when-to-use conditions per scene ('In the knowledge_quiz scene each dimension needs fieldCodes; in the scored_quiz scene a formula is optional'), an explicit when-not ('Not supported for random_knowledge_quiz forms'), a prerequisite ('Call get_form first to read the question and dimension codes'), and a clear usage pattern for clearing ('Pass an empty dimensions array'). This is actionable routing guidance, not just a generic statement of purpose.

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

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

The description clearly discloses semantics beyond the annotations: 'replace' overwrites the whole tag set, 'add' and 'remove' have batch-oriented behavior, 'remove' accepts stale codes, and changes are recorded on each lead's timeline. It also states the tag-code existence requirement without relying on schema descriptions 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?

The description is concise and efficiently structured: it front-loads the tool's purpose, then packs the most important operational constraints into a small number of sentences. Every sentence earns its place, and the mode-specific guidance is clear without being bloated.

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 mode enum, array limits, team-scoped behavior, and a business-library dependency, the description is complete. It explains when to use each mode, how tags are validated, what happens to existing tags, and where the changes are recorded; an output schema also exists, so return-value details are not required in the description.

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 at 100% coverage, so the baseline is 3. The description adds valuable operational meaning, especially for 'mode' behavior and batch expectations, but since the schema interface already carries descriptive parameter docs, the description's extra contribution is strong but not fully essential.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Set the colour tags on one or more leads of the current team.' It clearly identifies the action, the target entity (leads), and the team scope, which makes the tool distinguishable from siblings like update_lead, assign_leads, and list_lead_settings.

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 operational guidance: pass all lead ids in one call, do not loop, respect the 50-lead maximum, and select the mode based on single-lead edits versus batch operations. It explains why using 'replace' for batches can wipe other people's tags, and it names list_lead_settings.tags as the source for valid tag codes.

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

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

Beyond the annotations (which only say the tool is not read-only and not destructive), the description discloses the key behavioral trait that the switch persists across sessions, and the access requirement that the caller must be a member. No contradiction with annotations exists, as the readOnlyHint=false is consistent with a state-changing operation.

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

Conciseness5/5

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

The description is exactly three short sentences: the action, the persistence effect, and the membership precondition. Every sentence carries distinct information, the most important facts are front-loaded, and there is no redundant wording.

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

Completeness5/5

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

The tool is simple (one parameter) with a rich schema and an output schema available, so the description's coverage of purpose, side-effect persistence, and eligibility precondition is sufficient. Nothing an agent needs to call it correctly appears to be 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% with the sole parameter (tenantId) well documented, including a pointer to list_my_tenants for discovery. The description adds no additional parameter-level information, so with full schema coverage 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 states a specific verb (Switch), a precise resource (active team/tenant), and the exact scope (for this token). It clearly distinguishes itself from the get_active_tenant (read) and list_my_tenants (discover) siblings.

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 description provides a precondition (caller must be a member of the target team) and states that the change persists across sessions, which implies when it should be used. However, it does not explicitly name alternative tools or state when not to use it - the cue to use list_my_tenants for discovery lives only in the parameter schema rather than in the description.

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

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

The description discloses important behavioral side effects beyond annotations: cancellation notifies the attendee by email and fires an integration event, while completed/no_show do not contact the attendee. It also explains the difference between status transitions. This adds significant context not available in the annotations alone.

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 core purpose, then systematically adds preconditions, side effects, and an alternative. It is a bit longer than minimal, but every sentence is necessary and adds distinct 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 presence of an output schema and the annotations, the description provides everything an agent needs: valid statuses, eligibility conditions, side effects, and sibling routing. Nothing critical is missing 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?

Although the schema already covers all parameters (100%) and defines enum values, the description adds clear behavioral nuances for each status (e.g., cancellation triggers notification, completed/no_show are internal). It enriches the schema's plain definitions with operational meaning.

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

Purpose5/5

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

The description states a specific verb ('close out') and the resource ('a confirmed booking of the current team'), then enumerates the exact acceptable outcomes. It also distinguishes itself from the sibling review_booking by explicitly naming the tool for pending requests.

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 clearly specifies the precondition: only works on bookings with status 'scheduled', and adds time-based requirements for completed/no_show. It also gives an explicit exclusion: 'To handle a pending request use review_booking instead'.

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 already indicate destructive behavior, but the description goes further by explaining exactly how: customData replaces the whole object, masked values are rejected, and replaying a previously read customData can wipe or corrupt phone fields. This is precisely the kind of behavioral context beyond annotations that an agent needs.

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 and front-loaded with the operation and resource, followed by a concise list of editable and immutable fields and a distinct warning. It earns its length, though the customData warning partially repeats the input schema's customData description.

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 destructive mutate operation with a nested customData object, the description provides the essential operational context: identity selection, field editability, validation behavior, and the destructive consequence of echoing masked data. The presence of a full output schema and complete input schema rounds out the tool definition.

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 covers 100% of the parameters, so the schema already handles most semantics. The description adds valuable clarification: email, tenant, and examineeId cannot be changed, customData is validated against field definitions, and readonly/masked values must not be re-sent. This is meaningful but partially redundant with 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 uses a specific verb and resource: 'Update an examinee' and states it operates in the current team, identified by examineeId. It also clarifies what is editable versus immutable, which makes the tool's scope distinct from sibling read/list 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 Guidelines4/5

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

It gives a clear prerequisite: the examinee is located by the business ID from list_examinees, and it scopes updates to the current team. It also notes immutable fields. It does not explicitly name alternatives or when-not-to-use scenarios, but for a mutation tool the usage context is established sufficiently.

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

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

The description discloses substantial behavior beyond the annotations: sub-key merge semantics for report and openGraph, empty-string clearing, wholesale replacement of systemText, image-only behavior of landingImage, outcome matching by code, and rejection of removals still referenced. This is far more than the readOnly/destructive hints provide.

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 well-organized: purpose and field list first, then cross-cutting semantics, then routing exclusions. Every sentence earns its place, and the length is appropriate for an 11-parameter tool with nested objects.

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 exhaustive schema descriptions, an output schema, and annotations, the description adds exactly the operational context missing from structured fields: merge behavior, constraints, and sibling routing. An agent has what it needs to select and invoke 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 description coverage is 100%, so the description does not need to compensate. It nevertheless adds cross-cutting value by explaining shared patterns across parameters: media IDs/URLs/empty-string clearing, merge-vs-replace behavior, and language-change restrictions that the schema separates per parameter.

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 ('Update'), a resource ('a form of the current team'), and explicitly enumerates the updatable fields. It also distinguishes itself from sibling operations by routing questions to add_question/update_question/delete_question/move_question and dimensionAnalysis to set_dimension_analysis.

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 routing guidance versus related tools and states when language changes are allowed and that scene is immutable. The description also clarifies what this tool is not for, which gives an agent clear selection criteria among siblings.

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

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

Annotations only indicate this is a write operation, leaving the description to carry behavioral context. The description discloses partial-update semantics ('Only the keys you pass are changed') and explains real-world consequences of settings, such as lead capture, completion rate versus lead quality, and organic sharing. It does not mention side effects like slug breakage in the description itself, though the schema covers that in detail.

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 long but front-loaded with purpose and alternatives before the field list. Each parenthetical earns its place by adding decision-relevant context rather than repeating schema details. The density is justified by the number of editable settings, and there is no filler.

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

Completeness5/5

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

Given the tool's complexity (10 parameters, nested objects, one enum), the description provides high-level coverage, partial-update behavior, and sibling routing. The rich schema and output schema handle the remaining validation and return-value details. An agent has enough context to select and invoke 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 schema already documents every parameter. The description adds valuable business-level meaning beyond the schema: which fields form the lead-capture gate, the completion-rate/lead-quality trade-off, and how sharing and booking affect growth and the call queue. This helps an agent reason about parameter combinations, lifting it above baseline.

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 ('Change') and a specific resource ('how a form... is delivered'), and explicitly distinguishes itself from update_form, which handles content like title, questions, report, and theme. It also enumerates the exact editable settings, leaving no ambiguity about what the tool operates on.

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

Usage Guidelines5/5

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

It explicitly names the sibling tool update_form for content changes and get_form_share_info for reading current values. This gives an agent clear routing guidance: use this tool for delivery/settings changes, not content or read operations. The contrast is direct and actionable.

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

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

Annotations only indicate non-read-only and non-destructive, so the description carries the behavioral burden, and it delivers. It discloses partial-update semantics, merge-by-code not position, rejection of non-existent codes, fallback behavior for omitted keys, and the fact that this language version's isActive is independent of the form's overall isActive. It also warns about the report shape differing from create_form/update_form and notes that stored-but-unknown keys are not rendered.

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, front-loaded with the purpose, then the core update semantics, a key constraint, and the special isActive flag. There is no filler or repetition of schema content that isn't already doing work.

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 highly nested 9-parameter tool, the description plus schema fully covers the workflow: where to get the draft, how to send it back, how merging works, what constraints exist, and what the report shape should be. Output schema exists, so not explaining return values is appropriate.

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 schema coverage is 100%, the description adds cross-cutting semantics beyond individual parameter docs: mirror the get_form_translation shape, omit fields to keep current values, partial translation is allowed, merge by code, and isActive is independent. This is exactly the kind of workflow-level meaning that makes parameter use correct, not just documentable.

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: 'Save translated copy for one language version of a form.' It clearly distinguishes this update operation from sibling tools like create_form_translation by emphasizing the one-language-version scope and the partial-update behavior. 'Pass the translated title / description / fields / report / systemText / booking' makes the tool's resource shape concrete.

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 strong practical guidance: mirror get_form_translation's shape, omit fields to keep their values, and partial translation is allowed. It also gives a clear special-case instruction for isActive=false. However, it never explicitly names when to use this tool instead of create_form_translation or delete_form_translation, leaving the update-vs-create decision to inference.

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

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

The description adds meaningful side-effect context beyond the annotations: the status change is recorded on the lead's timeline, and valid status codes are team-defined rather than universal. It does not contradict the readOnlyHint=false or destructiveHint=false annotations.

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

Conciseness5/5

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

The description is three short sentences, front-loaded with the action and then providing necessary scope and prerequisite context. There is no filler or redundancy.

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 update operation with rich annotations and output schema present, this description is complete: it identifies the scope (current team), the behavior (timeline recording), and the dependency (list_lead_settings). Nothing an agent needs to call it correctly seems 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 schemas already define leadId and status well. The description reinforces that status codes come from list_lead_settings and warns against guessing, but adds little new parameter-level meaning beyond the schema.

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

Purpose5/5

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

The description is specific: it names the verb ('move'), the resource ('one lead of the current team'), and the precise change (follow-up status, e.g. new → contacted). This clearly distinguishes update_lead from sibling tools like set_lead_tags or add_lead_comment.

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 an explicit prerequisite: call list_lead_settings first to get valid status codes and never guess. This is strong practical usage guidance, though it does not name alternative tools or explicitly say when not to use this one.

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?

Annotations are minimal (readOnlyHint=false, openWorldHint=false, destructiveHint=false), so the description carries the behavioral burden. It discloses that choices replaces ALL choices, that some fields are rejected per question type/scene, that DateField/TimeField/Rate reject certain fields, and that display block updates reject every question key. This is far richer than the annotations alone.

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 a single dense paragraph, but it packs crucial distinctions efficiently: changeable list, not-chargeable list with alternatives, per-type rejections, and display block behavior. It could be slightly better structured with bullet points, but every sentence provides necessary information for a 20-parameter tool.

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 mutation tool with 20 parameters, the description covers all critical decision points: which fields are editable, which are not, what is rejected in which scenes, how choices replacement behaves, and how display blocks differ. Given the output schema exists, no additional return-value explanation is needed. 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.

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 value beyond the schema by summarizing cross-parameter constraints (e.g., 'choices' replaces all choices, display blocks use different keys, scene-level rejections). It does not restate every parameter but complements the schema with important usage 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 uses a specific verb ('Update') and resource ('a single question of an existing form, located by code'), and immediately enumerates exactly which fields are changeable. It explicitly contrasts itself with delete_question then add_question for unchangeable attributes, distinguishing it from sibling tools.

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 explicit when-to-use guidance: what can be updated, what cannot be updated (and the recommended alternative), and scene-specific restrictions (e.g., scored_quiz/outcome_quiz reject top-level score/correctAnswer/aiMatch). It also covers display blocks and their own key constraints, leaving no ambiguity about when this tool is appropriate.

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

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

Beyond the annotations, it discloses important behavioral consequences: owner/admin restriction, global link redirect, old address stopping resolution, cache lag, and token addresses still working. This significantly exceeds the minimal 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 dense but every sentence adds crucial operational context. The core functionality is front-loaded, followed by high-impact constraints and consequences. It could be slightly more concise, but the density is justified.

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 is fully complete for a slate of one parameter with an output schema: it covers validation, side effects, permissions, and related tools. The agent can safely invoke this tool without needing to consult external documentation.

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 only says 'The new team address', but the description expands this with validation rules: allowed characters, length limits, prefix/suffix rules, uniqueness, and non-clearing constraint. This provides the agent with all validation logic ahead of invocation.

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 ('Change the team address') and the resource (the current team) with a concrete example URL. It distinguishes itself from get_active_tenant by describing a mutation vs. read 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?

It provides an explicit when-to-use/when-not-to-use context: it is a 'rare, deliberate rename — not routine tuning.' It also names the companion read tool get_active_tenant, giving the agent a clear path to safely check current state.

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 Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables detection and analysis of pre-public product launches through web search, content extraction, AI-powered scoring, and automated alerting. Provides comprehensive tools for surfacing stealth startup signals before they trend publicly.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI chat clients to perform market research and competitive intelligence by gathering company overviews, competitor lists, product portfolios, pricing snapshots, and recent news via live Tavily search.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.1/5.0
Disambiguation4/5

Most tools map to a distinct resource and action, and the descriptions actively disambiguate similar operations (e.g., get_form vs get_form_share_info vs get_form_stats). The main potential confusion is between list_records and list_leads and between get_record and get_lead, since both describe leads from slightly different angles.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun convention, with resources like form, question, lead, booking, examinee, translation, and tenant parallel across actions. The few non-CRUD verbs like prepare_/finalize_, duplicate_, and reschedule_ still fit the same uniform pattern.

Tool Count2/5

48 tools is well beyond the 3–15 ideal and even past the 25+ threshold, making the tool surface heavy for an agent to navigate. The broad platform scope explains some of the size, but the count still risks overwhelming context and increasing misselection.

Completeness4/5

The server covers form lifecycle, question editing, translations, CRM leads, examinees, records, bookings, team/tenant operations, image uploads, templates, and analytics extremely well. Minor gaps remain—such as no lead/record deletion, no member removal or role updates, and limited booking-settings management—but most workflows can be completed with the existing tools.

Resources