← WebMCP Directory

Tool tree

tandem-tau-nine.vercel.app

Health & EducationTools verified
Website
A spaced repetition study board that exposes its own state as WebMCP tools, so an agent can read the card you are looking at, drill your weakest topics and pin explanations that are still there next…
Explore capabilities
    list_decksAnswer

    List every deck in the workspace with its card count, how many cards are due now, its exam date and its overall difficulty. Call this first when you do not yet know what the student is studying.

    View tool JSON
    {
      "name": "list_decks",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every deck in the workspace with its card count, how many cards are due now, its exam date and its overall difficulty. Call this first when you do not yet know what the student is studying.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    get_deckAnswer

    Get the contents of one deck: cards with their front, back, topic, difficulty and next due date. Use this before rewriting cards or building a plan so you are working from what actually exists. Large decks are truncated, so narrow with topic or reach for search_cards when you are looking for something specific rather than reading everything.

    View tool JSON
    {
      "name": "get_deck",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the contents of one deck: cards with their front, back, topic, difficulty and next due date. Use this before rewriting cards or building a plan so you are working from what actually exists. Large decks are truncated, so narrow with topic or reach for search_cards when you are looking for something specific rather than reading everything.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "deck": {
            "type": "string",
            "description": "Deck name or id."
          },
          "topic": {
            "type": "string",
            "description": "Optional: only return cards in this topic."
          },
          "limit": {
            "type": "integer",
            "description": "Max cards per page. Default 12, hard cap 50."
          },
          "offset": {
            "type": "integer",
            "description": "How many cards to skip. Use the nextOffset from the previous call."
          }
        },
        "required": [
          "deck"
        ],
        "additionalProperties": false
      }
    }
    search_cardsAnswer

    Full-text search across every card in every deck (front, back, topic and notes). Use it to check whether a card already exists before adding a duplicate, and to find one card without reading a whole deck. Results are paginated: pass the returned nextOffset to continue.

    View tool JSON
    {
      "name": "search_cards",
      "kind": "answer",
      "impl": "imperative",
      "description": "Full-text search across every card in every deck (front, back, topic and notes). Use it to check whether a card already exists before adding a duplicate, and to find one card without reading a whole deck. Results are paginated: pass the returned nextOffset to continue.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Text to search for."
          },
          "limit": {
            "type": "integer",
            "description": "Max results per page. Default 10, hard cap 50."
          },
          "offset": {
            "type": "integer",
            "description": "How many matches to skip. Use the nextOffset from the previous call."
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      }
    }
    get_study_stateAnswer

    Read what the student is looking at right now: the active session, the card on screen, whether the answer is revealed, how the session is going so far, and today’s plan blocks. Call this whenever the student says something like “I don’t get this one” without naming the card. It is how you see their screen.

    View tool JSON
    {
      "name": "get_study_state",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read what the student is looking at right now: the active session, the card on screen, whether the answer is revealed, how the session is going so far, and today’s plan blocks. Call this whenever the student says something like “I don’t get this one” without naming the card. It is how you see their screen.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    get_weak_topicsAnswer

    Rank the topics in a deck from weakest to strongest, using the student’s real grading history (lapse count and ease decay), not guesses. This is the right input for deciding what to drill or what to put in a revision plan.

    View tool JSON
    {
      "name": "get_weak_topics",
      "kind": "answer",
      "impl": "imperative",
      "description": "Rank the topics in a deck from weakest to strongest, using the student’s real grading history (lapse count and ease decay), not guesses. This is the right input for deciding what to drill or what to put in a revision plan.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "deck": {
            "type": "string",
            "description": "Deck name or id."
          }
        },
        "required": [
          "deck"
        ],
        "additionalProperties": false
      }
    }
    create_deckAction

    Create a new empty deck, then fill it with add_cards. Use this when the student mentions a subject that is not already in list_decks, rather than dropping unrelated cards into an existing deck.

    View tool JSON
    {
      "name": "create_deck",
      "kind": "act",
      "impl": "imperative",
      "description": "Create a new empty deck, then fill it with add_cards. Use this when the student mentions a subject that is not already in list_decks, rather than dropping unrelated cards into an existing deck.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Deck name.",
            "maxLength": 120
          },
          "description": {
            "type": "string",
            "description": "One line about what it covers.",
            "maxLength": 500
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      }
    }
    add_cardsAction

    Add one or many flashcards to a deck in a single call. This is how you turn a paste of lecture notes into study material: split the notes yourself, then send the cards here with a topic tag on each. Keep fronts to a single question and backs to a single idea.

    View tool JSON
    {
      "name": "add_cards",
      "kind": "act",
      "impl": "imperative",
      "description": "Add one or many flashcards to a deck in a single call. This is how you turn a paste of lecture notes into study material: split the notes yourself, then send the cards here with a topic tag on each. Keep fronts to a single question and backs to a single idea.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "deck": {
            "type": "string",
            "description": "Deck name or id."
          },
          "cards": {
            "type": "array",
            "description": "The cards to add.",
            "items": {
              "type": "object",
              "properties": {
                "front": {
                  "type": "string",
                  "description": "The question or prompt.",
                  "maxLength": 2000
                },
                "back": {
                  "type": "string",
                  "description": "The answer.",
                  "maxLength": 2000
                },
                "topic": {
                  "type": "string",
                  "description": "Short topic tag, e.g. \"Deadlock\". Group related cards under the same tag.",
                  "maxLength": 60
                },
                "note": {
                  "type": "string",
                  "description": "Optional explanation or mnemonic shown under the answer.",
                  "maxLength": 2000
                }
              },
              "required": [
                "front",
                "back"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "deck",
          "cards"
        ],
        "additionalProperties": false
      }
    }
    update_cardAction

    Rewrite an existing card’s question, answer or topic tag. Use search_cards or get_deck to find the id first.

    View tool JSON
    {
      "name": "update_card",
      "kind": "act",
      "impl": "imperative",
      "description": "Rewrite an existing card’s question, answer or topic tag. Use search_cards or get_deck to find the id first.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "cardId": {
            "type": "string",
            "description": "Card id."
          },
          "front": {
            "type": "string",
            "description": "New question.",
            "maxLength": 2000
          },
          "back": {
            "type": "string",
            "description": "New answer.",
            "maxLength": 2000
          },
          "topic": {
            "type": "string",
            "description": "New topic tag.",
            "maxLength": 60
          }
        },
        "required": [
          "cardId"
        ],
        "additionalProperties": false
      }
    }
    annotate_cardAction

    Attach an explanation, worked example or mnemonic to a card. The note appears under the answer whenever the student sees that card again, including in future sessions. Use this the moment the student gets something wrong: explaining once in chat is forgotten, a note on the card is not.

    View tool JSON
    {
      "name": "annotate_card",
      "kind": "act",
      "impl": "imperative",
      "description": "Attach an explanation, worked example or mnemonic to a card. The note appears under the answer whenever the student sees that card again, including in future sessions. Use this the moment the student gets something wrong: explaining once in chat is forgotten, a note on the card is not.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "cardId": {
            "type": "string",
            "description": "Card id."
          },
          "note": {
            "type": "string",
            "description": "The explanation or mnemonic. Keep it to two or three sentences.",
            "maxLength": 2000
          }
        },
        "required": [
          "cardId",
          "note"
        ],
        "additionalProperties": false
      }
    }
    delete_cardSensitive Action

    Ask the student for permission to permanently remove a card, for example a duplicate or one they say is wrong. This does not delete anything by itself. It puts the request on the student’s screen, where they press Allow or Deny; a deletion can only happen because they clicked, never because you asserted they agreed. Explain in chat why you are asking, then poll get_approval for the answer.

    View tool JSON
    {
      "name": "delete_card",
      "kind": "transact",
      "impl": "imperative",
      "description": "Ask the student for permission to permanently remove a card, for example a duplicate or one they say is wrong. This does not delete anything by itself. It puts the request on the student’s screen, where they press Allow or Deny; a deletion can only happen because they clicked, never because you asserted they agreed. Explain in chat why you are asking, then poll get_approval for the answer.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "cardId": {
            "type": "string",
            "description": "Card id."
          },
          "reason": {
            "type": "string",
            "description": "Why this card should go. Shown to the student.",
            "maxLength": 300
          }
        },
        "required": [
          "cardId"
        ],
        "additionalProperties": false
      }
    }
    get_approvalAnswer

    Check what the student answered to a permission request. Returns pending until they press a button. Never assume the answer: a pending request means the card is still there.

    View tool JSON
    {
      "name": "get_approval",
      "kind": "answer",
      "impl": "imperative",
      "description": "Check what the student answered to a permission request. Returns pending until they press a button. Never assume the answer: a pending request means the card is still there.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "requestId": {
            "type": "string",
            "description": "The id returned by the tool that asked."
          }
        },
        "required": [
          "requestId"
        ],
        "additionalProperties": false
      }
    }
    set_exam_dateAction

    Set or clear the exam date on a deck. plan_revision needs this to know how many days it has to work with, and the dashboard counts down to it.

    View tool JSON
    {
      "name": "set_exam_date",
      "kind": "act",
      "impl": "imperative",
      "description": "Set or clear the exam date on a deck. plan_revision needs this to know how many days it has to work with, and the dashboard counts down to it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "deck": {
            "type": "string",
            "description": "Deck name or id."
          },
          "date": {
            "type": "string",
            "description": "Exam date as YYYY-MM-DD, or \"none\" to clear it."
          }
        },
        "required": [
          "deck",
          "date"
        ],
        "additionalProperties": false
      }
    }
    start_sessionAction

    Put the student into a study session. Mode "due" studies what spaced repetition says is due, "weak" drills the lowest-scoring topics first, "topic" studies one named topic, "all" shuffles everything. The cards appear on the student’s screen immediately, and they answer in the UI, not in chat.

    View tool JSON
    {
      "name": "start_session",
      "kind": "act",
      "impl": "imperative",
      "description": "Put the student into a study session. Mode \"due\" studies what spaced repetition says is due, \"weak\" drills the lowest-scoring topics first, \"topic\" studies one named topic, \"all\" shuffles everything. The cards appear on the student’s screen immediately, and they answer in the UI, not in chat.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "deck": {
            "type": "string",
            "description": "Deck name or id."
          },
          "mode": {
            "type": "string",
            "enum": [
              "due",
              "weak",
              "topic",
              "all"
            ],
            "description": "How to build the queue."
          },
          "topic": {
            "type": "string",
            "description": "Required when mode is \"topic\"."
          },
          "limit": {
            "type": "integer",
            "description": "Max cards in the queue. Default 12."
          }
        },
        "required": [
          "deck",
          "mode"
        ],
        "additionalProperties": false
      }
    }
    highlightAction

    Point at something on the student’s screen: a topic or a single card gets outlined in the UI with your reason next to it. Use it when you want them to look at something while you explain it in chat.

    View tool JSON
    {
      "name": "highlight",
      "kind": "act",
      "impl": "imperative",
      "description": "Point at something on the student’s screen: a topic or a single card gets outlined in the UI with your reason next to it. Use it when you want them to look at something while you explain it in chat.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "description": "Topic to highlight.",
            "maxLength": 60
          },
          "cardId": {
            "type": "string",
            "description": "Card to highlight."
          },
          "reason": {
            "type": "string",
            "description": "Short label shown next to the highlight.",
            "maxLength": 300
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    get_note_impactAnswer

    Check whether the explanations you attached to cards actually worked. For every annotated card it compares the student’s miss rate before the note was added with the miss rate after it, and returns a verdict. Use it to find your own explanations that are not landing and rewrite them with annotate_card, rather than assuming an explanation stuck because you wrote it well.

    View tool JSON
    {
      "name": "get_note_impact",
      "kind": "answer",
      "impl": "imperative",
      "description": "Check whether the explanations you attached to cards actually worked. For every annotated card it compares the student’s miss rate before the note was added with the miss rate after it, and returns a verdict. Use it to find your own explanations that are not landing and rewrite them with annotate_card, rather than assuming an explanation stuck because you wrote it well.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "deck": {
            "type": "string",
            "description": "Optional: only look at one deck."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    plan_revisionAction

    Build a day-by-day revision plan from today to the deck’s exam date, weighted so weak topics get more minutes and every topic gets a spaced second pass. The plan appears on the dashboard as tickable blocks. Requires an exam date, so set one with set_exam_date first.

    View tool JSON
    {
      "name": "plan_revision",
      "kind": "act",
      "impl": "imperative",
      "description": "Build a day-by-day revision plan from today to the deck’s exam date, weighted so weak topics get more minutes and every topic gets a spaced second pass. The plan appears on the dashboard as tickable blocks. Requires an exam date, so set one with set_exam_date first.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "deck": {
            "type": "string",
            "description": "Deck name or id."
          },
          "minutesPerDay": {
            "type": "integer",
            "description": "How long the student can study each day. Default 40."
          }
        },
        "required": [
          "deck"
        ],
        "additionalProperties": false
      }
    }