← WebMCP Directory

Tool tree

studyloop-webmcp.web.app

Health & EducationTools verified
Website
StudyLoop — a live, adaptive quiz workshop where you and your AI agent study together on one page. Built on WebMCP.
Explore capabilities
    start_sessionAction

    Start a new quiz session on the page. Clears any previous session's cards and summary (the study plan survives). Returns an error if a session is already active — either keep adding to it, or call end_session first. After starting, add cards with add_questions. Example: {"topic": "Causes of World War I", "difficulty": "medium", "target_count": 10}

    View tool JSON
    {
      "name": "start_session",
      "kind": "act",
      "impl": "imperative",
      "description": "Start a new quiz session on the page. Clears any previous session's cards and summary (the study plan survives). Returns an error if a session is already active — either keep adding to it, or call end_session first. After starting, add cards with add_questions. Example: {\"topic\": \"Causes of World War I\", \"difficulty\": \"medium\", \"target_count\": 10}",
      "inputSchema": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "maxLength": 120,
            "description": "What the session is about. Shown in the page header."
          },
          "difficulty": {
            "type": "string",
            "enum": [
              "easy",
              "medium",
              "hard"
            ],
            "description": "Session-wide default difficulty. Default: medium."
          },
          "target_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "description": "How many questions you plan to reach in total. Default: 10."
          }
        },
        "required": [
          "topic"
        ]
      }
    }
    add_questionsAction

    Add 1–20 multiple-choice question cards to the page in one call. Cards appear instantly with an animation; the STUDENT answers them by tapping on the page — never answer for them. If no session exists yet, one is auto-started from the first topic_tag. If the previous session has ended, call start_session first. Validation is all-or-nothing: on any error, nothing is added — fix and resend the batch. After the student has answered some cards, call get_session_state and add targeted follow-ups on weak topics. Example: {"questions": [{"prompt": "Which two alliances faced each other in 1914?", "options": ["NATO and the Warsaw Pact", "The Triple Entente and the Triple Alliance"], "correct_option": 1, "topic_tag": "alliances", "explanation": "The Entente (France, Russia, Britain) faced the Triple Alliance (Germany, Austria-Hungary, Italy)."}]}

    View tool JSON
    {
      "name": "add_questions",
      "kind": "act",
      "impl": "imperative",
      "description": "Add 1–20 multiple-choice question cards to the page in one call. Cards appear instantly with an animation; the STUDENT answers them by tapping on the page — never answer for them. If no session exists yet, one is auto-started from the first topic_tag. If the previous session has ended, call start_session first. Validation is all-or-nothing: on any error, nothing is added — fix and resend the batch. After the student has answered some cards, call get_session_state and add targeted follow-ups on weak topics. Example: {\"questions\": [{\"prompt\": \"Which two alliances faced each other in 1914?\", \"options\": [\"NATO and the Warsaw Pact\", \"The Triple Entente and the Triple Alliance\"], \"correct_option\": 1, \"topic_tag\": \"alliances\", \"explanation\": \"The Entente (France, Russia, Britain) faced the Triple Alliance (Germany, Austria-Hungary, Italy).\"}]}",
      "inputSchema": {
        "type": "object",
        "properties": {
          "questions": {
            "type": "array",
            "minItems": 1,
            "maxItems": 20,
            "items": {
              "type": "object",
              "properties": {
                "prompt": {
                  "type": "string",
                  "maxLength": 400,
                  "description": "The question text shown on the card."
                },
                "options": {
                  "type": "array",
                  "minItems": 2,
                  "maxItems": 6,
                  "items": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "description": "2–6 answer choices, shown as buttons A/B/C/…"
                },
                "correct_option": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "0-based index into options of the correct answer."
                },
                "topic_tag": {
                  "type": "string",
                  "maxLength": 60,
                  "description": "Short sub-topic label (e.g. 'alliances'). Drives the per-topic accuracy bars — reuse the same tag for related questions."
                },
                "explanation": {
                  "type": "string",
                  "maxLength": 600,
                  "description": "Optional. Why the correct answer is correct. Revealed only after the student answers, so it cannot spoil."
                },
                "difficulty": {
                  "type": "string",
                  "enum": [
                    "easy",
                    "medium",
                    "hard"
                  ],
                  "description": "Optional. Defaults to the session difficulty."
                }
              },
              "required": [
                "prompt",
                "options",
                "correct_option",
                "topic_tag"
              ]
            },
            "description": "The cards to add, in display order."
          }
        },
        "required": [
          "questions"
        ]
      }
    }
    get_session_stateAction

    Read the full live state of the session — THE feedback tool; call it whenever you need to know how the student is doing (after they've answered a few cards, before deciding follow-ups, when they ask how they're doing). Returns structured JSON: progress {total, answered, correct, accuracy_pct, current_streak, unanswered_ids}; questions[] with each card's result (answered, correct, selected_option, flagged, has_explanation); per_topic accuracy; study_plan; and needs_attention {flagged_question_ids: cards the student marked 'I don't get this' — explain these and consider easier follow-ups; missed_without_explanation_ids: wrong answers you haven't explained yet — call add_explanation for each; weak_topics: below 60% accuracy — add targeted questions with add_questions}. Takes no arguments. When the student asks for help, review, or follow-ups, prefer writing back to the page — add_explanation on missed or flagged cards, add_questions on weak topics — rather than replying only in chat: the page is the shared workspace. Note: reading the state intentionally leaves a visible 'agent checked your progress' line in the page's activity feed (consecutive checks collapse into one line), so this tool is not annotated read-only.

    View tool JSON
    {
      "name": "get_session_state",
      "kind": "act",
      "impl": "imperative",
      "description": "Read the full live state of the session — THE feedback tool; call it whenever you need to know how the student is doing (after they've answered a few cards, before deciding follow-ups, when they ask how they're doing). Returns structured JSON: progress {total, answered, correct, accuracy_pct, current_streak, unanswered_ids}; questions[] with each card's result (answered, correct, selected_option, flagged, has_explanation); per_topic accuracy; study_plan; and needs_attention {flagged_question_ids: cards the student marked 'I don't get this' — explain these and consider easier follow-ups; missed_without_explanation_ids: wrong answers you haven't explained yet — call add_explanation for each; weak_topics: below 60% accuracy — add targeted questions with add_questions}. Takes no arguments. When the student asks for help, review, or follow-ups, prefer writing back to the page — add_explanation on missed or flagged cards, add_questions on weak topics — rather than replying only in chat: the page is the shared workspace. Note: reading the state intentionally leaves a visible 'agent checked your progress' line in the page's activity feed (consecutive checks collapse into one line), so this tool is not annotated read-only.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    add_explanationAction

    Attach (or replace) an explanation on one question card, shown as a note from you. Use it on cards the student missed or flagged — get_session_state's needs_attention lists exactly which. The note is revealed only after the student answers that card (immediately if they already answered, or once the session ends), so it never spoils. Example: {"question_id": "q3", "text": "Serbia rejected only one clause of the ultimatum — the one allowing Austrian officials to operate on Serbian soil."}

    View tool JSON
    {
      "name": "add_explanation",
      "kind": "act",
      "impl": "imperative",
      "description": "Attach (or replace) an explanation on one question card, shown as a note from you. Use it on cards the student missed or flagged — get_session_state's needs_attention lists exactly which. The note is revealed only after the student answers that card (immediately if they already answered, or once the session ends), so it never spoils. Example: {\"question_id\": \"q3\", \"text\": \"Serbia rejected only one clause of the ultimatum — the one allowing Austrian officials to operate on Serbian soil.\"}",
      "inputSchema": {
        "type": "object",
        "properties": {
          "question_id": {
            "type": "string",
            "description": "Card id from get_session_state, e.g. \"q3\"."
          },
          "text": {
            "type": "string",
            "maxLength": 600,
            "description": "The explanation to show the student."
          }
        },
        "required": [
          "question_id",
          "text"
        ]
      }
    }
    update_questionAction

    Edit fields of an existing question card (typo fixes, clearer wording, difficulty retag). Cards the student already answered are locked except for their explanation — results stay honest; add a fresh card with add_questions instead. Editing content clears the card's flag. Example: {"question_id": "q2", "fields": {"prompt": "Clearer wording of the question?", "difficulty": "easy"}}

    View tool JSON
    {
      "name": "update_question",
      "kind": "act",
      "impl": "imperative",
      "description": "Edit fields of an existing question card (typo fixes, clearer wording, difficulty retag). Cards the student already answered are locked except for their explanation — results stay honest; add a fresh card with add_questions instead. Editing content clears the card's flag. Example: {\"question_id\": \"q2\", \"fields\": {\"prompt\": \"Clearer wording of the question?\", \"difficulty\": \"easy\"}}",
      "inputSchema": {
        "type": "object",
        "properties": {
          "question_id": {
            "type": "string",
            "description": "Card id from get_session_state, e.g. \"q2\"."
          },
          "fields": {
            "type": "object",
            "properties": {
              "prompt": {
                "type": "string",
                "maxLength": 400,
                "description": "The question text shown on the card."
              },
              "options": {
                "type": "array",
                "minItems": 2,
                "maxItems": 6,
                "items": {
                  "type": "string",
                  "maxLength": 200
                },
                "description": "2–6 answer choices, shown as buttons A/B/C/…"
              },
              "correct_option": {
                "type": "integer",
                "minimum": 0,
                "description": "0-based index into options of the correct answer."
              },
              "explanation": {
                "type": "string",
                "maxLength": 600,
                "description": "Optional. Why the correct answer is correct. Revealed only after the student answers, so it cannot spoil."
              },
              "topic_tag": {
                "type": "string",
                "maxLength": 60,
                "description": "Short sub-topic label (e.g. 'alliances'). Drives the per-topic accuracy bars — reuse the same tag for related questions."
              },
              "difficulty": {
                "type": "string",
                "enum": [
                  "easy",
                  "medium",
                  "hard"
                ],
                "description": "Optional. Defaults to the session difficulty."
              }
            },
            "description": "Only the fields you want to change."
          }
        },
        "required": [
          "question_id",
          "fields"
        ]
      }
    }
    set_study_planAction

    Render (or replace) the visible study-plan sidebar — the roadmap you are steering the student through. Set it early, then keep statuses honest as the session progresses: planned → in_progress → done. The plan survives across sessions. Replaces the whole list each call (1–12 topics). Example: {"topics": [{"topic": "alliances", "status": "done"}, {"topic": "July Crisis", "status": "in_progress"}, {"topic": "naval arms race", "status": "planned"}]} — bare strings also work: {"topics": ["alliances", "July Crisis"]}

    View tool JSON
    {
      "name": "set_study_plan",
      "kind": "act",
      "impl": "imperative",
      "description": "Render (or replace) the visible study-plan sidebar — the roadmap you are steering the student through. Set it early, then keep statuses honest as the session progresses: planned → in_progress → done. The plan survives across sessions. Replaces the whole list each call (1–12 topics). Example: {\"topics\": [{\"topic\": \"alliances\", \"status\": \"done\"}, {\"topic\": \"July Crisis\", \"status\": \"in_progress\"}, {\"topic\": \"naval arms race\", \"status\": \"planned\"}]} — bare strings also work: {\"topics\": [\"alliances\", \"July Crisis\"]}",
      "inputSchema": {
        "type": "object",
        "properties": {
          "topics": {
            "type": "array",
            "minItems": 1,
            "maxItems": 12,
            "items": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 60
                },
                {
                  "type": "object",
                  "properties": {
                    "topic": {
                      "type": "string",
                      "maxLength": 60
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "planned",
                        "in_progress",
                        "done"
                      ]
                    }
                  },
                  "required": [
                    "topic"
                  ]
                }
              ]
            },
            "description": "The full plan, in order. Strings default to status 'planned'."
          }
        },
        "required": [
          "topics"
        ]
      }
    }
    end_sessionAction

    End the session and show the student their summary screen. Answering locks; all explanations become visible. Returns the summary to discuss with the student: score, accuracy_pct, per_topic results, weak_topics, flagged_count, best_streak, and suggested_next_steps. Call it when the target count is reached, or when the student asks to stop. Calling it again later returns a freshly recomputed summary. Takes no arguments.

    View tool JSON
    {
      "name": "end_session",
      "kind": "act",
      "impl": "imperative",
      "description": "End the session and show the student their summary screen. Answering locks; all explanations become visible. Returns the summary to discuss with the student: score, accuracy_pct, per_topic results, weak_topics, flagged_count, best_streak, and suggested_next_steps. Call it when the target count is reached, or when the student asks to stop. Calling it again later returns a freshly recomputed summary. Takes no arguments.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }