{"ok":true,"site":{"host":"studybench-clean.vercel.app","url":"https://studybench-clean.vercel.app/","type":"live","desc":"A spaced-repetition study workspace that exposes its entire functionality as WebMCP tools, so an AI agent can build, drill and plan alongside you.","tools":[{"name":"get_progress_report","kind":"answer","impl":"imperative","description":"Read the full state of the student: overall mastery, every topic with its mastery percentage and card count, cards due now, weakest topics, exam date and days remaining, and recent session accuracy. Call this first to understand who you are helping.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_topics","kind":"answer","impl":"imperative","description":"List every topic in the study library with its chapter, difficulty, number of cards, how many are due, and its mastery percentage from 0 to 100.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_weak_topics","kind":"answer","impl":"imperative","description":"Find the topics the student is most likely to lose marks on: those whose mastery falls below a threshold, weakest first. Use this to decide what to drill or what to put in a revision plan.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"threshold":{"type":"number","description":"Mastery percentage below which a topic counts as weak. Defaults to 60."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_cards","kind":"answer","impl":"imperative","description":"List flashcards, optionally filtered to one topic. Returns each card id, its question and answer, how many times it has been reviewed, and when it is next due. Use the returned ids with update_card or delete_card.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"topic":{"type":"string","description":"Topic name to filter by. Omit for every card."},"onlyDue":{"type":"boolean","description":"When true, return only cards that are due for review now."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_due_forecast","kind":"answer","impl":"imperative","description":"Show how many cards fall due on each of the next N days, plus how many are already overdue. Use it to warn the student about a review pile-up before it happens.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"days":{"type":"number","description":"How many days ahead to forecast. Defaults to 7."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_topic","kind":"act","impl":"imperative","description":"Create a topic in the study library, for example \"Deadlock Handling\" in the chapter \"Process Synchronisation\". Returns the topic. Safe to call twice: an existing topic with the same name is returned unchanged.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"The topic name as the student would say it."},"chapter":{"type":"string","description":"The chapter or unit this topic belongs to."},"difficulty":{"type":"string","enum":["easy","medium","hard"]}},"required":["name"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_cards","kind":"act","impl":"imperative","description":"Add one or many flashcards to a topic in a single call. This is the main way to turn notes, a syllabus or a textbook chapter into study material. Write the front as a question the student must answer from memory and the back as the complete answer.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"topic":{"type":"string","description":"Topic name. The topic must already exist — call add_topic first."},"cards":{"type":"array","description":"The cards to add.","items":{"type":"object","properties":{"front":{"type":"string","description":"The question shown to the student."},"back":{"type":"string","description":"The full answer."},"hint":{"type":"string","description":"An optional nudge shown on request."}},"required":["front","back"]}}},"required":["topic","cards"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_card","kind":"act","impl":"imperative","description":"Rewrite a flashcard. Use it to fix a wrong answer, sharpen a vague question, or add a hint. Get card ids from list_cards.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"cardId":{"type":"string"},"front":{"type":"string"},"back":{"type":"string"},"hint":{"type":"string"}},"required":["cardId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"attach_explanation","kind":"act","impl":"imperative","description":"Attach a worked explanation to a card — why the answer is what it is, or where the student went wrong. The explanation is shown under the answer during review. This is the single most useful thing to do after a student misses a question.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"cardId":{"type":"string"},"explanation":{"type":"string","description":"A short, plain explanation the student can read in ten seconds."}},"required":["cardId","explanation"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_card","kind":"transact","impl":"imperative","description":"Permanently remove a flashcard. The student is asked to confirm before anything is deleted.","annotations":{"readOnlyHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"cardId":{"type":"string"}},"required":["cardId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"delete_topic","kind":"transact","impl":"imperative","description":"Permanently remove a topic and every card inside it. The student is asked to confirm first.","annotations":{"readOnlyHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"topic":{"type":"string"}},"required":["topic"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"start_review_session","kind":"act","impl":"imperative","description":"Open the review screen and begin quizzing the student. Scope \"due\" reviews everything scheduled for today, \"weak\" drills the three weakest topics, \"topic\" drills one named topic, and \"all\" ignores scheduling. While a session is running, extra tools appear for reading, revealing and grading the card on screen.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"scope":{"type":"string","enum":["due","weak","topic","all"]},"topic":{"type":"string","description":"Required when scope is \"topic\"."},"limit":{"type":"number","description":"Maximum cards in the queue. Defaults to 20."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"end_review_session","kind":"act","impl":"imperative","description":"Finish the running review session and return a summary: how many cards were reviewed, the accuracy, which questions were missed, and how long it took. Use the missed list to decide what to explain next.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_exam_date","kind":"act","impl":"imperative","description":"Record what the student is preparing for and when it is. Everything downstream — the plan, the urgency of each topic — keys off this.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"What the exam is called, e.g. \"Operating Systems end-sem\"."},"date":{"type":"string","description":"The exam date as YYYY-MM-DD."}},"required":["date"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_study_plan","kind":"act","impl":"imperative","description":"Generate a day-by-day revision plan from today to the exam. Weak topics get proportionally more slots and are front-loaded, then interleaved across days for spacing. The plan appears in the Plan tab where the student can tick days off.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"dailyMinutes":{"type":"number","description":"How long the student can study each day. Defaults to 30."},"examDate":{"type":"string","description":"YYYY-MM-DD. Defaults to the stored exam date."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"mark_plan_day","kind":"act","impl":"imperative","description":"Tick a day of the revision plan as done, or untick it.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"date":{"type":"string","description":"YYYY-MM-DD"},"done":{"type":"boolean"}},"required":["date"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"show_view","kind":"act","impl":"imperative","description":"Bring a part of the app into view for the student: \"library\", \"review\", \"plan\" or \"activity\". Use it so the student is looking at whatever you are talking about.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"view":{"type":"string","enum":["library","review","plan","activity"]}},"required":["view"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"say_to_student","kind":"transact","impl":"imperative","description":"Post a short coaching note into the app itself, so it survives after the chat is closed. Use it for encouragement, a warning about a pile-up, or a one-line summary of what you just did.","annotations":{"readOnlyHint":false,"destructiveHint":false},"inputSchema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Health & Education","favicon":"/favicons/studybench-clean.vercel.app.svg","apiSurface":"spec","toolCount":18}}