← WebMCP Directory

Tool tree

mockniner-webmcp.dgkhan08.workers.dev

Health & EducationTools verified
Website
Prepare for your next exam with the AI agent you already use. Create and take practice tests in your browser, with local scoring and agent feedback. No extra exam-prep subscription.
Explore capabilities
    prepare_practice_audioAction

    Call immediately when the user requests new IELTS Listening or a Speaking interview, before authoring. Starts the one-time voice download in the page with visible progress; returns immediately so you can create the practice while it downloads. Safe to repeat; reuses verified files and retries failures. Read audioPreparation in get_practice_context for progress. Downloaded voices do not mean exam audio is generated. Install practice normally; Listening opens automatically and generates audio there. No web research is needed for supported exams.

    View tool JSON
    {
      "name": "prepare_practice_audio",
      "kind": "act",
      "impl": "imperative",
      "description": "Call immediately when the user requests new IELTS Listening or a Speaking interview, before authoring. Starts the one-time voice download in the page with visible progress; returns immediately so you can create the practice while it downloads. Safe to repeat; reuses verified files and retries failures. Read audioPreparation in get_practice_context for progress. Downloaded voices do not mean exam audio is generated. Install practice normally; Listening opens automatically and generates audio there. No web research is needed for supported exams.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    get_practice_contextAnswer

    Start here to read visible attempt IDs, reviewLocation, progress and capabilities: available tools, conditional input requirements, blocked tools with reasons/recovery, and per-kit authoringExampleAccess. Availability is a live snapshot, rechecked on execution; valid IDs and payloads are still required. evaluationActivity reports an agent-started review notice. audioPreparation reports the early voice download; Listening/Speaking progress includes preparation stages, errors and recovery. Progress is null outside an exam. No draft answers, scripts or keys. Audio readiness is preparation, not playback.

    View tool JSON
    {
      "name": "get_practice_context",
      "kind": "answer",
      "impl": "imperative",
      "description": "Start here to read visible attempt IDs, reviewLocation, progress and capabilities: available tools, conditional input requirements, blocked tools with reasons/recovery, and per-kit authoringExampleAccess. Availability is a live snapshot, rechecked on execution; valid IDs and payloads are still required. evaluationActivity reports an agent-started review notice. audioPreparation reports the early voice download; Listening/Speaking progress includes preparation stages, errors and recovery. Progress is null outside an exam. No draft answers, scripts or keys. Audio readiness is preparation, not playback.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    retry_ielts_listening_audioAction

    Restart failed audio preparation for the active Listening contentKey, reusing saved chunks. Read listeningAudio in get_practice_context first. Returns immediately with current status; generation continues locally. Keeps the current attempt and answers. In an open exam, playback can resume as saved or new chunks become available. Retry is available only after a generation error.

    View tool JSON
    {
      "name": "retry_ielts_listening_audio",
      "kind": "act",
      "impl": "imperative",
      "description": "Restart failed audio preparation for the active Listening contentKey, reusing saved chunks. Read listeningAudio in get_practice_context first. Returns immediately with current status; generation continues locally. Keeps the current attempt and answers. In an open exam, playback can resume as saved or new chunks become available. Retry is available only after a generation error.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "contentKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "contentKey"
        ],
        "additionalProperties": false
      }
    }
    get_practice_activityAnswer

    Read recent saved practice installations, revisions, submissions and feedback with exact IDs, newest first. Use when a reference to recent work is unclear from get_practice_context. Current visible context takes precedence; ask if the target is ambiguous. Events are past changes, not current availability or permission to act. No browsing, draft answers or feedback text. Local to this browser, latest 100 events only, no backfill. Defaults to 5. Use nextOffset to continue.

    View tool JSON
    {
      "name": "get_practice_activity",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read recent saved practice installations, revisions, submissions and feedback with exact IDs, newest first. Use when a reference to recent work is unclear from get_practice_context. Current visible context takes precedence; ask if the target is ambiguous. Events are past changes, not current availability or permission to act. No browsing, draft answers or feedback text. Local to this browser, latest 100 events only, no backfill. Defaults to 5. Use nextOffset to continue.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "listening",
              "reading",
              "writing",
              "speaking",
              "assessment"
            ]
          },
          "limit": {
            "default": 5,
            "type": "integer",
            "minimum": 1,
            "maximum": 25
          },
          "offset": {
            "default": 0,
            "type": "integer",
            "minimum": 0,
            "maximum": 100
          }
        },
        "additionalProperties": false
      }
    }
    get_ielts_objective_reviewAnswer

    Read one submitted Reading/Listening part: original content with keys, saved responses, correctness and saved agent explanations with revisions. Requires section; part defaults to 1. Omit IDs for the visible submission or use attemptId/latest:true. Never reads drafts or navigates. Multiple-selection keys are unordered; correctness uses saved grading. Use open_practice result with location.questionId to show a question.

    View tool JSON
    {
      "name": "get_ielts_objective_review",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read one submitted Reading/Listening part: original content with keys, saved responses, correctness and saved agent explanations with revisions. Requires section; part defaults to 1. Omit IDs for the visible submission or use attemptId/latest:true. Never reads drafts or navigates. Multiple-selection keys are unordered; correctness uses saved grading. Use open_practice result with location.questionId to show a question.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "attemptId": {
            "type": "string",
            "format": "uuid",
            "description": "Read this exact submitted attempt. Omit both fields to read the visible submission."
          },
          "latest": {
            "type": "boolean",
            "const": true,
            "description": "Explicitly read the newest saved submission of this type. Use instead of attemptId."
          },
          "section": {
            "type": "string",
            "enum": [
              "listening",
              "reading"
            ]
          },
          "part": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4,
            "default": 1,
            "description": "Return this part only; inspect availableParts for the rest."
          }
        },
        "required": [
          "section"
        ],
        "additionalProperties": false
      }
    }
    save_ielts_objective_explanationAction

    Save and show an agent explanation for one submitted Reading/Listening question. Open its review first; read get_ielts_objective_review for original content, response and grading. Does not alter the response, key or score. Identical retries are safe. To revise existing feedback, send expectedRevision from that question’s explanation.revision. Explanations persist with the attempt.

    View tool JSON
    {
      "name": "save_ielts_objective_explanation",
      "kind": "act",
      "impl": "imperative",
      "description": "Save and show an agent explanation for one submitted Reading/Listening question. Open its review first; read get_ielts_objective_review for original content, response and grading. Does not alter the response, key or score. Identical retries are safe. To revise existing feedback, send expectedRevision from that question’s explanation.revision. Explanations persist with the attempt.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "attemptId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "section": {
            "type": "string",
            "enum": [
              "reading",
              "listening"
            ]
          },
          "questionId": {
            "type": "integer",
            "minimum": 1,
            "maximum": 40
          },
          "explanation": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000,
            "description": "Base feedback on the original content and saved grading. Plain text; this does not change the answer key or score."
          },
          "expectedRevision": {
            "description": "Omit for first feedback or an identical retry. To correct an explanation, supply its current explanation.revision from get_ielts_objective_review.",
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "attemptId",
          "section",
          "questionId",
          "explanation"
        ],
        "additionalProperties": false
      }
    }
    get_assessment_contentAnswer

    Retrieve an installed universal package by packageId for revision or copying. view summary lists part/item IDs; full (default) includes keys and needs the library, with no unfinished attempt for that package. Optional partId/itemId limits content; revision checks its version. Only a complete package can go to install_assessment; increment revision when replacing. Built-ins need a fresh packageId. For saved responses use get_assessment_submission.

    View tool JSON
    {
      "name": "get_assessment_content",
      "kind": "answer",
      "impl": "imperative",
      "description": "Retrieve an installed universal package by packageId for revision or copying. view summary lists part/item IDs; full (default) includes keys and needs the library, with no unfinished attempt for that package. Optional partId/itemId limits content; revision checks its version. Only a complete package can go to install_assessment; increment revision when replacing. Built-ins need a fresh packageId. For saved responses use get_assessment_submission.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "packageId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "revision": {
            "description": "Optional version check when reading multiple parts. A changed installed revision returns an error.",
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 10000
          },
          "view": {
            "default": "full",
            "description": "summary returns part/item IDs and totals without question text or responses. full returns content, optionally limited by partId or itemId.",
            "type": "string",
            "enum": [
              "full",
              "summary"
            ]
          },
          "partId": {
            "description": "Read only this part. If itemId is also supplied, it must belong to this part.",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "itemId": {
            "description": "Read only this item and its required part context, resources and rubric.",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "packageId"
        ],
        "additionalProperties": false
      }
    }
    get_practice_libraryAnswer

    For general requests such as "let me practise Writing" or "let us do SAT", check this library first and resume suitable unfinished work or open a saved test. Author new content when the user asks for new questions. List practice IDs with duration, item/part counts, declared subject/difficulty, startability and blocking reasons, plus resumable IDs and Listening readiness. Unknown metadata is null; estimates are labeled. Availability is a snapshot, rechecked when starting. Use kind to filter and nextOffset to continue. No questions or keys.

    View tool JSON
    {
      "name": "get_practice_library",
      "kind": "answer",
      "impl": "imperative",
      "description": "For general requests such as \"let me practise Writing\" or \"let us do SAT\", check this library first and resume suitable unfinished work or open a saved test. Author new content when the user asks for new questions. List practice IDs with duration, item/part counts, declared subject/difficulty, startability and blocking reasons, plus resumable IDs and Listening readiness. Unknown metadata is null; estimates are labeled. Availability is a snapshot, rechecked when starting. Use kind to filter and nextOffset to continue. No questions or keys.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "listening",
              "reading",
              "writing",
              "speaking",
              "assessment"
            ]
          },
          "limit": {
            "default": 10,
            "type": "integer",
            "minimum": 1,
            "maximum": 25
          },
          "offset": {
            "default": 0,
            "type": "integer",
            "minimum": 0,
            "maximum": 100000
          }
        },
        "additionalProperties": false
      }
    }
    get_practice_historyAnswer

    List saved IELTS and universal attempts with exact IDs, scores, evaluation status and universal domain results, newest first. Use kind to filter and nextOffset to continue, even when items is empty. Unreadable rows are listed in unavailable and retained for recovery. No essays, transcripts, recordings or answer keys. Open a result or retrieve a submission for feedback.

    View tool JSON
    {
      "name": "get_practice_history",
      "kind": "answer",
      "impl": "imperative",
      "description": "List saved IELTS and universal attempts with exact IDs, scores, evaluation status and universal domain results, newest first. Use kind to filter and nextOffset to continue, even when items is empty. Unreadable rows are listed in unavailable and retained for recovery. No essays, transcripts, recordings or answer keys. Open a result or retrieve a submission for feedback.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "listening",
              "reading",
              "writing",
              "speaking",
              "assessment"
            ]
          },
          "limit": {
            "default": 10,
            "type": "integer",
            "minimum": 1,
            "maximum": 25
          },
          "offset": {
            "default": 0,
            "type": "integer",
            "minimum": 0,
            "maximum": 100000
          }
        },
        "additionalProperties": false
      }
    }
    open_practiceAction

    Open library, result, start or resume. result requires kind and attemptId; optional location selects questionId for Reading/Listening, taskNumber/correctionId for Writing, or itemId for assessments. Read IDs from submission/review tools. resume requires kind ielts/assessment and attemptId. start requires kind and packageId for assessments, optional native contentKey. full_ielts starts Listening. Listening opens even while audio prepares, with progress and retry in the exam; its timer pauses while audio is unavailable. Playback begins automatically when ready if permitted by the browser. Starting IELTS creates a separate attempt and preserves existing drafts, even in the same section. Resume selects an exact saved attempt and its original questions. Never answers or submits.

    View tool JSON
    {
      "name": "open_practice",
      "kind": "act",
      "impl": "imperative",
      "description": "Open library, result, start or resume. result requires kind and attemptId; optional location selects questionId for Reading/Listening, taskNumber/correctionId for Writing, or itemId for assessments. Read IDs from submission/review tools. resume requires kind ielts/assessment and attemptId. start requires kind and packageId for assessments, optional native contentKey. full_ielts starts Listening. Listening opens even while audio prepares, with progress and retry in the exam; its timer pauses while audio is unavailable. Playback begins automatically when ready if permitted by the browser. Starting IELTS creates a separate attempt and preserves existing drafts, even in the same section. Resume selects an exact saved attempt and its original questions. Never answers or submits.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "action": {
            "type": "string",
            "enum": [
              "library",
              "result",
              "start",
              "resume"
            ]
          },
          "kind": {
            "type": "string",
            "enum": [
              "ielts",
              "listening",
              "reading",
              "writing",
              "speaking",
              "assessment",
              "full_ielts"
            ]
          },
          "attemptId": {
            "type": "string",
            "format": "uuid"
          },
          "contentKey": {
            "type": "string"
          },
          "packageId": {
            "type": "string"
          },
          "location": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "questionId": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 40
                  }
                },
                "required": [
                  "questionId"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "taskNumber": {
                    "anyOf": [
                      {
                        "type": "number",
                        "const": 1
                      },
                      {
                        "type": "number",
                        "const": 2
                      }
                    ]
                  },
                  "correctionId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  }
                },
                "required": [
                  "taskNumber"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "correctionId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  }
                },
                "required": [
                  "correctionId"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "itemId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  }
                },
                "required": [
                  "itemId"
                ],
                "additionalProperties": false
              }
            ]
          }
        },
        "required": [
          "action"
        ],
        "additionalProperties": false
      }
    }
    get_ielts_authoring_kitAnswer

    For new IELTS questions, create Listening, Academic Reading or Academic Writing from a complete original example and exam-owner format facts. For a general practice request, check get_practice_library first for saved tests and unfinished work. For Listening, call prepare_practice_audio before authoring so voices download while you work. Listening has all 40 questions and a full four-part spoken script; Reading has 40 questions and three substantial passages; Writing has both tasks. Use this kit directly for routine practice, without web research or Kokoro API research. Includes workflow instructions; install_ielts_practice_set opens practice by default. Full JSON Schema is opt-in with includeSchema:true. Examples are available alongside unrelated unfinished tests; only examples containing their questions are withheld.

    View tool JSON
    {
      "name": "get_ielts_authoring_kit",
      "kind": "answer",
      "impl": "imperative",
      "description": "For new IELTS questions, create Listening, Academic Reading or Academic Writing from a complete original example and exam-owner format facts. For a general practice request, check get_practice_library first for saved tests and unfinished work. For Listening, call prepare_practice_audio before authoring so voices download while you work. Listening has all 40 questions and a full four-part spoken script; Reading has 40 questions and three substantial passages; Writing has both tasks. Use this kit directly for routine practice, without web research or Kokoro API research. Includes workflow instructions; install_ielts_practice_set opens practice by default. Full JSON Schema is opt-in with includeSchema:true. Examples are available alongside unrelated unfinished tests; only examples containing their questions are withheld.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeSchema": {
            "type": "boolean",
            "default": false,
            "description": "Include the full JSON Schema when using a format beyond the complete example. Usually unnecessary."
          },
          "section": {
            "type": "string",
            "enum": [
              "listening",
              "reading",
              "writing"
            ],
            "description": "The native IELTS section to author."
          }
        },
        "required": [
          "section"
        ],
        "additionalProperties": false
      }
    }
    install_ielts_practice_setAction

    Create and open a new native IELTS test from get_ielts_authoring_kit in one call. Existing unfinished IELTS attempts, answers and audio remain saved; no discard is required. Use a fresh contentKey for new questions. Defaults to opening immediately, including Listening while audio prepares in the exam. Its timer pauses while audio is unavailable. Playback begins automatically when ready, subject to browser permission. Set openAfterInstall:false only for a save-for-later request. Check opened and any openingError; never claim saved practice is open unless opened is true. The learner answers and submits.

    View tool JSON
    {
      "name": "install_ielts_practice_set",
      "kind": "act",
      "impl": "imperative",
      "description": "Create and open a new native IELTS test from get_ielts_authoring_kit in one call. Existing unfinished IELTS attempts, answers and audio remain saved; no discard is required. Use a fresh contentKey for new questions. Defaults to opening immediately, including Listening while audio prepares in the exam. Its timer pauses while audio is unavailable. Playback begins automatically when ready, subject to browser permission. Set openAfterInstall:false only for a save-for-later request. Check opened and any openingError; never claim saved practice is open unless opened is true. The learner answers and submits.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "openAfterInstall": {
            "type": "boolean",
            "default": true,
            "description": "Open the saved practice now. Set false only when the user asks to save it for later."
          },
          "schemaVersion": {
            "type": "number",
            "const": 1
          },
          "contentKey": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9._-]*$",
            "description": "Stable ID for this authored IELTS set."
          },
          "section": {
            "type": "string",
            "enum": [
              "listening",
              "reading",
              "writing"
            ]
          },
          "name": {
            "type": "string",
            "description": "Learner-visible practice name."
          },
          "audio": {
            "type": "object",
            "description": "Required for Listening. Follow the selected authoring kit."
          },
          "parts": {
            "type": "array",
            "description": "Required for Listening and Reading. Follow the selected authoring kit."
          },
          "tasks": {
            "type": "array",
            "description": "Required for Writing. Follow the selected authoring kit."
          }
        },
        "required": [
          "schemaVersion",
          "contentKey",
          "section",
          "name"
        ],
        "additionalProperties": true
      }
    }
    get_ielts_learning_summaryAnswer

    Read a compact local summary of recent IELTS performance for adapting future practice. Returns scores and criterion averages without essays, recordings, answer keys, or draft answers.

    View tool JSON
    {
      "name": "get_ielts_learning_summary",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read a compact local summary of recent IELTS performance for adapting future practice. Returns scores and criterion averages without essays, recordings, answer keys, or draft answers.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recentLimit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 5,
            "description": "Maximum recent attempts per scored section. Defaults to 5."
          }
        },
        "additionalProperties": false
      }
    }
    get_assessment_authoring_kitAnswer

    Return universal engine capabilities and a complete original example: sat-style has 98 questions in four modules; gre-style has an Issue essay and 54 questions in five sections. Exam-owner format facts, timings and question rules are included. Use the matching kit directly for routine SAT/GRE authoring without web research. Use minimal-objective or writing-with-rubric for custom practice; research uncovered formats when needed. install_assessment saves and opens by default. Full schema is opt-in with includeSchema:true. Examples are available alongside unrelated unfinished tests; only examples containing their questions are withheld.

    View tool JSON
    {
      "name": "get_assessment_authoring_kit",
      "kind": "answer",
      "impl": "imperative",
      "description": "Return universal engine capabilities and a complete original example: sat-style has 98 questions in four modules; gre-style has an Issue essay and 54 questions in five sections. Exam-owner format facts, timings and question rules are included. Use the matching kit directly for routine SAT/GRE authoring without web research. Use minimal-objective or writing-with-rubric for custom practice; research uncovered formats when needed. install_assessment saves and opens by default. Full schema is opt-in with includeSchema:true. Examples are available alongside unrelated unfinished tests; only examples containing their questions are withheld.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeSchema": {
            "type": "boolean",
            "default": false,
            "description": "Include the full package JSON Schema for structures beyond the complete example."
          },
          "template": {
            "type": "string",
            "enum": [
              "minimal-objective",
              "writing-with-rubric",
              "sat-style",
              "gre-style"
            ],
            "description": "Choose minimal-objective for quizzes, writing-with-rubric for extended responses, or the named exam-style template matching the request."
          }
        },
        "required": [
          "template"
        ],
        "additionalProperties": false
      }
    }
    install_assessmentAction

    Save and open a complete SAT, GRE or custom assessment from get_assessment_authoring_kit. Opens immediately and starts its timer by default. Set openAfterInstall:false only when the user asks to save for later. Check opened and openingError before handing over. If saved but not opened, use the returned openAction with open_practice, not another installation. The learner answers and submits.

    View tool JSON
    {
      "name": "install_assessment",
      "kind": "act",
      "impl": "imperative",
      "description": "Save and open a complete SAT, GRE or custom assessment from get_assessment_authoring_kit. Opens immediately and starts its timer by default. Set openAfterInstall:false only when the user asks to save for later. Check opened and openingError before handing over. If saved but not opened, use the returned openAction with open_practice, not another installation. The learner answers and submits.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "number",
            "const": 4
          },
          "packageId": {
            "type": "string"
          },
          "revision": {
            "type": "integer",
            "minimum": 1
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "metadata": {
            "type": "object"
          },
          "presentation": {
            "type": "object"
          },
          "resources": {
            "type": "array"
          },
          "review": {
            "type": "object"
          },
          "rubric": {
            "type": "object"
          },
          "parts": {
            "type": "array",
            "description": "Complete timed parts with items, interactions and scoring. Follow the selected authoring kit example."
          },
          "openAfterInstall": {
            "type": "boolean",
            "default": true,
            "description": "Open the saved practice now. Set false only when the user asks to save it for later."
          }
        },
        "required": [
          "schemaVersion",
          "packageId",
          "revision",
          "title",
          "parts"
        ],
        "additionalProperties": true
      }
    }
    get_ielts_writing_submissionAnswer

    For a grading request use begin_submission_evaluation first to show progress and read everything in one call. Read the visible IELTS Writing submission, original tasks, responses, word counts and attached evaluation. No parameters means the submission on screen. Use latest: true for the newest saved Writing attempt, or attemptId for an exact historical attempt. Reading never changes the visible page.

    View tool JSON
    {
      "name": "get_ielts_writing_submission",
      "kind": "answer",
      "impl": "imperative",
      "description": "For a grading request use begin_submission_evaluation first to show progress and read everything in one call. Read the visible IELTS Writing submission, original tasks, responses, word counts and attached evaluation. No parameters means the submission on screen. Use latest: true for the newest saved Writing attempt, or attemptId for an exact historical attempt. Reading never changes the visible page.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "attemptId": {
            "type": "string",
            "format": "uuid",
            "description": "Read this exact submitted attempt. Omit both fields to read the visible submission."
          },
          "latest": {
            "type": "boolean",
            "const": true,
            "description": "Explicitly read the newest saved submission of this type. Use instead of attemptId."
          }
        },
        "additionalProperties": false
      }
    }
    attach_ielts_writing_evaluationAction

    Save structured feedback on the visible immutable IELTS Writing submission. Use whole or half-band scores from 0 to 9. Identical retries return the saved evaluation without a new revision. For corrections, read get_ielts_writing_submission and supply its evaluationRevision as expectedRevision. Stale revisions are rejected. The review updates immediately.

    View tool JSON
    {
      "name": "attach_ielts_writing_evaluation",
      "kind": "act",
      "impl": "imperative",
      "description": "Save structured feedback on the visible immutable IELTS Writing submission. Use whole or half-band scores from 0 to 9. Identical retries return the saved evaluation without a new revision. For corrections, read get_ielts_writing_submission and supply its evaluationRevision as expectedRevision. Stale revisions are rejected. The review updates immediately.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "attemptId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "expectedRevision": {
            "description": "Omit for first feedback or an identical retry. To change feedback, read the submission and supply its current evaluationRevision.",
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "overallBand": {
            "type": "number",
            "minimum": 0,
            "maximum": 9
          },
          "summary": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000
          },
          "task1": {
            "type": "object",
            "properties": {
              "band": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "taskAchievement": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "coherenceCohesion": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "lexicalResource": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "grammaticalRange": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "feedback": {
                "type": "string",
                "minLength": 1,
                "maxLength": 4000
              },
              "annotations": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "taskNumber": {
                      "anyOf": [
                        {
                          "type": "number",
                          "const": 1
                        },
                        {
                          "type": "number",
                          "const": 2
                        }
                      ]
                    },
                    "originalText": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4000
                    },
                    "suggestion": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4000
                    },
                    "explanation": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4000
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "grammar",
                        "vocabulary",
                        "coherence",
                        "other"
                      ]
                    },
                    "shortTitle": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 200
                    },
                    "startOffset": {
                      "description": "Zero-based UTF-16 start offset. Supply both offsets when the exact quote occurs more than once.",
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "endOffset": {
                      "description": "Exclusive UTF-16 end offset. The response slice must exactly equal originalText.",
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "contextBefore": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "contextAfter": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "issueTitle": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 200
                    },
                    "severity": {
                      "type": "string",
                      "enum": [
                        "critical",
                        "major",
                        "minor"
                      ]
                    },
                    "ruleId": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "incorrectExample": {
                      "type": "string",
                      "maxLength": 2000
                    },
                    "correctExample": {
                      "type": "string",
                      "maxLength": 2000
                    }
                  },
                  "required": [
                    "id",
                    "taskNumber",
                    "originalText",
                    "suggestion",
                    "explanation",
                    "type"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "band",
              "taskAchievement",
              "coherenceCohesion",
              "lexicalResource",
              "grammaticalRange",
              "feedback",
              "annotations"
            ],
            "additionalProperties": false
          },
          "task2": {
            "type": "object",
            "properties": {
              "band": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "taskAchievement": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "coherenceCohesion": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "lexicalResource": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "grammaticalRange": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "feedback": {
                "type": "string",
                "minLength": 1,
                "maxLength": 4000
              },
              "annotations": {
                "maxItems": 100,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "taskNumber": {
                      "anyOf": [
                        {
                          "type": "number",
                          "const": 1
                        },
                        {
                          "type": "number",
                          "const": 2
                        }
                      ]
                    },
                    "originalText": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4000
                    },
                    "suggestion": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4000
                    },
                    "explanation": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 4000
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "grammar",
                        "vocabulary",
                        "coherence",
                        "other"
                      ]
                    },
                    "shortTitle": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 200
                    },
                    "startOffset": {
                      "description": "Zero-based UTF-16 start offset. Supply both offsets when the exact quote occurs more than once.",
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "endOffset": {
                      "description": "Exclusive UTF-16 end offset. The response slice must exactly equal originalText.",
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "contextBefore": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "contextAfter": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "issueTitle": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 200
                    },
                    "severity": {
                      "type": "string",
                      "enum": [
                        "critical",
                        "major",
                        "minor"
                      ]
                    },
                    "ruleId": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 100
                    },
                    "incorrectExample": {
                      "type": "string",
                      "maxLength": 2000
                    },
                    "correctExample": {
                      "type": "string",
                      "maxLength": 2000
                    }
                  },
                  "required": [
                    "id",
                    "taskNumber",
                    "originalText",
                    "suggestion",
                    "explanation",
                    "type"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "band",
              "taskAchievement",
              "coherenceCohesion",
              "lexicalResource",
              "grammaticalRange",
              "feedback",
              "annotations"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "attemptId",
          "overallBand",
          "summary",
          "task1",
          "task2"
        ],
        "additionalProperties": false
      }
    }
    get_ielts_speaking_submissionAnswer

    For evaluation use begin_submission_evaluation first to show progress. Read the visible Speaking submission, all prompts, transcripts, durations and attached evaluation. Audio stays private. No parameters means the submission on screen. Use latest: true for the newest saved Speaking attempt, or attemptId for an exact historical attempt. Reading never changes the visible page.

    View tool JSON
    {
      "name": "get_ielts_speaking_submission",
      "kind": "answer",
      "impl": "imperative",
      "description": "For evaluation use begin_submission_evaluation first to show progress. Read the visible Speaking submission, all prompts, transcripts, durations and attached evaluation. Audio stays private. No parameters means the submission on screen. Use latest: true for the newest saved Speaking attempt, or attemptId for an exact historical attempt. Reading never changes the visible page.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "attemptId": {
            "type": "string",
            "format": "uuid",
            "description": "Read this exact submitted attempt. Omit both fields to read the visible submission."
          },
          "latest": {
            "type": "boolean",
            "const": true,
            "description": "Explicitly read the newest saved submission of this type. Use instead of attemptId."
          }
        },
        "additionalProperties": false
      }
    }
    attach_ielts_speaking_evaluationAction

    Attach feedback to the visible submitted Speaking attempt. Use status scored with whole/half bands 0–9 for overall and three criteria, or status insufficient_evidence with reason, summary, strengths (may be empty) and improvements, and omit all bands. Pronunciation is never scored from transcripts. Feedback is saved once and opens the review.

    View tool JSON
    {
      "name": "attach_ielts_speaking_evaluation",
      "kind": "act",
      "impl": "imperative",
      "description": "Attach feedback to the visible submitted Speaking attempt. Use status scored with whole/half bands 0–9 for overall and three criteria, or status insufficient_evidence with reason, summary, strengths (may be empty) and improvements, and omit all bands. Pronunciation is never scored from transcripts. Feedback is saved once and opens the review.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "attemptId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "summary": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              },
              "strengths": {
                "minItems": 1,
                "maxItems": 6,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                }
              },
              "improvements": {
                "minItems": 1,
                "maxItems": 6,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                }
              },
              "status": {
                "type": "string",
                "const": "scored"
              },
              "overallBand": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "fluencyCoherence": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "lexicalResource": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              },
              "grammaticalRangeAccuracy": {
                "type": "number",
                "minimum": 0,
                "maximum": 9
              }
            },
            "required": [
              "attemptId",
              "summary",
              "strengths",
              "improvements",
              "overallBand",
              "fluencyCoherence",
              "lexicalResource",
              "grammaticalRangeAccuracy"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "attemptId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "summary": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              },
              "strengths": {
                "maxItems": 6,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                }
              },
              "improvements": {
                "minItems": 1,
                "maxItems": 6,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                }
              },
              "status": {
                "type": "string",
                "const": "insufficient_evidence"
              },
              "reason": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2000
              }
            },
            "required": [
              "attemptId",
              "summary",
              "strengths",
              "improvements",
              "status",
              "reason"
            ],
            "additionalProperties": false
          }
        ]
      }
    }
    get_assessment_submissionAnswer

    For rubric evaluation use begin_submission_evaluation first to show progress. Read a submitted assessment: omit IDs for visible, or use attemptId/latest:true. view summary lists permitted part/item IDs and totals without responses. full (default) accepts partId/itemId to return only matching content, responses and annotations; aggregate scores remain assessment-wide. Unfiltered full includes complete evaluation. Review policy applies: responses hides keys/correctness; none allows only rubric items. Never reads drafts or navigates.

    View tool JSON
    {
      "name": "get_assessment_submission",
      "kind": "answer",
      "impl": "imperative",
      "description": "For rubric evaluation use begin_submission_evaluation first to show progress. Read a submitted assessment: omit IDs for visible, or use attemptId/latest:true. view summary lists permitted part/item IDs and totals without responses. full (default) accepts partId/itemId to return only matching content, responses and annotations; aggregate scores remain assessment-wide. Unfiltered full includes complete evaluation. Review policy applies: responses hides keys/correctness; none allows only rubric items. Never reads drafts or navigates.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "attemptId": {
            "type": "string",
            "format": "uuid",
            "description": "Read this exact submitted attempt. Omit both fields to read the visible submission."
          },
          "latest": {
            "type": "boolean",
            "const": true,
            "description": "Explicitly read the newest saved submission of this type. Use instead of attemptId."
          },
          "view": {
            "default": "full",
            "description": "summary returns part/item IDs and totals without question text or responses. full returns content, optionally limited by partId or itemId.",
            "type": "string",
            "enum": [
              "full",
              "summary"
            ]
          },
          "partId": {
            "description": "Read only this part. If itemId is also supplied, it must belong to this part.",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "itemId": {
            "description": "Read only this item and its required part context, resources and rubric.",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "additionalProperties": false
      }
    }
    attach_assessment_evaluationAction

    Save rubric feedback on the visible immutable universal assessment submission. Read its criteria, scale and response text first. The app calculates the weighted score. Identical retries return the saved evaluation without a new revision. For corrections, supply the reader's evaluationRevision as expectedRevision. Stale revisions are rejected. The visible result updates immediately.

    View tool JSON
    {
      "name": "attach_assessment_evaluation",
      "kind": "act",
      "impl": "imperative",
      "description": "Save rubric feedback on the visible immutable universal assessment submission. Read its criteria, scale and response text first. The app calculates the weighted score. Identical retries return the saved evaluation without a new revision. For corrections, supply the reader's evaluationRevision as expectedRevision. Stale revisions are rejected. The visible result updates immediately.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "attemptId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "expectedRevision": {
            "description": "Omit for first feedback or an identical retry. To change feedback, read the submission and supply its current evaluationRevision.",
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "criteria": {
            "minItems": 1,
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "criterionId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100,
                  "pattern": "^[a-z0-9][a-z0-9._-]*$"
                },
                "score": {
                  "type": "number"
                },
                "feedback": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 20000
                },
                "evidence": {
                  "default": [],
                  "maxItems": 20,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 20000
                  }
                }
              },
              "required": [
                "criterionId",
                "score",
                "feedback",
                "evidence"
              ],
              "additionalProperties": false
            }
          },
          "summary": {
            "type": "string",
            "minLength": 1,
            "maxLength": 20000
          },
          "strengths": {
            "minItems": 1,
            "maxItems": 10,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            }
          },
          "improvements": {
            "minItems": 1,
            "maxItems": 10,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            }
          },
          "annotations": {
            "default": [],
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "itemId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100,
                  "pattern": "^[a-z0-9][a-z0-9._-]*$"
                },
                "originalText": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 20000
                },
                "suggestion": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 20000
                },
                "explanation": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 20000
                }
              },
              "required": [
                "itemId",
                "originalText",
                "suggestion",
                "explanation"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "attemptId",
          "criteria",
          "summary",
          "strengths",
          "improvements",
          "annotations"
        ],
        "additionalProperties": false
      }
    }
    set_ielts_speaking_interviewAction

    Call prepare_practice_audio before authoring to download examiner voices. Save all 10–12 original questions with the visible Speaking draft before reporting success; the plan survives reload and section switching. Include Parts 1 and 3 and one Part 2 long turn with 60s preparation, 120s speaking and 3–4 cue points. Questions lock when the learner starts. Audio and progression run locally. Retrieve transcripts only after submission.

    View tool JSON
    {
      "name": "set_ielts_speaking_interview",
      "kind": "act",
      "impl": "imperative",
      "description": "Call prepare_practice_audio before authoring to download examiner voices. Save all 10–12 original questions with the visible Speaking draft before reporting success; the plan survives reload and section switching. Include Parts 1 and 3 and one Part 2 long turn with 60s preparation, 120s speaking and 3–4 cue points. Questions lock when the learner starts. Audio and progression run locally. Retrieve transcripts only after submission.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "contentKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "pattern": "^[a-z0-9][a-z0-9._-]*$"
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          },
          "questions": {
            "minItems": 10,
            "maxItems": 12,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "exclusiveMinimum": 0,
                  "maximum": 9007199254740991
                },
                "part": {
                  "anyOf": [
                    {
                      "type": "number",
                      "const": 1
                    },
                    {
                      "type": "number",
                      "const": 2
                    },
                    {
                      "type": "number",
                      "const": 3
                    }
                  ]
                },
                "label": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100
                },
                "text": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 600
                },
                "preparationSeconds": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 60
                },
                "responseSeconds": {
                  "type": "integer",
                  "minimum": 15,
                  "maximum": 120
                },
                "cuePoints": {
                  "minItems": 3,
                  "maxItems": 4,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 150
                  }
                }
              },
              "required": [
                "id",
                "part",
                "label",
                "text",
                "preparationSeconds",
                "responseSeconds"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "contentKey",
          "title",
          "questions"
        ],
        "additionalProperties": false
      }
    }
    get_ielts_speaking_progressAnswer

    Read the configured title, content key, phase, question position and answered/skipped counts without transcripts. Includes preparationStage (saving_plan, microphone_access, voice_and_recognition, or null), error and recoveryAction. Preparation may need a browser permission response or a model download. Empty setup can be paused through open_practice. After submission use get_ielts_speaking_submission.

    View tool JSON
    {
      "name": "get_ielts_speaking_progress",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the configured title, content key, phase, question position and answered/skipped counts without transcripts. Includes preparationStage (saving_plan, microphone_access, voice_and_recognition, or null), error and recoveryAction. Preparation may need a browser permission response or a model download. Empty setup can be paused through open_practice. After submission use get_ielts_speaking_submission.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    begin_submission_evaluationAction

    When asked to grade or evaluate submitted Writing, Speaking or a custom rubric assessment, call this FIRST. Opens the exact saved submission, shows an evaluating indicator, and returns the responses, existing feedback and evaluation contract in one call. Omit IDs for the visible submission; use attemptId for history or latest:true only when requested. Then assess and call the returned attachTool. This signals your work; the app does not run an AI evaluator. Never call merely to read results.

    View tool JSON
    {
      "name": "begin_submission_evaluation",
      "kind": "act",
      "impl": "imperative",
      "description": "When asked to grade or evaluate submitted Writing, Speaking or a custom rubric assessment, call this FIRST. Opens the exact saved submission, shows an evaluating indicator, and returns the responses, existing feedback and evaluation contract in one call. Omit IDs for the visible submission; use attemptId for history or latest:true only when requested. Then assess and call the returned attachTool. This signals your work; the app does not run an AI evaluator. Never call merely to read results.",
      "inputSchema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "writing",
              "speaking",
              "assessment"
            ]
          },
          "attemptId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "latest": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "kind"
        ],
        "additionalProperties": false
      }
    }