RooQuiz
Server Details
Create and manage quizzes, leads, and respondents on RooQuiz, a lead-capture assessment platform.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
TDQS
Scored across 48 tools
Several tool clusters overlap in purpose: list_records/list_leads/list_examinees and get_record/get_lead all touch respondents and submissions, add_question/insert_question split a single operation, and update_form/update_form_settings/set_dimension_analysis partition form configuration across three entry points. The descriptions work hard to draw boundaries, but an agent must read carefully to avoid misselection, which is more than the one-or-two ambiguous pairs a 4 allows.
The set is overwhelmingly consistent: snake_case verb_noun throughout, with full CRUD symmetry (create_form/get_form/list_forms/update_form/delete_form and the matching *_form_translation family). Minor breaks — add_question vs insert_question for essentially the same operation, and the closely-parallel get_form_*/update_form_* compound names — keep it from being a perfect 5.
At 48 tools, this is nearly double the 25+ threshold the rubric treats as too many for an agent-facing surface. The platform scope is genuinely broad (forms, CRM, bookings, translations, teams, media), but clusters like the five get_form_* variants and add_question/insert_question show real consolidation potential.
Core workflows have strong lifecycle coverage: full CRUD for forms, translations, and questions; lead management via status, assignee, tags, and comments; booking handling from availability through review, reschedule, and close-out; and tenant management. The main gaps are member management (invite exists but no list/remove/role tools) and the absence of any deletion path for leads, examinees, or lead comments, which agents can generally work around.
Available Tools
48 toolsadd_lead_commentAdd lead commentAInspect
Write an internal follow-up note on a lead of the current team (visible to team members only, never to the respondent). Max 2000 characters. Optionally attach the record id of the submission the note is about, as context. Read existing notes with get_lead(includeComments: true). Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The note text | |
| leadId | Yes | The lead id (the leadId returned by list_leads) | |
| recordId | No | Optional record id this note is about (as returned by get_lead records / list_records) |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | No | The note text as stored |
| leadId | No | The lead it was written on |
| commentId | No | The created note |
| createdAt | No | ISO datetime |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, but the description adds critical behavioral context: the note is visible only to team members and never to the respondent, the 2000-character limit, the optional recordId context, and the non-idempotent timeout behavior. The non-idempotency warning is especially valuable because it directly affects how an agent should handle retries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste. The core action and visibility constraint are front-loaded, the character limit and optional parameter are stated compactly, and the non-idempotency warning is placed at the end where it is most actionable. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with 100% schema coverage, an output schema, and annotations covering the safety profile, the description is complete. It covers the action, scope, visibility, limits, optional parameter semantics, and retry behavior. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds meaning by explaining the purpose of the note ('internal follow-up'), the visibility constraint, and the optional recordId as 'context'. It doesn't add syntax details, but the schema already covers those, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Write'), a specific resource ('internal follow-up note on a lead'), and a clear scope ('of the current team'). It also distinguishes itself from reading notes by pointing to get_lead(includeComments: true), and the sibling list shows no other add-comment tool, so there is no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool (to write an internal follow-up note), what it is not for (visible to team members only, never to the respondent), and how to read existing notes (get_lead with includeComments: true). It also gives a clear retry policy: check first, then retry only if the note is really missing. This is explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_questionAdd 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.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | NumberField only: maximum allowed input value (must be >= min). Rejected for other question types. | |
| min | No | NumberField only: minimum allowed input value (respondents cannot submit a smaller number). Rejected for other question types. | |
| code | No | Optional 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. | |
| name | No | Question 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). | |
| type | Yes | Question type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer | |
| unit | No | NumberField only: display unit suffix shown after the input, e.g. "kg" / "$" / "min". Rejected for other question types. | |
| items | No | 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. | |
| score | No | Points 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). | |
| steps | No | Rate 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. | |
| words | No | Rate 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. | |
| formId | Yes | The form ID to append the item to | |
| aiMatch | No | Only 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. | |
| choices | No | Choice-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. | |
| content | No | 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. | |
| explain | No | Optional answer explanation. The frontend renders it in the question's "answer explanation" field (DescriptionEditor); the rich-text rules are identical to description. Do not stuff the answer explanation into description — that is the question's supplementary note and will not be shown as an explanation to respondents/graders. | |
| shuffle | No | Ordering 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. | |
| multiple | No | DropDown 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). | |
| required | No | Whether the question is required, default false | |
| precision | No | DateField / 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. | |
| trueLabel | No | TrueFalse 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". | |
| falseLabel | No | TrueFalse 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". | |
| description | No | Optional supplementary note for the question. Allows a wider HTML subset: everything the stem allows + <h1>-<h6> <ul> <ol> <li> <blockquote> <a href> <img src> <hr> <art-field> (variable placeholder, data-type / data-cid); unsafe protocols (javascript:/data:) and unknown attributes are stripped. This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| trueOutcomes | No | Outcome 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. | |
| correctAnswer | No | The "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". | |
| decimalPlaces | No | NumberField 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. | |
| falseOutcomes | No | Outcome 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. | |
| trueDimensionScores | No | 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. | |
| falseDimensionScores | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| field | No | The created question, including its generated code |
| formId | No | The form that was edited |
| itemCount | No | Question / page-break count after the append |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description deliberately discloses the critical non-idempotency risk: '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.' It also clarifies which fields are ignored/rejected for various types and explains scene-specific behaviors, adding value well beyond the sparse functional annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The primary purpose is front-loaded with a single, clear opening sentence, and the paragraph is packed with genuinely useful type/scene information rather than filler. The information is dense and could have been split into bullets, but the length is justified by the tool's complexity and the schema descriptions do not repeat it verbatim in a bloated way.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (28 parameters, multiple scenes and question types), the description covers side effects (non-idempotency), scene/type availability, and the 'configuration in the web app' boundary. An output schema exists, so the return value does not need to be described; nothing critical to safely invoking the tool appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter already carries a thorough description, so the baseline is 3. The tool description does add a few non-schema facts (e.g., 'prefer DropDown over SingleCheck/MultiCheck past 20 choices', 'configure random question banks in the web app'), but it largely repeats the schema's field-applicability summary rather than contributing substantial new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Append an item to the end of a form,' which clearly distinguishes it from the sibling insert_question by emphasizing end-append semantics. It then enumerates the full range of item types it can create, so an agent knows exactly what the tool does and what is out of scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives valuable selection guidance within the tool (e.g., 'prefer it over SingleCheck/MultiCheck past 20 choices', scene-specific restrictions like 'Cascade ... scored_quiz only'). However, it never mentions the tool-level alternative insert_question or states when to use add_question vs. insert_question; the advice to 'Configure random knowledge quiz question banks in the web app' is the only explicit workaround and covers only a narrow case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_leadsAssign leadsADestructiveInspect
Assign one or more leads of the current team to a member, or clear the assignee. Pass every lead id in a single call (up to 50) — do not loop one call per lead. The assignee must be an active non-viewer member (see list_lead_settings.assignableMembers); pass "me" for yourself, or omit / null to unassign. Each actual change is recorded on the lead's timeline. When assigning, the assignee gets one aggregated in-app notification and, if enabled in their notification preferences, one email for the whole batch; assigning the same owner again does not notify them again.
| Name | Required | Description | Default |
|---|---|---|---|
| leadIds | Yes | The lead ids to assign, max 50 per call | |
| assigneeId | No | The member userId to assign to, or "me" for the current token's own user. Omit (or pass null) to clear the assignee. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | How many leads were changed |
| items | No | Per-lead result |
| assigneeId | No | The member they were assigned to, or null when cleared |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=true, but the description adds valuable behavioral context: 'Each actual change is recorded on the lead's timeline' and describes the aggregated notification and email behavior, including that reassigning the same owner does not trigger another notification. This goes beyond the annotations and helps the agent understand side effects and user-facing impacts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat long but every sentence provides useful guidance: purpose, batching rule, assignee requirements, unassign method, and side effects. It is front-loaded with the core action and then provides necessary operational details. It is not overly verbose given the amount of information needed for correct usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema and two parameters, the description covers all essential aspects: what to pass, how to batch, who qualifies as assignee, how to unassign, and what side effects occur (timeline recording, notifications). It also points to a sibling for eligible assignees. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters already have detailed descriptions (e.g., 'The member userId to assign to, or "me"... Omit (or pass null) to clear the assignee.'). The description repeats these details but adds no new parameter-specific information beyond the schema. The batching instruction (up to 50) is also already in the schema's maxItems. Therefore, the description adds minimal extra parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Assign one or more leads of the current team to a member, or clear the assignee.' This is a specific verb (assign) with a specific resource (leads) and an additional action (clear). It distinguishes itself from siblings like set_lead_tags or update_lead by focusing on the assignment/ownership change.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage rules: 'Pass every lead id in a single call (up to 50) — do not loop one call per lead.' It also specifies prerequisites (assignee must be an active non-viewer member, see list_lead_settings.assignableMembers) and explains how to unassign (omit/null). It does not explicitly name alternative tools for the same operation, but it points to a sibling for prerequisite info, and the 'do not loop' instruction is a clear when-not-to-do.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_formCreate 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.
| Name | Required | Description | Default |
|---|---|---|---|
| scene | Yes | quiz=exam, scored_quiz=scored_quiz, outcome=typing quiz (votes decide which outcome type wins) | |
| theme | No | 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). | light |
| title | Yes | Form title (1-200 characters) | |
| report | No | Report 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. | |
| language | No | Default zh_CN | zh_CN |
| openGraph | No | Social 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. | |
| questions | No | 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. | |
| systemText | No | Optional. Answer-page system text overrides as a key→text map; empty values are dropped and fall back to the language default. | |
| description | No | Optional form description. Allows description-scope rich text (including <img src>). This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The new form id |
| url | No | Admin edit URL |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| theme | No | Answer-page theme name |
| title | No | Form title |
| fields | No | Every question code — read these before writing a formula or dimensions |
| language | No | Primary language of the form |
| outcomes | No | Outcome types (outcome_quiz scene only) |
| shareUrl | No | Public share / answer link |
| hasReport | No | Whether a report configuration was passed |
| publicToken | No | Token behind the public answer link |
| questionCount | No | How many questions / page breaks were created |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations convey write intent (readOnlyHint=false, openWorldHint=true) but carry little else. The description adds genuinely valuable behavioral disclosure beyond them: the tool is not idempotent ('if the call times out it may still have succeeded... retrying blindly can create a duplicate'), it creates only the primary language, and it requires outcomes at create time in the outcome scene. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded: the highest-value operational guidance (one-call creation, scene-specific requirements, idempotency warning) appears in the first sentences, with progressively more detailed notes after. For a 9-parameter tool with deeply nested objects, the density is justified — every sentence earns its place and none restate the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensive for a tool of this complexity: it covers scene-specific creation requirements, the recommended multi-step workflow (create → read codes → update formulas), non-idempotency risk, and language handling, while pointing to sibling tools for follow-up. The output schema exists, so return values need no explanation. The only gap is not addressing the form-template path (create_form_from_template) as an explicit alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining scene-specific semantics (outcome_quiz requires report.outcomes; scored_quiz needs dimension formulas and can reference dimensionScores), and by describing the create-then-fill workflow where structuredContent.fields carries question codes that must be read before writing report.formula. This adds real meaning the schema's per-field descriptions do not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Create a form in the team this token is bound to') and immediately distinguishes the tool from its siblings by instructing the agent to pass questions and report config in one call 'instead of following up with per-question calls' — clearly routing away from add_question/insert_question. The one-call-create semantics set it apart from create_form_from_template, update_form, and create_form_translation without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: create everything in a single call, then fill in formulas via update_form / set_dimension_analysis afterward, and use create_form_translation for additional languages. It explicitly names translation as the alternative for non-primary languages. However, it never contrasts with create_form_from_template or clarifies when one would update versus create, so the exclusion guidance is partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_form_from_templateCreate form from templateAInspect
Create a new form in the current team from a public template (find template ids with list_templates). Clones the template structure, scoring/report configuration, visual settings, and all language versions in one call; 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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional new form title; defaults to the template title | |
| templateId | Yes | The template ID to create the form from |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The new form id |
| url | No | Admin edit URL |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| title | No | Form title |
| language | No | Primary language cloned from the template |
| shareUrl | No | Public share / answer link |
| publicToken | No | Token behind the public answer link |
| translationLanguages | No | Languages cloned along with the structure |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a non-read-only, non-destructive, open-world operation, but the description adds substantial behavioral detail: it clones template structure, scoring/report configuration, visual settings, and all language versions in one call. Critically, it warns that the call is not idempotent and that retrying after a timeout may create duplicates. This goes far 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each earning its place: core action, what is cloned, post-creation workflow, and idempotency warning. It is front-loaded with the main purpose and the additional caveats are critical rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that creates from a template and has non-idempotent behavior, the description covers the core semantics, the source of template IDs, the relationship to sibling tools, and the retry risk. An output schema exists, so return-value documentation is not required here, and no critical invocation detail appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value by directing users to list_templates for finding templateId and noting that title overrides the template title. It does not add information about formatting or constraints beyond the schema, but the extra guidance around template ID discovery and title override justifies a slight upgrade.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Create a new form in the current team from a public template.' It distinguishes itself from sibling create_form by explicitly saying it is the fastest path when a suitable template exists and should be preferred over building from scratch. It also points to list_templates for finding template IDs, removing ambiguity about resource provenance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'This is the fastest way to build a quiz when a suitable template exists — prefer it over building from scratch with create_form.' It also explains the post-creation workflow with update_form / update_question and provides a concrete prerequisite via list_templates. This is strong routing guidance relative to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_form_translationCreate form translationAInspect
Add a language version (translation) to a form. Clones the source text as the initial draft and returns it so you can translate right away: edit the human-readable text in place, keep every code identical to the source, then save with update_form_translation. The language must differ from the form's primary language, and there is at most one translation per language (see list_form_translations).
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The source form UUID | |
| language | Yes | Target language for the new version. Must differ from the form's primary language. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cloned | No | The cloned source draft — translate the text in place, keep every code, then save |
| formId | No | The source form |
| language | No | Language of the new version |
| shareUrl | No | Public link for this language (source token + ?lang=) |
| translationId | No | The new translation id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavior: the tool clones the source text as an initial draft and returns it for immediate editing. It also surfaces constraints not fully visible in the schema, such as the one-translation-per-language uniqueness rule.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the purpose, then gives the workflow, then the constraints. Every sentence adds necessary information, and there's no empty or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two required parameters, an output schema, and annotations already present, the description covers enough for correct invocation and follow-up: purpose, constraints, return-as-draft behavior, and the next tool to use. The agent is fully equipped to call and act on the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is strong. The description adds useful meaning by framing formId as the source whose text is cloned and language as a value that must be unique per form, pointing to list_form_translations to verify validity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: adding a language version/translation to a form. It also differentiates itself from siblings by explicitly describing the clone-then-edit workflow and pointing to update_form_translation as a separate save step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use this tool: when adding a new translation, not editing an existing one. It directs the agent to list_form_translations for the at-most-one-per-language rule and to update_form_translation for saving edits, so the agent can choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_formDelete formADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The form UUID to move to trash |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The form moved to trash |
| message | No | Human-readable result, including how long it stays recoverable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly states this is a destructive/state-changing operation ('delete', 'move to trash', 'auto-purged'), but the annotations declare readOnlyHint: true. This is a direct annotation contradiction, so the behavioral transparency score must be 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences front-load the action, then explain recovery and permissions. No filler, and each sentence adds operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the action, recovery window, restore alternative, and permission model, which is complete for a soft-delete tool. The contradictory readOnlyHint makes full coherence slightly less complete, but the textual description itself is thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the only parameter formId as a UUID, so the description adds little about parameters. The described team/owner context is about authorization rather than the parameter's meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Move a form into the trash / soft delete') on a specific resource (form) within a context ('current team'). It lucidly distinguishes this soft-delete operation from a hard delete and names the recovery path via restore_form, making the tool's purpose unmistakable against siblings like delete_form_translation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear invocation context: soft-delete rather than permanent removal, recoverable within 5 days before auto-purge, and explicitly points to restore_form as the undo path. It also states the authorization boundary (form owner or team owner/admin). It does not mention when to prefer duplicate/delete_form_translation, but that is not necessary for this tool's core use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_form_translationDelete form translationADestructiveInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The source form UUID | |
| language | Yes | Which language version to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The source form |
| deleted | No | Always true on success; submission records are kept |
| language | No | Language version that was deleted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive, but the description adds meaningful behavioral details: submission records are anchored to the source form and not deleted, and reports for historical records in the deleted language fall back to source text. It also notes the primary language cannot be deleted, which is a significant constraint. These go beyond the annotations and inform the agent of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no redundancy. The purpose is front-loaded, the behavioral consequences are stated concisely, and the constraint about the primary language is clear. Every sentence adds value and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with an output schema present and annotations covering destructiveness, the description covers the key caveats: submissions are preserved, reports fall back, and primary language is excluded. It does not address potential errors (e.g., deleting a nonexistent language) or idempotency, but these are minor for this tool's complexity. Overall it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions for both formId and language are sufficient (100% coverage). The description does not add extra parameter semantics; it only restates that a language is being deleted and mentions the primary language restriction, which is not directly tied to the parameter details. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the action clearly: 'Delete one language version (translation) of a form.' The resource is specific (a translation of a form), and it distinguishes itself from deleting the whole form (delete_form) and from other translation tools (create/update/get) by focusing on removal. It also clarifies the primary language cannot be deleted, which further scopes the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context for when to use this tool by stating what it deletes (a translation, not the source) and that the primary language cannot be deleted this way. It implies that other tools handle the primary language or whole form deletion, but does not explicitly name alternatives like delete_form or update_form_translation. This is clear but not fully explicit about when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_questionDelete questionADestructiveInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The code of the question to delete | |
| formId | Yes | The form ID the question belongs to |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The form that was edited |
| deletedCode | No | The question code that was removed |
| remainingCount | No | Question / page-break count left in the form |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description appropriately focuses on additional behavior: the types of items supported (including page breaks and display blocks) and the rule that deleting the last item is allowed. This adds context beyond the annotations and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no redundancy. The purpose is front-loaded, the item types are listed, and the edge case (empty shell) is stated. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple deletion tool with an output schema available, the description covers the scope of deletion, supporting item types, and the edge case of empty forms. It does not discuss error handling (e.g., missing code) but that is typically implicit. Overall, sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters (formId, code), so the schema already documents them fully. The description adds the hint that deletion is 'by code' (implying code is the unique identifier), which is a minor clarification but does not expand on format or constraints. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Delete') and resource ('a single item from a form by code') and clearly enumerates item types (question, page break, display block). It distinguishes from sibling tools like update_question, insert_question, and delete_form by scope (single item vs whole form).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly defines usage by specifying exactly what it deletes and that deleting the last item produces an empty form. It does not explicitly name alternatives or state when not to use it, but the scoping to single items differentiates it from form-level deletion. Clear context, though no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_formDuplicate formAInspect
Duplicate a form in the current team: clones its structure, scoring, report, visual settings and all language translations into a brand-new form owned by you (with fresh share links). Does NOT copy submission records, sharing, integrations, or ban state. Useful for cloning a proven quiz and tweaking it. Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.
| Name | Required | Description | Default |
|---|---|---|---|
| newTitle | No | Optional title for the copy; defaults to "<source title> (copy)" | |
| sourceFormId | Yes | The form UUID to duplicate |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The new (copied) form id |
| url | No | Admin edit URL of the copy |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| title | No | Title of the copy |
| shareUrl | No | Public share / answer link of the copy |
| fieldCount | No | How many questions were copied |
| publicToken | No | Fresh token of the copy |
| translationLanguages | No | Languages copied along with the structure |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint false, destructiveHint false), the description adds crucial behavioral context: the operation is non-idempotent and can silently succeed on a timeout, and it clarifies ownership changes (new form owned by you) and what data is intentionally excluded. This is exactly the kind of side-effect disclosure that 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet comprehensive, with each sentence earning its place: core action, exclusions, use case, and a non-idempotency warning. The main verb and object are front-loaded in the first sentence, making the tool's purpose instantly recognizable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema present, the description covers all essential decision factors: what is cloned, what is not, the use case, and the retry caveat. Nothing an agent needs to safely invoke it is missing; the output schema handles return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%—both sourceFormId and newTitle are fully described in the input schema. The description adds no additional parameter-level meaning, so the baseline of 3 applies. It doesn't need to compensate for any schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair, 'Duplicate a form in the current team,' and enumerates exactly what is cloned (structure, scoring, report, visual settings, translations) and what is not (submissions, sharing, integrations, ban state). This clearly distinguishes it from siblings like create_form or create_form_from_template, which create new forms from scratch or templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a concrete use case—'cloning a proven quiz and tweaking it'—which tells an agent when to reach for this tool. It does not explicitly name alternative tools or give a when-not-to-use rule, but the scope of duplication versus creation is unambiguous from the purpose statement, so the guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finalize_image_uploadFinalize image uploadAInspect
Step 2 of 2 for adding an image: call this AFTER you have PUT the file to the uploadUrl returned by prepare_image_upload. It verifies the uploaded object in storage, records it in the team media library and returns a media id + public URL. To use the image as a quiz cover or a landing-page cover, call update_form with flagImg or landingImage set to the returned media id.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | Optional alt text for the image. | |
| key | Yes | The object key returned by prepare_image_upload. | |
| filename | Yes | Original filename for admin display / download (same value passed to prepare_image_upload). | |
| mimeType | Yes | Image MIME type used at prepare time. Must be one of image/png, image/jpeg, image/gif, image/webp. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | Permanent object key |
| url | No | Public URL of the stored image |
| mediaId | No | Media id — pass it to update_form as flagImg / landingImage |
| filename | No | Original filename |
| filesize | No | Size in bytes, as measured on storage |
| mimeType | No | Detected image MIME type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating, non-destructive operation. The description adds meaningful side-effect context: it verifies the object in storage, records it in the media library, and returns a media id + public URL. Failure modes and auth requirements aren't detailed, but the core behavior is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact, front-loaded sentences with no filler. The critical timing constraint is stated immediately, and the next-step guidance is presented efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, fully documented parameters, and a description that covers workflow position, side effects, and downstream usage, an agent has everything needed to invoke the tool correctly and understand its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all 4 parameters with good descriptions at 100% coverage. The description reinforces that key, filename, and mimeType come from the prepare step, but adds limited new parameter-level meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as step 2 of a 2-step upload flow, specifying the exact action (verify, record, return media id + public URL) and distinguishing it from prepare_image_upload and update_form. An agent can immediately understand what this tool does and how it fits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call this tool ('AFTER you have PUT the file to the uploadUrl') and what to do next ('call update_form with flagImg or landingImage'), providing clear sequencing and pointing to the relevant sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_active_tenantGet active teamARead-onlyInspect
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".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Team id |
| name | No | Team name |
| role | No | Your role in this team |
| slug | No | Team slug |
| examineeSignupDisabled | No | true = respondent self-signup is off for this team, so any quiz that asks for a login turns away respondents who are not on the roster yet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description reveals important operational behavior: the tool reports examineeSignupDisabled and what that flag means in practice, including its impact on login-required quizzes. It also communicates the implicit 'active tenant' state, adding value beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then adds the flag explanation and a practical caution. Every sentence contributes valuable information; the length is justified by the important operational nuance it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers what the agent needs: what the tool returns, why it matters, and the key flag to inspect. Combined with the output schema and read-only annotation, nothing critical is missing for an agent to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema already covers this completelyheb; the description adds no parameter details because none are needed. It provides meaningful context about what the returned data represents, which is more useful than mere schema confirmation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and the resource 'team (tenant) this token is currently operating against,' with the additional scoping note that all write tools default to this tenant. This makes the tool's purpose unambiguous and implicitly distinguishes it from tenant-switching tools like switch_active_tenant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete contextual usage: it explains that this is the token's operating context, that write tools default to it, and specifically advises checking the examineeSignupDisabled flag before attributing sign-in problems to a quiz. It doesn't explicitly enumerate when not to use it, but the usage context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_booking_availabilityGet booking availabilityARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| toDate | Yes | Range end (exclusive), ISO datetime | |
| fromDate | Yes | Range start, ISO datetime | |
| bookingId | No | Optional: compute availability for rescheduling this booking, excluding the slot it currently occupies. Omit to see availability for the team as a whole. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slots | No | Bookable start times as ISO datetimes — reschedule_booking only accepts one of these |
| enabled | No | false when the team has booking off or the plan does not include it |
| timezone | No | The team's booking timezone |
| slotSeats | No | Per-slot capacity |
| requireApproval | No | Whether new requests need approval (returned when booking is off) |
| slotDurationMinutes | No | Length of one slot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds meaningful behavior beyond that: it reports enabled:false when booking is off or not in the plan, excludes the current slot when a bookingId is passed, warns that invalid start times are rejected, and discloses server-side range clamping. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each earning its place: purpose and computation, special return value, rescheduling workflow and rejection behavior, and range clamping. The main purpose is front-loaded and there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and read-only annotations already cover safety, the description covers all necessary invocation context: availability computation, enabled:false handling, bookingId semantics, the precondition for reschedule_booking, and server-side range limits. Nothing essential 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents all three parameters. The description reinforces bookingId's role by explaining the current slot is 'not counted as taken', but it adds little beyond the schema's own description for that parameter and nothing new for fromDate/toDate. This meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read the current team's bookable time slots in a date range'. It further distinguishes the tool from siblings like list_bookings by explaining slots are 'computed from the team's weekly booking rules minus what is already taken', making the availability concept unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: pass bookingId for rescheduling and 'always call this before reschedule_booking' because an out-of-range start time is rejected. It does not explicitly state when to prefer list_bookings or other sibling tools, but the availability-versus-bookings distinction is sufficiently clear for routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_examineeGet respondentARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| examineeId | Yes | The examinee business ID (e.g. AB1234567890), as shown in list_examinees |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Masked name (J*n) |
| No | Masked email (j***g@example.com); never pass it back as an argument | |
| avatar | No | Uploaded avatar as { id, url } |
| status | No | Account status |
| tenant | No | Team (tenant) the respondent belongs to |
| createdAt | No | ISO datetime of first sign-up |
| updatedAt | No | ISO datetime of the last change |
| customData | No | Team-defined custom fields; phone-typed values come back masked |
| examineeId | No | Business ID of the respondent (e.g. AB1234567890) — use it to address them |
| avatarPreset | No | Preset avatar reference { theme, seed }, when no image was uploaded |
| emailVerified | No | Whether the email has been verified |
TDQS
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 covered. The description adds valuable behavioral context by stating that customData is included and that sensitive auth fields are never returned, which goes beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no filler. The core action and parameter are front-loaded, and the additional clarifications (a.k.a. respondent, customData, sensitive fields) each add relevant information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter read tool with an output schema and safe annotations. The description covers scope, identity of the parameter, what is returned, and what is intentionally omitted. Nothing essential for calling the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains examineeId as 'The examinee business ID (e.g. AB1234567890), as shown in list_examinees'. The description largely repeats this information, adding only the 'current team' scope, so it does not meaningfully enhance the parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('View'), identifies the resource ('one examinee'), and specifies the lookup key ('examineeId'). It also clarifies scope ('in the current team') and content ('including customData'), making it clearly distinct from sibling tools like list_examinees and update_examinee.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended use clear: retrieve full details for a single examinee by business ID, with the additional hint that the ID is the one shown in list_examinees. It does not explicitly name alternative tools or exclusion conditions, so it stops short of a 5, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_formGet formARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The form UUID | |
| includeFields | No | Whether to return fields[] (raw data of questions + page breaks), default true. For large forms you can pass false to skip | |
| includeReport | No | Whether to return the report configuration, default true |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Form id |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| theme | No | Answer-page theme name |
| title | No | Form title |
| fields | No | Full question list with code / choices / scoring (only when includeFields) |
| report | No | Report configuration, trimmed to the scene (only when includeReport) |
| isActive | No | Whether the form is open for submissions |
| language | No | Primary language |
| shareUrl | No | Public share / answer link |
| createdAt | No | ISO datetime |
| openGraph | No | Social share card { title, description, image, keywords } |
| updatedAt | No | ISO datetime |
| systemText | No | Overridden system copy, keyed by text key |
| description | No | Form description |
| publicToken | No | Token behind the public answer link |
| translationLanguages | No | Languages that already have a translation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so no safety behavior needs restating. The description adds useful output-behavior context beyond the schema by explaining where outcome codes live (report.outcomeAnalysis.outcomes) and how language fields are structured, which helps the agent interpret responses correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The main purpose and output scope are front-loaded, and the second sentence adds clarifying output semantics rather than repeating schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read-only tool with an output schema and complete parameter descriptions, this description is complete. It covers the tool's scope, key data fields, outcome-code relationships, and translation-language semantics, so an agent has enough to understand both invocation and returned data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains id, includeFields, and includeReport with their defaults. The description implicitly relates fields[] and report to the include flags, but it adds no additional parameter semantics beyond what the input schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: "View one form of the current team in full," which clearly distinguishes it from list_forms and get_form_stats. It also specifies what "full" means by naming fields[] and the report configuration, so an agent knows exactly what this tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 one complete form including its questions and report configuration, not just a form listing or translation. It does not explicitly state when-not against related tools like get_form_translation or list_forms, but the context is strong enough for a retrieval tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_funnelGet form funnelARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, default 30, max 180 | |
| formId | Yes | The form UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | Look-back window actually used |
| formId | No | The form this funnel belongs to |
| dropOff | No | Where unsubmitted sessions gave up |
| overall | No | Stage counts: { viewed, started, submitted, leadCaptured, reportViewed, ctaClicked, shared } |
| channels | No | Funnel split by channel |
| utmCombos | No | Funnel split by UTM combo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, so the read-only nature is clear. The description adds that it reads from form_sessions telemetry and covers stages, but does not disclose the exact output structure (though output schema exists). It doesn't mention any rate limits or aggregation details, which is acceptable given annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense paragraph. It front-loads the core purpose, then lists details. It's not overly long for the complexity. The structure could be improved with bullet points, but it remains readable and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 2 parameters, rich output schema, and annotations, the description covers the key points: what data is included (stages, channels, UTM combos, drop-offs), the source (form_sessions), and the primary use case. It doesn't explain the output schema, but that's covered by the schema. It might miss specifics like pagination, but with a limited look-back window, that's minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both days and formId are documented in the schema. The description adds the context that 'days' is a look-back window and that the funnel is for the current team, but that's minimal extra. The baseline is 3 since the schema carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it reads a conversion funnel for a form, enumerates the specific stages (viewed → started → submitted → ...), and mentions per-channel and drop-off variations. It distinguishes itself from 'get_form_stats' and other form tools by specifying the funnel focus and the telemetry source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use it: 'Use this to find where respondents drop and improve conversion.' This is a direct usage guideline. It implicitly differentiates from get_form (form details) and get_form_stats (general stats) by focusing on funnel/drop-off analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_statsGet form statsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in days, default 30, max 180 | |
| formId | Yes | The form UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | Look-back window actually used |
| trend | No | One entry per day in the window, zero-filled |
| formId | No | The form these stats belong to |
| devices | No | Submissions by device type |
| channels | No | Submissions by utm_source |
| overview | No | KPI block: { totalSubmissions, todaySubmissions, yesterdaySubmissions, last7daysSubmissions, last30daysSubmissions, uniqueExaminees, anonymousSubmissions, reportCompleted, reportFailed, reportPending, avgScore, latestSubmittedAt } |
| utmCombos | No | Submissions by UTM combo |
| loginTypes | No | Anonymous vs registered submissions |
| answerDistributions | No | Per-question answer distribution (choice-style questions only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety profile is covered. The description adds useful context about the read scope (current team, time window) and the variety of statistics returned, but does not disclose any additional behavioral aspects (e.g., potential latency, data freshness, or auth requirements). Given the annotations cover the main safety concerns, the description adds moderate value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that front-loads the key action and scope, then uses a colon to introduce a list of the included statistics. While long, each item adds substantive value and there is no redundancy. It is efficiently structured without extraneous filler, but could potentially be split into two sentences for readability without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description comprehensively lists all the types of statistics returned, states the scoping to the current team and time window, and gives an explicit use-case ('gauge how a quiz is performing'). Given that an output schema exists (which would describe the response shape), the description covers the semantic context well. It does not mention edge cases like empty datasets, but these are unlikely to be required for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – both parameters ('formId' and 'days') are fully documented in the schema. The description merely references 'over the last N days' without adding any new meaning, and does not clarify parameter syntax or relationships beyond what the schema provides. Baseline of 3 applies per the rubric.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Read submission statistics for a form') with specific scope ('in the current team over the last N days') and enumerates the exact data dimensions returned (KPIs, daily trend, channels, UTM combos, login types, device breakdown, per-question distributions). It is specific enough to distinguish from related siblings like get_form_funnel or get_form without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this to gauge how a quiz is performing and to suggest improvements,' providing clear context for when the tool is appropriate. However, it does not explicitly mention any alternative tool or state when NOT to use it, so it lacks direct comparison with siblings like get_form_funnel. It provides strong guidance but no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_translationGet form translationARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The source form UUID | |
| language | Yes | Which language version to read |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | No | Translated title |
| fields | No | Translated questions, mirroring the source codes |
| formId | No | The source form |
| report | No | Translated report copy |
| isActive | No | Whether this language version is live |
| language | No | Language of this version |
| shareUrl | No | Public link for this language |
| updatedAt | No | ISO datetime |
| systemText | No | Translated system copy |
| description | No | Translated description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description correctly aligns by describing a non-destructive read operation. It adds behavioral detail beyond annotations by disclosing the error condition (returns error if language version does not exist) and clarifying the returned content (mirrored fields[] and report).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense paragraph with no filler. It front-loads the primary action, includes critical context, and routes to the necessary sibling tools. Every sentence adds value; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with a rich output schema, the description covers the purpose, usage context, potential error condition, and follow-up actions. It fully equips an agent to call the tool correctly without needing to inspect siblings or infer behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters (formId and language), so the schema provides full documentation. The description adds context by mentioning 'source form' for formId and using 'which language version to read' for language, which slightly enriches but does not significantly surpass the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Read') and resource ('full content of one language version of a form'), and distinguishes itself from siblings like get_form and create_form_translation. It explicitly mentions the fields included, making its scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Use this to fetch the current draft before translating'. It also gives clear when-not-to-use context by explaining error conditions (if language version doesn't exist, create first) and names the sibling tools (update_form_translation, create_form_translation) for the next steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_leadGet leadARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | The lead id (the leadId returned by list_leads) | |
| includeRecords | No | Include the respondent's submission history (default true) | |
| includeComments | No | Include the internal follow-up comments written by team members (default false) | |
| includeActivities | No | Include the change timeline: status / assignee / tag changes and submissions (default false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | Colour tag codes on this lead |
| leadId | No | Lead id — address a lead by this, never by a masked email |
| status | No | Follow-up status code (team-defined, see list_lead_settings) |
| records | No | Submission history as { totalDocs, items } (unless includeRecords was false) |
| assignee | No | The member handling this lead as { id, email, username }, or null |
| comments | No | Internal follow-up notes written by team members (only when includeComments) |
| createdAt | No | ISO datetime the lead was created |
| firstForm | No | The quiz that first captured this lead as { id, title } |
| activities | No | Change timeline as { totalDocs, items } (only when includeActivities) |
| respondent | No | The respondent { id, examineeId, email, name, customData, ... }, PII masked |
| nextBooking | No | The next active booking of this respondent, or null |
| recordCount | No | How many times this respondent submitted |
| lastRecordAt | No | ISO datetime of the most recent submission |
| firstRecordAt | No | ISO datetime of the first submission |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: results are scoped to the current team, all extra data (submissions, comments, change timeline) is opt-in, and lookup must never use a masked email. Return-value details are left to the output schema, which is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the primary purpose and result contents; the second covers optional inclusions and the critical lookup rule. Every clause earns its place and the structure supports quick comprehension by an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with a rich output schema and fully described parameters, the description is complete: it names the identifier, scopes the query to the current team, explains the optional expansions, and warns against the masked-email anti-pattern. An agent has everything needed to call this tool correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters well, giving a baseline of 3. The description adds value by translating the boolean flags into the exact content they include (submission history, internal comments, change timeline) and by emphasizing the leadId/examineeId reference rule. This is useful extra semantic guidance, though the schema already carries the core meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'View one lead of the current team by leadId.' It then enumerates the payload contents (follow-up status, assignee, tags, respondent block, next booking), making it unambiguous what this tool returns and clearly distinct from list-oriented or examinee-focused siblings. It leaves no doubt that the resource is a single lead, not a record or examinee.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear contextual guidance: the lead must belong to the current team, and lookups must use leadId/examineeId rather than a masked email. It also clarifies the optional include flags behavior. However, it does not explicitly state when to prefer get_lead over sibling tools like get_examinee or list_leads, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recordGet recordARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| recordId | Yes | The record id (the `id` returned by list_records) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Record id — address a submission by this |
| data | No | The submitted answers keyed by question code, as typed by the respondent — with any email address or phone number inside them masked |
| formId | No | The quiz this submission belongs to |
| examinee | No | The respondent { id, examineeId, email, name, customData }, PII masked |
| metadata | No | Channel attribution { utmSource, utmMedium, utmCampaign, utmTerm, utmContent, referrer } |
| reportUrl | No | Public report page URL for this submission |
| updatedAt | No | ISO datetime of the last change |
| shareToken | No | Token that makes this single report page shareable |
| submittedAt | No | ISO datetime of submission |
| reportResult | No | The complete frozen report { status, overallAnalysis, dimensionAnalysis, outcome, aiEvaluation, aiSuggestion } |
| serialNumber | No | Per-form sequence number of the submission |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive, covering the safety profile. The description adds a valuable behavioral detail: email and phone numbers in answers are masked, a privacy constraint the agent should anticipate. It also notes the report is 'frozen,' implying a snapshot, which is useful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, consisting of two sentences with no fluff. The first sentence packs the purpose and included data, while the second adds the masking detail. It is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the response format is already defined externally. The description covers what the tool returns (examinee, answers, UTM, frozen report) and notes the masking behavior, which is sufficient for an agent to call the tool correctly. No additional context like pagination or permissions is needed for this single-read retrieval.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes the sole parameter `recordId` with 100% coverage, including its origin from `list_records`. The description reiterates this in text but does not introduce additional meaning or nuances beyond what the schema states. Since the schema carries the semantic load, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('View'), a specific resource ('submission record (lead)'), and scopes it to the current team and a single record id. It lists the contents (examinee, answers, UTM, frozen report), and explicitly references `list_records` as the source of the id, distinguishing it from other get/list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear prerequisite by explaining that the record id comes from `list_records`, guiding the agent on how to obtain the argument. It implies this is the detailed view for one submission record but does not explicitly name alternatives or state when not to use them. The specificity of 'full detail' and the mention of report results give sufficient context to select it for inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_questionInsert 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.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | NumberField only: maximum allowed input value (must be >= min). Rejected for other question types. | |
| min | No | NumberField only: minimum allowed input value (respondents cannot submit a smaller number). Rejected for other question types. | |
| code | No | Optional 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. | |
| name | No | Question 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). | |
| type | Yes | Question type; Breaker means a page break, no name/choices etc. needed; Statement / Swiper are display-only blocks that collect no answer | |
| unit | No | NumberField only: display unit suffix shown after the input, e.g. "kg" / "$" / "min". Rejected for other question types. | |
| after | No | Insert after this code; choose either after or before | |
| items | No | 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. | |
| score | No | Points 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). | |
| steps | No | Rate 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. | |
| words | No | Rate 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. | |
| before | No | Insert before this code; choose either after or before | |
| formId | Yes | The form ID to insert the item into | |
| aiMatch | No | Only 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. | |
| choices | No | Choice-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. | |
| content | No | 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. | |
| explain | No | Optional answer explanation. The frontend renders it in the question's "answer explanation" field (DescriptionEditor); the rich-text rules are identical to description. Do not stuff the answer explanation into description — that is the question's supplementary note and will not be shown as an explanation to respondents/graders. | |
| shuffle | No | Ordering 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. | |
| multiple | No | DropDown 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). | |
| required | No | Whether the question is required, default false | |
| precision | No | DateField / 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. | |
| trueLabel | No | TrueFalse 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". | |
| falseLabel | No | TrueFalse 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". | |
| description | No | Optional supplementary note for the question. Allows a wider HTML subset: everything the stem allows + <h1>-<h6> <ul> <ol> <li> <blockquote> <a href> <img src> <hr> <art-field> (variable placeholder, data-type / data-cid); unsafe protocols (javascript:/data:) and unknown attributes are stripped. This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| trueOutcomes | No | Outcome 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. | |
| correctAnswer | No | The "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". | |
| decimalPlaces | No | NumberField 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. | |
| falseOutcomes | No | Outcome 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. | |
| trueDimensionScores | No | 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. | |
| falseDimensionScores | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| field | No | The created question, including its generated code |
| formId | No | The form that was edited |
| position | No | 0-based index the question landed at |
| itemCount | No | Question / page-break count after the insert |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, but the description adds critical behavioral context: 'Not idempotent: if the call times out it may still have succeeded, so retrying blindly can create a duplicate — check first, then retry only if it is really missing.' This is exactly the kind of behavioral disclosure that goes beyond annotations. It also clarifies that type determines which fields apply and that inapplicable fields are rejected or ignored.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: it front-loads the core action and positioning, then the end-case alternative, then the idempotency warning. The schema-level description is long but that's a separate field. The tool description itself is compact and every sentence earns its place. Slight deduction for the schema description being very long, though that's not the tool description's fault.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 30-parameter tool with 100% schema coverage and an output schema, the description is remarkably complete. It covers positioning, alternatives, non-idempotency, type applicability, and scene rules. The schema's own description field covers the field-applicability matrix in detail. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 by summarizing the field-applicability matrix (which fields go with which type/scene) and by explaining the before/after positioning semantics. However, most parameter-level detail is already in the schema, so the description doesn't need to repeat it. The added value is the cross-cutting applicability guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Insert an item at a specific position: a question, a page break (Breaker) or a display block (Statement with `content` / Swiper with `items`).' It clearly distinguishes from siblings like add_question (insert at end) and move_question (reorder existing). The title 'Insert question' is slightly narrower than the description, but the description fully clarifies the broader scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool vs alternatives: 'To insert at the end, use add_question.' It also explains how to reference positions via before/after with field codes from get_form, and how to insert at the very front. The non-idempotency warning with retry guidance is a strong usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invite_memberInvite memberADestructiveInspect
Invite someone to the active team (tenant) by email. The pending membership is created immediately and an invitation email with a join link is queued for delivery; the link and its token are never returned in the tool result. Only the team owner or an admin can invite; the call is rejected for other roles. role defaults to "member" and may be "viewer" (read-only) or "admin". You cannot invite someone as the owner. Fails if the email is already a member or already has a pending invite, or if the team has hit its member limit. Operates on the team this token currently targets — use list_my_tenants / switch_active_tenant to change teams first.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Role to grant. Defaults to "member": "viewer" is read-only, "admin" manages the whole team. Cannot be "owner". | |
| Yes | Email address of the person to invite. |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | No | Role granted by the invite |
| No | Address the invite was sent to | |
| membershipId | No | The created membership record |
| invitationQueued | No | Always true — the invitation email has been queued for delivery, not yet confirmed sent |
| isUserRegistered | No | Whether that address already had a RooQuiz account |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds valuable context beyond these: it explains the side effects ('pending membership is created immediately and an invitation email with a join link is queued'), the fact that the link/token is never returned, and role restrictions. This goes beyond the annotations to set accurate expectations, without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than minimal but every sentence carries essential information: action, side effects, restrictions, failure conditions, and contextual preparation. It is front-loaded with the core purpose and then expands logically. While it could be trimmed slightly, the density of useful content justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's side effects and role-based restrictions, the description covers all necessary aspects: when to use it, prerequisites, failure modes, and the non-return of sensitive data. An agent can correctly invoke this tool without needing to infer anything beyond what is stated, making it fully complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (both parameters have descriptions), so the baseline is 3. The description adds value by clarifying the meaning of each role enum value: 'viewer' is read-only, 'admin' manages the whole team, and 'owner' is explicitly excluded. It also confirms the default for 'role'. This enhances the schema without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action and resource: 'Invite someone to the active team (tenant) by email.' It specifies the exact scope and distinguishes it from sibling tools like switch_active_tenant and list_my_tenants by focusing on the invitation action. The verb 'invite' and object 'team' are precise, making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance, including role requirements ('Only the team owner or an admin can invite'), failure conditions ('Fails if the email is already a member...'), and how to prepare the correct context ('use list_my_tenants / switch_active_tenant to change teams first'). This is comprehensive and leaves no ambiguity about when or how to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bookingsList bookingsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only bookings starting strictly before this ISO datetime, optional | |
| from | No | Only bookings starting on/after this ISO datetime, optional | |
| page | No | Page number (1-based), default 1 | |
| sort | No | Sort by start time, default startAt (earliest first) | |
| limit | No | Items per page, default 20, max 100 | |
| formId | No | Only bookings that came from this quiz, optional | |
| status | No | Filter by status. pending = a request awaiting approval (the team has requireApproval on), scheduled = a confirmed meeting, the rest are terminal. Optional. | |
| recordId | No | Only bookings tied to this submission record, optional | |
| examineeId | No | Only bookings by this respondent — the internal examinee id (get_lead's respondent.id), not the examineeId business code. Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | 1-based page returned |
| items | No | The page of bookings (earliest first by default) |
| totalDocs | No | Total bookings matching the filter |
| totalPages | No | Total pages available |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral detail beyond that: the API returns earliest first, descriptions fields per item, masks attendee contact info, and indicates the 'pending' status represents an unapproved booking. This adds meaningful context without redundancy or contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the primary action and scope. All sentences contribute meaningful context: sorting, returned fields, filters, typical use, and attention-masking. It could drop the slightly redundant 'list' wording, but overall it earns its place without significant bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema, an output schema, and clear annotations, the description adds what the agent still needs: the meaning of the 'pending' status, the masked/contact-handling behavior, and how to reference a booking by bookingId. Combined with the structured data, the description is sufficient for an agent 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.
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 a few semantic hints not always in the schema, such as the meaning of 'pending' as being the approval queue and the ability to filter by status/quiz/respondent/time range. But it doesn't need to compensate for schema gaps, and beyond those hints it functions mostly as a summary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as listing 1:1 bookings for the current team, specifies the sort order (earliest first), and enumerates what each item contains. It also mentions it filters by status, quiz, respondent, and time range, which distinguishes it from generic list tools and the related booking mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete typical use case: using status "pending" to view the approval queue waiting on someone. It surfaces privacy behavior (attendee name/email masked) and how to reference a booking by bookingId. It doesn't explicitly state when not to use this tool versus sibling booking tools like review_booking or update_booking_status, but the intended read-only list usage is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_examineesList respondentsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Items per page, default 20, max 100 | |
| search | No | Fuzzy match by email or name, optional | |
| status | No | Filter by status, optional |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | How many are returned in this page |
| items | No | The page of respondents (newest first), PII masked |
| total | No | Total respondents matching the filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description discloses that sensitive auth fields are never returned, the examineeId is returned unmasked, and the listing is scoped to the current team. These details give an agent a clear expectation of the data and behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: two sentences that first state the core purpose, then provide supplemental context (sensitive fields, examineeId unmasking, pointer to get_examinee). Every sentence adds distinct value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description covers the essential operational context: team scope, ordering, sensitive field omission, and the relationship to get_examinee. Nothing an agent needs to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with descriptions (limit with default/max, search as fuzzy match, status as enum). The description adds no additional parameter-specific meaning, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (list), the resource (examinees/respondents), the scope (current team), and the ordering (newest first). It explicitly distinguishes from get_examinee by naming the alternative for full detail, so an agent can select the right tool without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use get_examinee for one examinee's full detail including customData.' It also notes that the examineeId is what get_examinee/update_examinee take, which helps an agent decide between listing and retrieving a single record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_formsList formsARead-onlyInspect
List the forms of the current team. Returned in reverse chronological order of creation, without question content (use get_form for details).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Items per page, default 20, max 100 | |
| scene | No | Filter by scene, optional | |
| titleContains | No | Fuzzy match by title, optional |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | The page of forms (newest first) |
| totalDocs | No | Total forms matching the filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only behavior, so the description adds value beyond them by specifying reverse chronological order and the omission of question content. It also clearly scopes results to the current team. It does not detail pagination behavior, but the annotated readOnlyHint and the schema's limit parameter reduce the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, each earning its place: the first states the core action and scope, the second conveys ordering, content omission, and the pointer to get_form. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation with zero required parameters, a fully described schema, and an output schema present, the description provides all necessary context: current-team scope, ordering, and a pointer to the detail tool. Nothing essential is missing for an agent to decide when to call and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with descriptions and covers 100% of the parameters, so the description does not need to repeat them. It adds no extra semantic detail about the parameters, but none is needed. The baseline of 3 is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('List') on a specific resource ('forms of the current team'), and further clarifies scope by excluding question content. The explicit pointer to get_form for details differentiates it from the most related sibling. This leaves no ambiguity about what the tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use alternative: the tool returns summarized form metadata, and if question content is needed, get_form should be used instead. This directly routes the agent to the correct sibling depending on the need. No further guidance is necessary given the simple read-only nature and optional filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_form_translationsList form translationsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The source form UUID |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | How many translations exist (the primary language is not listed) |
| formId | No | The source form |
| translations | No | The existing language versions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: it returns each translation's language, isActive flag, public share link, and timestamps, and clarifies that the primary language is excluded. This goes beyond the annotations and helps the agent understand the result set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. The first sentence states the action and the return fields; the second clarifies an important edge case (primary language not included). Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a single required parameter, a full output schema, and annotations covering safety. The description explains what is returned and what is excluded. It could mention pagination or ordering, but for a simple list operation with an output schema, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: formId is described as 'The source form UUID'. The description doesn't add much beyond that, but it does imply that formId identifies the form whose translations are listed. Baseline 3 is appropriate since the schema already documents the parameter fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists existing language versions (translations) of a form, and explicitly distinguishes it from get_form by noting the primary language is not included. This differentiates it from siblings like get_form_translation and create_form_translation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need an overview of all translations of a form. It also clarifies that the primary language is handled elsewhere (get_form.language), which helps an agent avoid using this tool for the primary language. It doesn't explicitly name alternatives like get_form_translation, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leadsList leadsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based), default 1 | |
| sort | No | Sort order, default -lastRecordAt (most recent submission first) | |
| limit | No | Items per page, default 20, max 100 | |
| status | No | Filter by follow-up status code (see list_lead_settings), optional | |
| keyword | No | Fuzzy 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. | |
| tagCodes | No | Filter by colour tag codes; a lead matches if it has ANY of them (OR). Optional. | |
| createdTo | No | Only leads created strictly before this ISO datetime (half-open), optional | |
| assigneeId | No | Filter by the assigned member userId (see list_lead_settings.assignableMembers). Pass "me" for the current token's own user. Optional. | |
| createdFrom | No | Only leads created on/after this ISO datetime, optional | |
| hasUpcomingBooking | No | true = 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
| Name | Required | Description |
|---|---|---|
| page | No | 1-based page returned |
| items | No | The page of leads, PII masked |
| totalDocs | No | Total leads matching the filter |
| totalPages | No | Total pages available |
| hasNextPage | No | Whether another page follows |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though readOnlyHint=true and destructiveHint=false already cover the safety profile, the description adds non-obvious behavior: leads are aggregated per respondent across all forms, newest activity first, and the hasUpcomingBooking filter applies within the page so counts remain unfiltered. That is real behavioral disclosure beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences cover the core behavior, default ordering, filter dimensions, and an important lexical rule. It is compact and front-loaded with the main action. It could be split into a more scannable format, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, 10-parameter listing endpoint with an output schema, the description covers the essential semantics (one lead per user, default ordering, filter options, team-defined codes) without re-heating the schema. It does not over-explain return fields, which is fine given the output schema exists. A little more about pagination behavior would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all 10 parameters (100% coverage), so the requirement is low. The description still adds value by explaining the identity rules ('reference a lead by leadId, a respondent by examineeId'), clarifying the team-defined vocabulary, and noting keyword search works against unmasked server-side values. Good but not essential.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource ('List the leads (CRM records)') and immediately sharpens the meaning: one lead per respondent across all forms, with specific fields carried. This distinguishes it from sibling list tools like list_records and list_examinees, so an agent can tell what makes this endpoint unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly gives a prerequisite: 'call list_lead_settings first' to obtain valid status/tag codes and warns 'never guess.' That is solid procedural guidance. It does not, however, spell out when to pick list_leads over other list variants (e.g., list_records or list_examinees), so it falls just short of full score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_lead_settingsList lead settingsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | The team's colour tag library |
| statuses | No | Follow-up statuses in display order |
| assignableMembers | No | Active non-viewer members a lead can be assigned to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description correctly aligns with those. It adds value beyond the annotations by explaining that the tool returns team-specific configuration and that the returned values are required for successful write operations. It doesn't contradict annotations and gives useful context about the tool's role in the workflow, though the output structure is left to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundancy. The first sentence states the core purpose and enumerates the returned items; the second sentence gives critical usage guidance and rationale. It is front-loaded with the primary action and uses every word effectively, exceeding the minimum necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, has an output schema (as indicated in context signals), and annotations cover read-only and non-destructive behavior, the description is fully sufficient. It explains what the tool returns, why it should be called before specific write tools, and the team-specific nature of the data. An agent can call this tool correctly without any additional information beyond what the schema and annotations already provide.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to explain. Baseline for 0 params is 4, and the description doesn't mention parameters at all, which is appropriate. It focuses entirely on the return value and usage context, not requiring any parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it reads the team's lead configuration, enumerating the specific elements (status codes with label/colour, colour tag library, assignable members). It uses an explicit verb ('Read') and resource ('lead settings'), and differentiates itself from sibling write tools by framing itself as the prerequisite read for update_lead, set_lead_tags, and assign_leads. This makes the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to 'Call this before update_lead / set_lead_tags / assign_leads' and explains why: status codes, tag codes, and member ids are team-specific, and write tools reject unknown values. This provides clear when-to-use guidance and implicitly states when not to use it (no need to call for other purposes). It also points to alternative write tools that require this information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_tenantsList my teamsARead-onlyInspect
List all teams (tenants) the current user belongs to. isActive marks the team this token currently operates against.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tenants | No | Teams you are an active member of |
| activeTenantId | No | The team this token currently operates on |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds non-obvious context by scoping results to the current user's memberships and explaining the isActive flag, which goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences deliver purpose, scope, and key field semantics with zero waste. The most important information comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, a read-only annotation, and an output schema present, the description fully covers what an agent needs to call the tool correctly. It even clarifies the ambiguous tenant/team terminology and the isActive field.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is trivially 100%. Per the baseline for parameterless tools, a 4 is appropriate; there is no param info needed and the description adds relevant semantic context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('all teams (tenants) the current user belongs to'). The isActive clarification further distinguishes this from get_active_tenant and switch_active_tenant, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context about scope ('current user belongs to') and the meaning of isActive relative to the active token. It does not explicitly name alternatives or when-not-to-use, but the context is enough to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recordsList recordsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based), default 1 | |
| limit | No | Items per page, default 20, max 100 | |
| since | No | Only records submitted on/after this ISO datetime, optional | |
| until | No | Only records submitted on/before this ISO datetime, optional | |
| formId | No | Filter by form UUID, optional | |
| status | No | Filter by report generation status, optional |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | 1-based page returned |
| items | No | The page of submissions (newest first) |
| limit | No | Page size actually used |
| totalDocs | No | Total submissions matching the filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and destructiveHint, so the safety profile is known. The description adds behavior beyond annotations: records are sorted newest first, PII such as emails and phone numbers is masked in answers, and records must be referenced by examineeId. This meaningfully enriches the agent's expectation of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and front-loads the primary purpose, then gives filters and guidance. It is fairly dense but avoids redundancy, with each sentence serving a distinct role. It could be trimmed slightly, but it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has 6 optional parameters, a full output schema, and safe-read annotations, the description covers ordering, item composition, filter dimensions, a reference/masking subtlety, and points to the more detailed single-record tool. There is no substantial gap for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 well defined. The description adds extra semantics by grouping since/until as a 'submitted-at range' and warning that email/phone answers return masked, reinforcing reference by examineeId. This goes beyond just restating the schema, though most parameter details remain in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('List submission records (leads) of the current team, newest first') and details contained fields (examinee, answers, UTM, report result). It differentiates from siblings by naming get_record for full detail, so an agent can distinguish scope and granularity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use filters, instructs to reference records by examineeId rather than masked email, and directs that single-record full detail should use get_record. This is concrete, actionable when/when-not guidance with an explicit alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesList templatesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Items per page, default 20, max 100 | |
| scene | No | Filter by scene, optional | |
| categoryId | No | Filter by category id, optional | |
| isRecommended | No | When true, only return recommended templates | |
| titleContains | No | Fuzzy match by title, optional |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | The page of templates |
| totalDocs | No | Total templates matching the filter |
TDQS
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 clear. The description adds behavioral context: it filters to 'active templates' and orders by 'most-used first', which is useful for understanding the result set. It does not go into pagination details, but the annotations plus description cover the essential behavior without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long with no filler. The first sentence states the purpose, output fields, and ordering; the second sentence gives a direct workflow pointer to the next tool. It is front-loaded and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the presence of an output schema, annotations that declare read-only safety, and a fully documented parameter schema, the description covers all necessary context. It tells the agent what to do, why, and how to follow up, making it complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All five parameters are fully documented in the schema with descriptions (100% coverage), so the schema already provides the necessary meaning. The tool description does not add extra parameter details beyond what is in the schema, but it does mention the returned fields that relate to the output, which is a slight bonus. Baseline 3 is appropriate since the schema carries the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'active templates in the public template library', enumerates the returned fields, and specifies the ordering. It also distinguishes from sibling list tools like list_forms by focusing on templates and explicitly connecting to create_form_from_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use this tool: to find a template, and then directs the agent to call create_form_from_template with the template id. It also frames this as the fastest way to build a quiz when a suitable template exists, implicitly telling the agent to prefer this path over directly creating a form.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_questionMove questionAInspect
Move an existing item (question, page break or display block) to a specific position by code. Choose either after or before, referencing another field's code. Move to the front: before references the current first field's code. Move to the end: after references the current last field's code.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The field code to move (a question, a Breaker or a display block) | |
| after | No | Move after this code; choose either after or before | |
| before | No | Move before this code; choose either after or before | |
| formId | Yes | form ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | 0-based index after the move |
| code | No | The question that was moved |
| from | No | 0-based index before the move |
| formId | No | The form that was edited |
| changed | No | false when the question already sat at the target position |
| position | No | Current index — returned instead of from/to when no move was needed |
| questionCount | No | Total question / page-break count |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false (mutation) and destructiveHint=false, so the description adds context about how the move works (after/before, front/end). It doesn't disclose potential side effects like reordering implications or error handling, but given annotations, the added value is moderate. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main purpose and mechanism. It includes all essential information without redundancy or fluff. Each sentence contributes value, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a moderate complexity (moving items with after/before and front/end logic), and the description covers the core usage scenarios. An output schema exists, so return value details are not needed in the description. It doesn't mention edge cases like invalid codes or same-position moves, but for an agent, the provided guidance is sufficient to invoke correctly in common cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters are documented. The description adds meaningful semantics beyond the schema: it clarifies that 'after' and 'before' are mutually exclusive, and explains how to reference the first/last field for front/end moves. This enriches understanding of the parameters, especially the interplay between code, after, and before.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the verb 'move' and the resource 'existing item (question, page break or display block)' and specifies the mechanism (by code, referencing another field's code). It also differentiates from sibling tools like add_question, update_question, and delete_question by focusing on reordering, and gives explicit front/end usage. This is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage instructions: choose either after or before, and explains how to move to the front (before the first field's code) or end (after the last field's code). It implies the tool is for repositioning existing items, which distinguishes it from add/update/delete. However, it doesn't explicitly state when not to use it or compare with alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_image_uploadPrepare image uploadAInspect
Step 1 of 2 for adding an image (PNG / JPEG / GIF / WebP) to the current team media library. This tool does NOT receive image bytes — it returns a short-lived presigned URL you upload the file to directly, so even large images never pass through this conversation. Workflow: (1) save the image to a local temp file; (2) if the file is larger than 5MB, compress / downscale it to 5MB or less FIRST (e.g. sips -Z 2048 in.png --out out.jpg on macOS, or magick in.png -resize "2048x2048>" -quality 82 out.webp) — uploads over 5MB are rejected; (3) call this tool with filename, mimeType and (optionally) fileSize; (4) HTTP PUT the temp file to the returned uploadUrl with the matching Content-Type header, e.g. curl -X PUT --upload-file <file> "<uploadUrl>" -H "Content-Type: image/png"; (5) call finalize_image_upload with the returned key; (6) delete the temp file. Max 5MB after compression. Only image/png, image/jpeg, image/gif and image/webp are accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| fileSize | No | Optional 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. | |
| filename | Yes | Original filename for admin display / download, e.g. "cover.png". | |
| mimeType | Yes | Image MIME type. Must be one of image/png, image/jpeg, image/gif, image/webp. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | Staging object key to pass to finalize_image_upload |
| expiresIn | No | Seconds until the presigned URL expires |
| uploadUrl | No | Presigned PUT URL — upload the bytes here, then call finalize_image_upload |
| requiredContentType | No | Content-Type header the PUT must send, or R2 rejects it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark readOnlyHint=false and destructiveHint=false, so the description carries the burden of behavioral disclosure. It adds substantial detail: the presigned URL is short-lived, uploads over 5MB are rejected, the team storage quota is checked up front, and the caller must send a matching Content-Type header. This fully explains side effects and constraints without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence carries load-bearing operational information and the structure is a clear numbered workflow with concrete examples. The key behavioral fact (returns a presigned URL, does not accept bytes) is front-loaded. It is not minimal, but the length is justified by the complexity of the two-step upload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-step upload involving local temp files, compression, MIME constraints, size caps, quota checks, HTTP PUT semantics, and a follow-up finalization tool, this description is complete. It even includes cleanup and tells the agent exactly how to call the sibling next. Since an output schema exists, not describing return values in prose is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds operational meaning beyond the schema: fileSize is optional and refers to the file after compression, it is checked early against the 5MB cap and quota, and the authoritative size check happens in finalize_image_upload. It also clarifies that filename is for admin display and mimeType must match the uploaded Content-Type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource pair: prepares the first step of a two-step image upload and returns a presigned URL rather than accepting image bytes. Explicitly differentiates from finalize_image_upload by numbering itself Step 1 of 2, so an agent can distinguish it from the sibling without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit numbered workflow covering pre-upload compression, when to call this tool, when to PUT to the returned URL, and when to call finalize_image_upload. It also states what the tool does NOT do (receive image bytes), which prevents an agent from attempting a direct upload through this conversation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_bookingReschedule bookingADestructiveInspect
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. Not safe to retry blindly after a timeout: the first call may have succeeded, and retrying can repeat notifications or other side effects — read the current state first.
| Name | Required | Description | Default |
|---|---|---|---|
| startAt | Yes | The new start time, ISO datetime — must be one of the slots from get_booking_availability | |
| bookingId | Yes | The booking id (the bookingId returned by list_bookings) |
Output Schema
| Name | Required | Description |
|---|---|---|
| endAt | No | New end, ISO datetime |
| status | No | Booking status after the move |
| startAt | No | New start, ISO datetime |
| timezone | No | Timezone of the new slot |
| bookingId | No | The booking that was moved |
| slotDurationMinutes | No | Length of the slot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only and destructive behavior, but the description adds meaningfully: the attendee is emailed, the reminder is re-armed, the booking.rescheduled event fires, and retries can repeat side effects. This is beyond what annotations and schema convey and it does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and each major behavioral note earns its place. It is slightly long and a few parameter constraints are restated from the schema, but the extra detail is valuable rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is destructive, mutating, and externally observable via annotations, the description covers prerequisites, side effects, failure conditions, and retry safety. Since there is an output schema, not explaining the return value is acceptable; the agent has everything needed to call and verify this tool safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema documents both parameters and even includes the availability constraint, with 100% schema coverage. The description mostly repeats that startAt must come from get_booking_availability and adds little new parameter-level meaning beyond 'current team' and 'organiser' context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (move a confirmed booking to a different time), the scope (current team, as organiser), and the main constraints. This distinguishes it from status-changing or reviewing tools like update_booking_status and review_booking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to call get_booking_availability first and choose a startAt from the returned slots. It also gives explicit failure conditions (slot taken, another active booking) and explains not to retry blindly after a timeout, covering both when-to-use and cautious when-not-to-retry behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_formRestore formAInspect
Restore a form from the trash in the current team (undo delete_form). Only the form owner or the team owner / admin can restore; errors if the form is not in the trash.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The form UUID to restore from trash |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The form restored from trash |
| message | No | Human-readable result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals permission requirements (owner/admin only), scope (current team), and failure behavior (errors if form is not in trash). This goes well beyond the readOnly/destructive hints and gives the agent concrete expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the action ('Restore'), scope ('from the trash in the current team'), relationship ('undo delete_form'), access restriction, and error behavior. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter restoration action with an output schema and annotations present, the description covers what, where, who can perform it, and when it errors. There is no meaningful missing context for an agent to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes formId as the form UUID. The description adds contextual constraints (must be in trash, current team) but does not add parameter-specific details beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and object: 'Restore a form from the trash in the current team'. It also explicitly frames the operation as
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names its counterpart 'delete_form', states the required context ('from the trash in the current team'), gives the permission prerequisites (owner/admin), and calls out an error condition when the form is not in the trash. This leaves little ambiguity about when the tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_bookingReview bookingADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| decision | Yes | approve = confirm the meeting and release the address; decline = reject the request | |
| bookingId | Yes | The booking id (the bookingId returned by list_bookings) | |
| meetingLink | No | Approve only: the meeting URL for this meeting. Empty falls back to the team setting. | |
| declineReason | No | Decline only: the reason shown to the attendee, max 500 chars. Optional. | |
| meetingInstructions | No | Approve only: how to join / what to prepare, max 1000 chars. Empty falls back to the team setting. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | scheduled after approving, cancelled after declining |
| bookingId | No | The booking that was reviewed |
| reviewedAt | No | ISO datetime of the review |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' destructiveHint, the description discloses the real-world side effects: approving confirms the meeting and emails the attendee the meeting address, while declining sends a 'not approved' note. It also exposes the constraint about already-passed meeting times, which is valuable behavioral information not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the central purpose, and each sentence contributes distinct information: decision semantics, side effects, status constraints, optional parameters, and permissions. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers prerequisites, permissions, decision outcomes, side effects, and optional parameter behavior. Since an output schema exists, not detailing the response shape is acceptable. Nothing necessary for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 well documented. The description adds context about approval-time link/instructions falling back to team settings, but this is largely mirrored in the schema, so it does not substantially elevate meaning beyond the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb and object: 'Approve or decline a pending booking request of the current team.' It clearly distinguishes the core review decision from generic status updates, and the outcomes for each decision are explicitly stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong usage context: it only applies to pending bookings, past-time meetings can only be declined, and only the team owner/admin/lead owner may review. It does not explicitly name alternative sibling tools like update_booking_status, so it stops short of a full when-to-use-versus-alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_dimension_analysisSet dimension analysisADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Multi-dimension analysis title | |
| formId | Yes | The form ID to configure | |
| dimensions | No | The dimension list (at most 50). Pass an empty array to clear the multi-dimension analysis. | |
| showRadarChart | No | Whether to show the radar chart, default true | |
| showStandardLine | No | Whether to show the standard-score line on the radar chart |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The form that was edited |
| dimensions | No | The dimensions after the replace |
| dimensionCount | No | How many dimensions are configured now (0 = cleared) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and openWorldHint=true, but the description adds substantial context beyond that: it discloses that the dimension list is replaced while overallAnalysis is preserved, that dimensions referenced by question dimensionScores or report.formula cannot be removed, and that code stability is maintained for dimensions with the same name. There is no contradiction; the description enhances the annotation. It clearly warns about irreversible replacement and scene-specific behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and long, but every sentence contributes essential context. It is front-loaded with the core action and then layers scene-specific rules and constraints. While it is a single block of text rather than bullet points, it is structurally logical and not redundant. It could be slightly more concise, but the content justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool (scene-specific dimensions, code stability, reference constraints, clearing behavior), the description is comprehensive. It covers prerequisites, limitations (random_knowledge_quiz unsupported), and interaction rules (e.g., formula cannot reference other dimensions). Since an output schema exists, return values are not needed. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the input schema provides 100% coverage with detailed descriptions, the main description adds meaning beyond the schema by explaining how parameters interact: the stable-code logic (pass code to keep/set, omit to keep by name), the scene-specific requirement for fieldCodes vs formula, and the default behavior for standardScore. This is not a restatement but high-level contextual semantics that an agent needs to construct correct calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Set the multi-dimension analysis (form.report.dimensionAnalysis) of a form, replacing the dimension list without touching overallAnalysis'. It clearly distinguishes from sibling tools like update_form_settings by focusing on the dimensionAnalysis attribute, and even names the prerequisite get_form call. This is unambiguous and purpose-specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it differentiates the knowledge_quiz scene (requires fieldCodes) from the scored_quiz scene (formula optional), and warns that 'Not supported for random_knowledge_quiz forms'. It also states prerequisites ('Call get_form first to read the question and dimension codes') and provides a clear way to clear the analysis ('Pass an empty dimensions array'). This leaves no ambiguity about when to invoke this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_lead_tagsSet lead tagsADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How to apply the tags, default replace | replace |
| tags | Yes | The tag codes to apply, from list_lead_settings.tags[].code | |
| leadIds | Yes | The lead ids to tag, max 50 per call |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | replace / add / remove |
| count | No | How many leads were changed |
| items | No | Per-lead result |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true. Description adds concrete destructive semantics: replace overwrites the entire tag set, add/remove are selective, remove tolerates stale codes, and changes are recorded on each lead's timeline. This is valuable context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tight, information-dense description with no filler; efficiently explains modes and caveats in a few sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers scope, batching limits, mode semantics, references the correct source of tag codes, and notes side effects (timeline). Nothing an agent needs to safely invoke it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters, but the description adds field-level behavior beyond the schema: mode-by-mode meaning, the single-call batching instruction, and the stale-code behavior for remove.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise operation: setting colour tags on one or more leads in the current tenant, distinguishes itself from generic update_lead by scoping to tags and listing batch semantics. The verb, object, and scope are all explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: pass every lead id in a single call (do not loop), and explains when to use replace vs add/remove. Does not explicitly route to an alternative tool, but gives complete usage context for the various modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_active_tenantSwitch active teamAInspect
Switch the active team (tenant) for this token. The change persists across sessions until switched again. Caller must be a member of the target team.
| Name | Required | Description | Default |
|---|---|---|---|
| tenantId | Yes | Target team ID. Use list_my_tenants to discover. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The team the token now operates on |
| name | No | Team name |
| slug | No | Team slug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark readOnlyHint=false, and the description goes beyond that by disclosing persistence across sessions and the membership requirement. That is meaningful behavioral context for a state-changing token operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences convey operation, persistence, and a prerequisite with no filler. Key facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter state-change tool with an output schema and full schema coverage, the description is nearly complete. It could mention that get_active_tenant reveals the current team, but that omission is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes tenantId with 100% coverage and even points to list_my_tenants for discovery. The description adds no new parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (switch) on a specific resource (active team/tenant) and explains the scope (for this token). It is immediately distinguishable from siblings like get_active_tenant and list_my_tenants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use it (change active team) and includes the membership prerequisite. It does not explicitly mention siblings or exclusion criteria, but the context is sufficiently clear among the listed tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_booking_statusUpdate booking statusADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | completed = the meeting happened, no_show = the attendee did not turn up, cancelled = call it off and notify them | |
| bookingId | Yes | The booking id (the bookingId returned by list_bookings) |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | completed / no_show / cancelled |
| bookingId | No | The booking that was closed out |
| cancelledAt | No | ISO datetime, set when the booking was cancelled |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true; the description adds valuable side-effect context: cancellation triggers attendee email and a booking.cancelled integration event, while completed/no_show are internal-only. It stops slightly short of spelling out whether the underlying booking is deleted or merely marked, so a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose, conditions, side effects, and alternative. The most decision-relevant constraint is front-loaded and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and annotations, the description covers the operation, preconditions, side-effect differences, and sibling routing. There is no gap that would leave an agent guessing about how or when to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the baseline is 3. The description still adds real meaning beyond the schema by explaining the preconditions tied to each status value ('Only works on ... scheduled; completed / no_show additionally require the meeting to have already started'), which helps an agent choose the correct status. This justifies a 4 rather than a 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs and a resource ('Close out a confirmed booking of the current team'), lists the three status transitions, and explicitly differentiates from review_booking. An agent knows exactly what this tool does and what it is not for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit applicability conditions ('Only works on a booking whose status is scheduled; completed / no_show additionally require the meeting to have already started') and a pointer to the correct alternative ('To handle a pending request use review_booking instead'). This is textbook when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_examineeUpdate respondentADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New examinee name | |
| status | No | Enable (active) or disable the examinee | |
| customData | No | Custom 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. | |
| examineeId | Yes | The examinee business ID (e.g. AB1234567890) to update |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Masked name (J*n) |
| No | Masked email (j***g@example.com); never pass it back as an argument | |
| avatar | No | Uploaded avatar as { id, url } |
| status | No | Account status |
| tenant | No | Team (tenant) the respondent belongs to |
| createdAt | No | ISO datetime of first sign-up |
| updatedAt | No | ISO datetime of the last change |
| customData | No | Team-defined custom fields; phone-typed values come back masked |
| examineeId | No | Business ID of the respondent (e.g. AB1234567890) — use it to address them |
| avatarPreset | No | Preset avatar reference { theme, seed }, when no image was uploaded |
| emailVerified | No | Whether the email has been verified |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the destructiveHint annotation: it warns that customData REPLACES the whole object, that masked values are rejected, and that re-sending read values can wipe phone fields. This is exactly the kind of behavioral trap an agent must know before calling, and no annotation can convey it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: it opens with the core action, then enumerates editable fields manageable size, and finishes with the high-risk customData warning. It is slightly long but every sentence earns its place; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex mutation with high-risk customData semantics, the description covers identification, editable fields, immutable fields, validation rules, and destructive pitfalls. It is complete enough that an agent can safely invoke the endpoint without hidden surprises. An output schema exists, so not re-describing return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite the schema parameter descriptions, the text adds critical semantics: customData replacement semantics, the validation rules (required/unique/type), and the immutable email/tenant fields. It also explains examineeId provenance. This far exceeds what the raw schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and target ('Update an examinee'), identifies the locating key (examineeId), and clarifies the scoped context ('in the current team'). It also names the source of examineeId (list_examinees), so an agent can determine what this tool does and on which resource without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear, actionable context: the examinee is found by examineeId from list_examinees廉, and it enumerates which fields are editable versus immutable (email, tenant, examineeId). It does not explicitly contrast with alternative update tools, but the usage context is strong enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_formUpdate formADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The form ID to update | |
| theme | No | New 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). | |
| title | No | New title | |
| report | No | 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). | |
| flagImg | No | Quiz cover image: a media ID returned by finalize_image_upload, or a media URL. Pass an empty string to clear the cover. | |
| isActive | No | Whether to enable response collection | |
| language | No | Change the form's language. Only allowed while the form has no translation links and is not referenced by other language versions; otherwise rejected. | |
| openGraph | No | Social 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. | |
| systemText | No | Answer-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. | |
| description | No | New description; pass an empty string to clear. Allows description-scope rich text (including <img src>). This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| landingImage | No | Landing 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
| Name | Required | Description |
|---|---|---|
| id | No | Form id |
| scene | No | knowledge_quiz / scored_quiz / outcome_quiz |
| theme | No | Answer-page theme name |
| title | No | Form title after the update |
| flagImg | No | Media id of the quiz cover |
| isActive | No | Whether the form is open for submissions |
| language | No | Primary language |
| hasReport | No | Whether this call replaced the report configuration |
| openGraph | No | Social share card |
| updatedAt | No | ISO datetime |
| systemText | No | Overridden system copy |
| description | No | Form description |
| landingImage | No | Media id of the landing-page cover |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the agent knows this mutates and can destroy data. The description adds genuine behavioral value beyond those flags: report and openGraph merge by sub-key (only what is passed is replaced), systemText is replaced wholesale with {} clearing it, outcomes in the outcome_quiz scene are matched by code so existing images survive, and removing an outcome still referenced by question votes is rejected. It also notes landingImage only sets the image and does not toggle the landing page. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph of roughly 250 words. There is zero fluff and every sentence carries information, but for a tool with 11 parameters and complex merge semantics, a structured format (short intro, then per-behavior bullets) would aid scannability. The key facts are front-loaded in the first sentence, but the remaining run-on sentences compress several distinct behaviors (media handling, merge semantics, outcome matching, systemText replacement, language restriction, sibling routing) into one block, which an agent must parse carefully.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters, nested objects, output schema present) and the 100% schema description coverage, the description provides a complete high-level map: it covers merge semantics, media sourcing, the clear-with-empty-string convention, the language restriction, scene immutability, and routes all out-of-scope operations to named siblings. Return values and detailed parameter rules live in the output schema and input schema respectively, so 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema itself documents every parameter exhaustively (baseline 3). The description adds a compact high-level synthesis: it groups the updatable fields, clarifies the flagImg vs landingImage roles (quiz cover vs landing-page cover, the latter not toggling the page), states both accept a media id from finalize_image_upload, a media URL, or '' to clear, and summarizes the cross-cutting merge vs replace behavior that the schema only documents per-parameter. This is genuine incremental value over the schema, though the schema carries most of the detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Update a form of the current team') and enumerates exactly which fields are in scope: title / description / isActive / flagImg / landingImage / theme / report / openGraph / language / systemText. It actively distinguishes itself from siblings by routing questions to add_question/update_question and dimensionAnalysis to set_dimension_analysis, so an agent can tell it apart from create_form, update_form_settings, and set_dimension_analysis without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance. It names the sibling tools for adjacent operations ('Questions go through add_question / update_question / delete_question / move_question, dimensionAnalysis alone through set_dimension_analysis') and spells out conditional usage rules: language is changeable only while no language versions exist, and scene is never changeable. It also documents the merge-by-sub-key semantics for report and openGraph, so the agent knows how to construct partial updates. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_form_settingsUpdate form settingsADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Custom 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. | |
| formId | Yes | The form UUID | |
| booking | No | The 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. | |
| sharing | No | Result-page sharing: the share button, the personalised share card and the public summary. Turning this off stops respondents spreading their results. | |
| timeLimit | No | 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. | |
| answerSheet | No | The answer-sheet sidebar on the answering page | |
| gaTrackingId | No | Google Analytics measurement id (G-XXXXXX) or Universal Analytics id (UA-XXXX-Y). Pass an empty string to clear. | |
| sharedWithAll | No | Whether every member of the team can see and open this form | |
| submissionAccess | No | public = anyone answers and sees the report; login_to_view_report = anyone answers but must sign in to see the report (the default, this is how leads get captured); examinee_only = a login is required before answering at all | |
| reportGateRequireCode | No | Only 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
| Name | Required | Description |
|---|---|---|
| slug | No | Custom path after this change; null when cleared (back to the random address) |
| formId | No | The form that was changed |
| changed | No | Which settings this call changed |
| delivery | No | Delivery 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavioral details: only passed keys are changed, slug changes break the previous custom path immediately while the token address keeps working, timeLimit only applies to knowledge quizzes, and reportGateRequireCode trades completion rate against lead quality. This aligns with and expands on destructiveHint: true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: purpose is front-loaded, the sibling distinction is immediate, and the parameter list is compactly grouped with contextual rationale. Every sentence or clause earns its place, especially given the tool's 10-parameter complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a detailed schema, output schema, and annotations already present, the description still adds the necessary usage context: what this tool changes versus sibling tools, how parameters interrelate, and where to read current state. An agent has enough information 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds cross-parameter business semantics that the schema alone does not convey: submissionAccess is the lead-capture gate, reportGateRequireCode trades completion against lead verification, sharing drives organic spread, and booking feeds the 1:1 call queue. This helps an agent reason about which parameters to set in context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Change how a form of the current team is delivered,' and immediately distinguishes itself from update_form, which handles title/questions/report/theme. It also enumerates exactly which settings are editable, leaving no ambiguity about the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly points to update_form for content changes and to get_form_share_info for reading current values. This gives an agent clear routing guidance: use this tool for delivery/presentation settings, not for form content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_form_translationUpdate form translationADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Translated form title | |
| fields | No | Translated 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. | |
| formId | Yes | The source form UUID | |
| report | No | Translated 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. | |
| booking | No | Translated 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. | |
| isActive | No | Enable/pause this language version (independent of the form's overall isActive). | |
| language | Yes | Which language version to update | |
| systemText | No | Translated 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. | |
| description | No | Translated form description |
Output Schema
| Name | Required | Description |
|---|---|---|
| formId | No | The source form |
| updated | No | Which parts of the translation this call changed |
| language | No | Language that was saved |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: partial translation is allowed, omitted fields keep their current values, fields[] must not introduce unknown codes, and isActive=false pauses only this language version independently of the form's isActive. These details clarify the mutation and merge behavior that readOnlyHint/destructiveHint alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a tight set of four sentences with no filler. Each sentence earns its place: the main action, the mirroring/merge behavior, the code validation constraint, and the isActive override. The most important operational guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 9 parameters and deeply nested objects, the description plus schema is highly complete. It gives the critical workflow hint (start from get_form_translation), covers partial updates, validation constraints, and the isActive edge case, while the output schema covers return value expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds valuable cross-parameter meaning: it tells the agent to mirror get_form_translation's shape, clarifies that omitted fields retain current values, and explains that codes must exist on the source form. This goes beyond the per-property schema documentation and meaningfully helps an agent construct a valid payload.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair, 'Save translated copy for one language version of a form,' which clearly states what the tool does and its scope. It distinguishes itself from related translation tools like create_form_translation by emphasizing update semantics such as preserving omitted fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context that this updates an existing language version and references get_form_translation as the source of the shape to mirror. However, it never explicitly says when to use this over create_form_translation or other translation-related siblings, so the when-not-to-use guidance is only 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.
update_leadUpdate leadAInspect
Move one lead of the current team to another follow-up status (e.g. new → contacted). The change is recorded on the lead's timeline. Status codes and tag codes are team-defined — call list_lead_settings first to get the valid ones, never guess.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | The lead id (the leadId returned by list_leads) | |
| status | Yes | The target status code, must be one of list_lead_settings.statuses[].code |
Output Schema
| Name | Required | Description |
|---|---|---|
| leadId | No | The lead that was moved |
| status | No | Status code after the move |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a non-obvious side effect: the change is recorded on the lead's timeline. The annotations only indicate non-read-only behavior, so the description adds useful behavioral context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and example. The mention of 'tag codes' is slightly tangential for a status-only tool, which prevents a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with an output schema, this is complete: it states scope, the required lookup call, and the timeline side effect. No essential invocation information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of parameters, including leadId provenance and that status must be a code from list_lead_settings.statuses[].code. The description reinforces the 'never guess' rule but adds little meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb ('move') plus a clear resource ('one lead of the current team') and outcome ('another follow-up status'), with a concrete example (new → contacted). This distinguishes it from other update tools by scope and entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite: call list_lead_settings first to get valid status codes and never guess. It implies the intended use case clearly, but does not explicitly exclude or route to sibling alternatives like set_lead_tags or assign_leads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_questionUpdate questionADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | NumberField only: new maximum allowed value; pass null to remove the upper bound. Ignored for other question types. | |
| min | No | NumberField only: new minimum allowed value; pass null to remove the lower bound. Ignored for other question types. | |
| code | Yes | Question code (field.code), from the get_form / create_form return value | |
| name | No | New question stem, optional | |
| unit | No | NumberField only: new display unit suffix (e.g. "kg"); pass null or an empty string to clear. Ignored for other question types. | |
| items | No | 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. | |
| score | No | Score for this question; 0 or omitted + no correctAnswer means not scored | |
| words | No | Rate only: new scale labels shown under the rating control (up to 5); pass null or [] to remove the labels. Ignored for other question types. | |
| formId | Yes | The form ID the question belongs to | |
| aiMatch | No | FillBlank 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. | |
| choices | No | Replace 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). | |
| content | No | 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. | |
| explain | No | New answer explanation (the question's "answer explanation" field, not the question note); pass an empty string to clear. Same rich-text rules as description. | |
| required | No | Whether the question is required | |
| precision | No | DateField / TimeField only: new picker precision. DateField accepts year | month | day | hour | minute | second; TimeField accepts only minute | second. Ignored for other question types. | |
| trueLabel | No | TrueFalse 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. | |
| falseLabel | No | TrueFalse 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. | |
| description | No | New question note; pass an empty string to clear. This field also accepts an inline image: put an <img src="..."> in it, where src is a direct image URL that renders in <img src> (a page URL that merely contains an image does not work). Use finalize_image_upload to host an image yourself, or a direct URL the user supplied. Never invent an image URL — omit the image instead of risking a broken one. | |
| correctAnswer | No | New 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. | |
| decimalPlaces | No | NumberField 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
| Name | Required | Description |
|---|---|---|
| code | No | The question that was updated |
| field | No | The question after the merge |
| formId | No | The form that was edited |
| changed | No | Which question attributes this call changed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a read/write destructive operation (readOnlyHint=false, destructiveHint=true), and the description adds substantial behavioral depth beyond that: choices replacement destroys existing identities unless codes are reused, Swiper slides get fresh IDs requiring translation rewrites, and scene-specific rejections are spelled out. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The prose is dense and long, but every sentence carries operational information — no filler or repetition of the title. It is front-loaded with the core purpose, then the changeable list, then restrictions, and then display-block specifics. A bulleted structure would improve scannability, but for the complexity covered the text is efficiently organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter mutation tool with scene-dependent behavior, display-block variants, and destructive replacement semantics, the description covers all the essential ground: what can change, what cannot, how to achieve the unchangeable, scene rejections, replacement side effects, and inline image handling. An output schema is present, so return values don't need to be described. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already documents every parameter richly. The description still adds value by summarizing cross-cutting constraints (scene-level rejections of score/correctAnswer/aiMatch, display-block key separation, and the not-changeable list) that aren't obvious from any single parameter. It doesn't invent new per-parameter meaning, but it does orient the agent before it reads the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Update a single question of an existing form, located by code.' It clearly enumerates changeable fields and explicitly contrasts with the delete_question + add_question workflow for unchangeable attributes, distinguishing this tool from its siblings add_question, delete_question, and insert_question.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use and when-not-to-use guidance: it names the alternative workflow ('NOT changeable — delete_question then add_question instead'), spells out which scenes reject which fields, and states that choices 'replaces ALL choices' so the agent knows the destructive implication of passing that parameter. No relevant usage context is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tenant_slugUpdate team addressADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The new team address |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | No | The new team address — the first path segment of every platform-domain quiz link |
| tenantId | No | The team that was renamed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotation set by warning that every public quiz link moves, old addresses stop resolving, cached entries may persist, and token addresses remain unaffected. This gives the agent a realistic picture of the destructive side effects without needing to infer them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence immediately states the operation and object, followed by constraints and consequences. Every sentence adds needed information, and the most critical warning (all public quiz links change) comes early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With the destructiveHint annotation, permission note, impact explanation, caching caveat, unaffected token paths, and pointer to get_active_tenant, this description covers all context an agent needs to safely invoke the tool. The output schema is present, so return-value documentation is not a gap here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only says 'The new team address,' while the description supplies the accepted character set, length range, start/end rules, global uniqueness, and the fact that it cannot be cleared. It also clarifies that the slug is the first URL path segment, which is essential for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact operation ('Change the team address of the current team') and the domain object, then clarifies the scope via the URL pattern. It also distinguishes itself from the read-only get_active_tenant, so an agent can tell it apart from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states who may call the tool ('Owner / admin only'), when it should be used ('rare, deliberate rename'), and points to get_active_tenant to read the current value first. The warning 'not routine tuning' also implicitly steers agents toward alternatives for normal edits.
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.
4 tool updates
- Changed
get_examinee2 fields changed- changed
Output schema / properties / avatarPreset / descriptionPrevious value: -"Preset avatar key, when no image was uploaded"New value: +"Preset avatar reference { theme, seed }, when no image was uploaded" - changed
Output schema / properties / avatarPreset / typePrevious value: -[ - "string", - "null" -]New value: +[ + "object", + "null" +]
- Changed
invite_member2 fields changed- added
Output schema / properties / invitationQueuedAdded value: +{ + "description": "Always true — the invitation email has been queued for delivery, not yet confirmed sent", + "type": "boolean" +} - removed
Output schema / properties / invitationSentRemoved value: -{ - "description": "Whether the invitation email was sent successfully", - "type": "boolean" -}
- Changed
list_bookings4 fields changed- changed
Output schema / properties / items / items / properties / form / descriptionPrevious value: -"The quiz the booking came from"New value: +"The quiz the booking came from as { id, title }" - changed
Output schema / properties / items / items / properties / form / typePrevious value: -[ - "string", - "number", - "null" -]New value: +[ + "object", + "null" +] - changed
Output schema / properties / items / items / properties / record / descriptionPrevious value: -"The submission the booking is tied to"New value: +"The submission the booking is tied to as { id, serialNumber, shareToken }" - changed
Output schema / properties / items / items / properties / record / typePrevious value: -[ - "string", - "number", - "null" -]New value: +[ + "object", + "null" +]
- Changed
update_examinee2 fields changed- changed
Output schema / properties / avatarPreset / descriptionPrevious value: -"Preset avatar key, when no image was uploaded"New value: +"Preset avatar reference { theme, seed }, when no image was uploaded" - changed
Output schema / properties / avatarPreset / typePrevious value: -[ - "string", - "null" -]New value: +[ + "object", + "null" +]
1 tool update
- Changed
invite_member3 fields changed- added
Output schema / properties / invitationSentAdded value: +{ + "description": "Whether the invitation email was sent successfully", + "type": "boolean" +} - removed
Output schema / properties / inviteTokenRemoved value: -{ - "description": "Token embedded in the invite link", - "type": "string" -} - removed
Output schema / properties / inviteUrlRemoved value: -{ - "description": "The invite link that was emailed — you may relay it to the user", - "type": "string" -}
1 tool update
- Changed
update_form_settings2 fields changed- changed
Input schema / properties / timeLimit / properties / minutes / descriptionPrevious value: -"Minutes allowed; required (>= 1) when enabling"New value: +"Minutes allowed; required when enabling, between 1 and 600" - added
Input schema / properties / timeLimit / properties / minutes / maximumAdded value: +600
6 tool updates
- Changed
add_question5 fields changed- added
Input schema / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / choices / items / properties / children / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / choices / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / falseDimensionScoresAdded 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" +} - added
Input schema / properties / trueDimensionScoresAdded 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" +}
- Changed
create_form13 fields changed- added
Input schema / properties / questions / items / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / questions / items / properties / choices / items / properties / children / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / questions / items / properties / choices / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / questions / items / properties / falseDimensionScoresAdded 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" +} - added
Input schema / properties / questions / items / properties / trueDimensionScoresAdded 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" +} - changed
Input schema / properties / report / properties / dimensionAnalysis / descriptionPrevious 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." - added
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / codeAdded 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" +} - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / fieldCodes / descriptionPrevious 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." - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / formula / descriptionPrevious 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." - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / standardScore / descriptionPrevious 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." - changed
Input schema / properties / report / properties / formula / descriptionPrevious 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." - changed
Input schema / properties / report / properties / levels / items / properties / cta / properties / newWindow / descriptionPrevious value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window." - changed
Input schema / properties / report / properties / outcomes / items / properties / cta / properties / newWindow / descriptionPrevious value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window."
- Changed
insert_question5 fields changed- added
Input schema / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / choices / items / properties / children / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / choices / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / falseDimensionScoresAdded 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" +} - added
Input schema / properties / trueDimensionScoresAdded 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" +}
- Changed
set_dimension_analysis4 fields changed- added
Input schema / properties / dimensions / items / properties / codeAdded 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" +} - changed
Input schema / properties / dimensions / items / properties / fieldCodes / descriptionPrevious 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." - changed
Input schema / properties / dimensions / items / properties / formula / descriptionPrevious 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." - changed
Input schema / properties / dimensions / items / properties / standardScore / descriptionPrevious 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."
- Changed
update_form9 fields changed- changed
Input schema / properties / report / descriptionPrevious 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)." - changed
Input schema / properties / report / properties / dimensionAnalysis / descriptionPrevious 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." - added
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / codeAdded 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" +} - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / fieldCodes / descriptionPrevious 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." - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / formula / descriptionPrevious 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." - changed
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / standardScore / descriptionPrevious 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." - changed
Input schema / properties / report / properties / formula / descriptionPrevious 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." - changed
Input schema / properties / report / properties / levels / items / properties / cta / properties / newWindow / descriptionPrevious value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window." - changed
Input schema / properties / report / properties / outcomes / items / properties / cta / properties / newWindow / descriptionPrevious value: -"Open the link in a new window, default false"New value: +"Deprecated and ignored: the CTA link always opens in a new window."
- Changed
update_question3 fields changed- added
Input schema / properties / choices / items / properties / children / items / properties / children / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / choices / items / properties / children / items / properties / dimensionScoresAdded 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" +} - added
Input schema / properties / choices / items / properties / dimensionScoresAdded 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 tool updates
- Changed
create_form1 field changed- changed
Input schema / properties / report / properties / hideOverallScore / descriptionPrevious 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."
- Changed
update_form1 field changed- changed
Input schema / properties / report / properties / hideOverallScore / descriptionPrevious 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."
1 tool update
- Changed
update_form_settings1 field changed- changed
Input schema / properties / timeLimit / descriptionPrevious 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."
1 tool update
- Changed
update_form_translation3 fields changed- added
Input schema / properties / fields / items / properties / explainAdded value: +{ + "description": "Knowledge quiz: translated answer explanation shown in the answer review.", + "type": "string" +} - added
Input schema / properties / report / properties / dimensionAnalysis / properties / dimensions / items / properties / levels / items / properties / ctaAdded 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" +} - added
Input schema / properties / report / properties / overallAnalysis / properties / levels / items / properties / ctaAdded 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" +}
1 tool update
- Changed
invite_member1 field changed- changed
Input schema / properties / role / descriptionPrevious 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\"."
5 tool updates
- Changed
add_question5 fields changed- changed
Input schema / descriptionPrevious 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." - added
Input schema / properties / contentAdded 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" +} - added
Input schema / properties / itemsAdded 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" +} - changed
Input schema / properties / type / descriptionPrevious 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" - changed
Input schema / properties / type / enumPrevious 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" +]
- Changed
create_form6 fields changed- changed
Input schema / properties / questions / descriptionPrevious 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." - changed
Input schema / properties / questions / items / descriptionPrevious 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." - added
Input schema / properties / questions / items / properties / contentAdded 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" +} - added
Input schema / properties / questions / items / properties / itemsAdded 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" +} - changed
Input schema / properties / questions / items / properties / type / descriptionPrevious 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" - changed
Input schema / properties / questions / items / properties / type / enumPrevious 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" +]
- Changed
insert_question5 fields changed- changed
Input schema / descriptionPrevious 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." - added
Input schema / properties / contentAdded 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" +} - added
Input schema / properties / itemsAdded 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" +} - changed
Input schema / properties / type / descriptionPrevious 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" - changed
Input schema / properties / type / enumPrevious 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" +]
- Changed
move_question1 field changed- changed
Input schema / properties / code / descriptionPrevious 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)"
- Changed
update_question2 fields changed- added
Input schema / properties / contentAdded 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" +} - added
Input schema / properties / itemsAdded 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" +}
48 tool updates
- First observed
add_lead_comment - First observed
add_question - First observed
assign_leads - First observed
create_form - First observed
create_form_from_template - First observed
create_form_translation - First observed
delete_form - First observed
delete_form_translation - First observed
delete_question - First observed
duplicate_form - First observed
finalize_image_upload - First observed
get_active_tenant - First observed
get_booking_availability - First observed
get_examinee - First observed
get_form - First observed
get_form_funnel - First observed
get_form_share_info - First observed
get_form_stats - First observed
get_form_translation - First observed
get_lead - First observed
get_record - First observed
insert_question - First observed
invite_member - First observed
list_bookings - First observed
list_examinees - First observed
list_form_translations - First observed
list_forms - First observed
list_lead_settings - First observed
list_leads - First observed
list_my_tenants - First observed
list_records - First observed
list_templates - First observed
move_question - First observed
prepare_image_upload - First observed
reschedule_booking - First observed
restore_form - First observed
review_booking - First observed
set_dimension_analysis - First observed
set_lead_tags - First observed
switch_active_tenant - First observed
update_booking_status - First observed
update_examinee - First observed
update_form - First observed
update_form_settings - First observed
update_form_translation - First observed
update_lead - First observed
update_question - First observed
update_tenant_slug
Related MCP Connectors
Create forms, surveys, quizzes & polls — publish shareable links and analyze responses.
Build, publish and analyze quizzes, polls, forms and personality tests. Riddle account required.
Create and manage trackable QR codes with scan tracking, analytics, and dynamic URL updates.
Build, publish and read scored forms and quizzes where the score picks the next screen.
Related MCP Servers
- AlicenseAqualityBmaintenanceCreate 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.521MIT
- FlicenseNot gradedqualityBmaintenanceEnables users to run and interact with a quiz application through Claude Desktop or claude.ai, supporting user registration, question retrieval, answer validation, leaderboard generation, and answer review.1-
- FlicenseNot gradedqualityCmaintenanceEnables creating and administering multiple quizzes, adding questions, registering participants, validating answers, reviewing responses, and managing leaderboards through MCP, accessible locally via stdio or remotely over HTTP.-
- AlicenseAqualityBmaintenanceEnables AI clients to create, manage, and configure Roo smart shortlinks and their add-ons, such as QR codes, scheduled redirects, and webhooks, through MCP tools.14344MIT