← WebMCP Directory

Tool tree

waymark-sable.vercel.app

demoHealth & EducationTools verified
Website
Learning roadmaps you and your agent build together. Your agent researches and plans; you learn; the path adapts.
Explore capabilities
    create_pathAction

    Create a new learning path for the user. Call this first when the user asks to learn a topic. Returns the path_id used by all other tools.

    View tool JSON
    {
      "name": "create_path",
      "kind": "act",
      "impl": "imperative",
      "description": "Create a new learning path for the user. Call this first when the user asks to learn a topic. Returns the path_id used by all other tools.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "description": "What the user wants to learn"
          },
          "goal": {
            "type": "string",
            "description": "The user's concrete end goal"
          },
          "learner_background": {
            "type": "string",
            "description": "What the user already knows"
          },
          "hours_per_week": {
            "type": "number"
          }
        },
        "required": [
          "topic",
          "goal",
          "learner_background",
          "hours_per_week"
        ]
      }
    }
    add_stepAction

    Add a learning step (article, video, exercise, project, or quiz) to a path. Provide `why` — a one-sentence rationale shown to the user on the step card. URLs are validated server-side; dead links are rejected.

    View tool JSON
    {
      "name": "add_step",
      "kind": "act",
      "impl": "imperative",
      "description": "Add a learning step (article, video, exercise, project, or quiz) to a path. Provide `why` — a one-sentence rationale shown to the user on the step card. URLs are validated server-side; dead links are rejected.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "position": {
            "type": "number",
            "description": "Insert index; omit to append"
          },
          "title": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "article",
              "video",
              "exercise",
              "project",
              "quiz"
            ]
          },
          "url": {
            "type": "string",
            "description": "Resource link. For videos prefer YouTube URLs — they embed in the page and the user's watch progress is tracked for you."
          },
          "why": {
            "type": "string",
            "description": "Why this step, in one sentence"
          },
          "phase": {
            "type": "string",
            "description": "Curriculum phase this step belongs to (e.g. 'Fundamentals', 'Capstone'). Steps are grouped under phase headings in the UI."
          },
          "est_minutes": {
            "type": "number"
          }
        },
        "required": [
          "path_id",
          "title",
          "kind",
          "why",
          "est_minutes"
        ]
      }
    }
    remove_stepAction

    Remove a step from a path. Fails if the user has locked the step — locked steps are under the user's control and must not be removed.

    View tool JSON
    {
      "name": "remove_step",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove a step from a path. Fails if the user has locked the step — locked steps are under the user's control and must not be removed.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "step_id": {
            "type": "string"
          }
        },
        "required": [
          "path_id",
          "step_id"
        ]
      }
    }
    get_pathAnswer

    Read the full current state of a learning path, including step order, statuses, locks, and user notes.

    View tool JSON
    {
      "name": "get_path",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the full current state of a learning path, including step order, statuses, locks, and user notes.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          }
        },
        "required": [
          "path_id"
        ]
      }
    }
    list_pathsAnswer

    List all of the user's learning paths. Call this on a return visit to re-orient yourself.

    View tool JSON
    {
      "name": "list_paths",
      "kind": "answer",
      "impl": "imperative",
      "description": "List all of the user's learning paths. Call this on a return visit to re-orient yourself.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    }
    mark_stepAction

    Update a step's progress status on the user's behalf, optionally attaching a note about their experience.

    View tool JSON
    {
      "name": "mark_step",
      "kind": "act",
      "impl": "imperative",
      "description": "Update a step's progress status on the user's behalf, optionally attaching a note about their experience.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "step_id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "todo",
              "in_progress",
              "done",
              "skipped"
            ]
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "path_id",
          "step_id",
          "status"
        ]
      }
    }
    update_stepAction

    Edit a step's title, resource URL, rationale, kind, or time estimate. Fails on user-locked steps.

    View tool JSON
    {
      "name": "update_step",
      "kind": "act",
      "impl": "imperative",
      "description": "Edit a step's title, resource URL, rationale, kind, or time estimate. Fails on user-locked steps.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "step_id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "article",
              "video",
              "exercise",
              "project",
              "quiz"
            ]
          },
          "url": {
            "type": "string"
          },
          "why": {
            "type": "string"
          },
          "phase": {
            "type": "string"
          },
          "est_minutes": {
            "type": "number"
          }
        },
        "required": [
          "path_id",
          "step_id"
        ]
      }
    }
    reorder_stepsAction

    Reorder a path's steps. Provide the complete list of step ids in the new order. User-locked steps must stay at their current positions.

    View tool JSON
    {
      "name": "reorder_steps",
      "kind": "act",
      "impl": "imperative",
      "description": "Reorder a path's steps. Provide the complete list of step ids in the new order. User-locked steps must stay at their current positions.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "ordered_step_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "path_id",
          "ordered_step_ids"
        ]
      }
    }
    record_noteAction

    Attach a note to a step on the user's behalf — their reaction to a resource, a confusion, a takeaway. Notes are shown on the step card and inform future adaptation.

    View tool JSON
    {
      "name": "record_note",
      "kind": "act",
      "impl": "imperative",
      "description": "Attach a note to a step on the user's behalf — their reaction to a resource, a confusion, a takeaway. Notes are shown on the step card and inform future adaptation.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "step_id": {
            "type": "string"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "path_id",
          "step_id",
          "note"
        ]
      }
    }
    get_progressAnswer

    Read a progress summary for a path: per-step statuses, notes, completion counts, remaining time, and days since last activity. watched_percent is measured from the embedded video player (reliable). engaged_minutes is time spent away after opening an external resource — a rough attention signal, not verified consumption. Call this on a return visit before suggesting what to do next.

    View tool JSON
    {
      "name": "get_progress",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read a progress summary for a path: per-step statuses, notes, completion counts, remaining time, and days since last activity. watched_percent is measured from the embedded video player (reliable). engaged_minutes is time spent away after opening an external resource — a rough attention signal, not verified consumption. Call this on a return visit before suggesting what to do next.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          }
        },
        "required": [
          "path_id"
        ]
      }
    }
    create_quizAction

    Create a multiple-choice quiz attached to a step. The USER answers it in the page UI — do not answer it yourself. Set reveal: 'on_step_done' to author quizzes ahead of time — the page shows the quiz automatically when the user finishes the step. Give each question a `remedial` follow-up step; if the user misses that question, the page automatically proposes it (user approves) even with no agent present. When you're in the loop live, call await_quiz_results after creating.

    View tool JSON
    {
      "name": "create_quiz",
      "kind": "act",
      "impl": "imperative",
      "description": "Create a multiple-choice quiz attached to a step. The USER answers it in the page UI — do not answer it yourself. Set reveal: 'on_step_done' to author quizzes ahead of time — the page shows the quiz automatically when the user finishes the step. Give each question a `remedial` follow-up step; if the user misses that question, the page automatically proposes it (user approves) even with no agent present. When you're in the loop live, call await_quiz_results after creating.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "step_id": {
            "type": "string",
            "description": "The step this quiz checks understanding of"
          },
          "reveal": {
            "type": "string",
            "enum": [
              "immediately",
              "on_step_done"
            ],
            "description": "on_step_done hides the quiz until the user marks the step done (default: immediately)"
          },
          "questions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "prompt": {
                  "type": "string"
                },
                "choices": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "minItems": 2,
                  "maxItems": 5
                },
                "correct_index": {
                  "type": "number"
                },
                "remedial": {
                  "type": "object",
                  "description": "Follow-up step auto-proposed to the user if they miss this question",
                  "properties": {
                    "title": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "article",
                        "video",
                        "exercise",
                        "project",
                        "quiz"
                      ]
                    },
                    "url": {
                      "type": "string"
                    },
                    "why": {
                      "type": "string"
                    },
                    "phase": {
                      "type": "string"
                    },
                    "est_minutes": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "title",
                    "kind",
                    "why",
                    "est_minutes"
                  ]
                }
              },
              "required": [
                "prompt",
                "choices",
                "correct_index"
              ]
            }
          }
        },
        "required": [
          "path_id",
          "step_id",
          "questions"
        ]
      }
    }
    get_quiz_resultsAnswer

    Read the user's answers to a quiz. Returns pending status until the user submits in the page. Use missed questions to adapt the path.

    View tool JSON
    {
      "name": "get_quiz_results",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the user's answers to a quiz. Returns pending status until the user submits in the page. Use missed questions to adapt the path.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "quiz_id": {
            "type": "string"
          }
        },
        "required": [
          "quiz_id"
        ]
      }
    }
    await_quiz_resultsAction

    Wait (block) until the user submits a quiz in the page, then return their results — call this right after create_quiz instead of polling. Returns pending if the timeout passes first; you can call it again.

    View tool JSON
    {
      "name": "await_quiz_results",
      "kind": "act",
      "impl": "imperative",
      "description": "Wait (block) until the user submits a quiz in the page, then return their results — call this right after create_quiz instead of polling. Returns pending if the timeout passes first; you can call it again.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "quiz_id": {
            "type": "string"
          },
          "timeout_seconds": {
            "type": "number",
            "description": "How long to wait before giving up (5–300, default 60)"
          }
        },
        "required": [
          "quiz_id"
        ]
      }
    }
    propose_revisionAction

    Propose a set of path changes for the USER to accept or decline in the page UI — use this instead of direct edits when a change is significant (inserting remedial steps after a failed quiz, restructuring a phase) or touches user-locked steps. The user's accept is their consent, so proposals MAY include locked steps. Poll get_proposal_status afterwards.

    View tool JSON
    {
      "name": "propose_revision",
      "kind": "act",
      "impl": "imperative",
      "description": "Propose a set of path changes for the USER to accept or decline in the page UI — use this instead of direct edits when a change is significant (inserting remedial steps after a failed quiz, restructuring a phase) or touches user-locked steps. The user's accept is their consent, so proposals MAY include locked steps. Poll get_proposal_status afterwards.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "reason": {
            "type": "string",
            "description": "Why you're proposing this, in one or two sentences. Shown to the user."
          },
          "ops": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "properties": {
                "op": {
                  "type": "string",
                  "enum": [
                    "add_step",
                    "remove_step",
                    "update_step",
                    "reorder_steps"
                  ]
                },
                "position": {
                  "type": "number",
                  "description": "add_step: insert index; omit to append"
                },
                "step_id": {
                  "type": "string",
                  "description": "remove_step / update_step"
                },
                "ordered_step_ids": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "reorder_steps: complete new order"
                },
                "title": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "article",
                    "video",
                    "exercise",
                    "project",
                    "quiz"
                  ]
                },
                "url": {
                  "type": "string"
                },
                "why": {
                  "type": "string"
                },
                "phase": {
                  "type": "string"
                },
                "est_minutes": {
                  "type": "number"
                }
              },
              "required": [
                "op"
              ]
            }
          }
        },
        "required": [
          "path_id",
          "reason",
          "ops"
        ]
      }
    }
    await_proposal_decisionAction

    Wait (block) until the user accepts or declines a proposal in the page — call this right after propose_revision instead of polling. Accepted ops are already applied when this returns. Returns pending if the timeout passes first.

    View tool JSON
    {
      "name": "await_proposal_decision",
      "kind": "act",
      "impl": "imperative",
      "description": "Wait (block) until the user accepts or declines a proposal in the page — call this right after propose_revision instead of polling. Accepted ops are already applied when this returns. Returns pending if the timeout passes first.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposal_id": {
            "type": "string"
          },
          "timeout_seconds": {
            "type": "number",
            "description": "How long to wait before giving up (5–300, default 60)"
          }
        },
        "required": [
          "proposal_id"
        ]
      }
    }
    get_proposal_statusAnswer

    Check whether the user accepted or declined a proposal. Accepted ops are already applied — read the path with get_path afterwards. A declined proposal should be respected, not retried.

    View tool JSON
    {
      "name": "get_proposal_status",
      "kind": "answer",
      "impl": "imperative",
      "description": "Check whether the user accepted or declined a proposal. Accepted ops are already applied — read the path with get_path afterwards. A declined proposal should be respected, not retried.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposal_id": {
            "type": "string"
          }
        },
        "required": [
          "proposal_id"
        ]
      }
    }
    highlight_stepAction

    Point the user at one step on the page: it scrolls into view with your short message attached. Use when telling the user where to pick up or what to look at — the message should say why.

    View tool JSON
    {
      "name": "highlight_step",
      "kind": "act",
      "impl": "imperative",
      "description": "Point the user at one step on the page: it scrolls into view with your short message attached. Use when telling the user where to pick up or what to look at — the message should say why.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "step_id": {
            "type": "string"
          },
          "message": {
            "type": "string",
            "description": "One sentence shown in a bubble on the step"
          }
        },
        "required": [
          "path_id",
          "step_id",
          "message"
        ]
      }
    }
    create_flashcardsAction

    Attach a flashcard deck to a step for the USER to review in the page — front is the prompt, back is the answer. Good after the user finishes a concept-heavy step. Check retention later with get_review_stats.

    View tool JSON
    {
      "name": "create_flashcards",
      "kind": "act",
      "impl": "imperative",
      "description": "Attach a flashcard deck to a step for the USER to review in the page — front is the prompt, back is the answer. Good after the user finishes a concept-heavy step. Check retention later with get_review_stats.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "step_id": {
            "type": "string"
          },
          "cards": {
            "type": "array",
            "minItems": 1,
            "maxItems": 20,
            "items": {
              "type": "object",
              "properties": {
                "front": {
                  "type": "string"
                },
                "back": {
                  "type": "string"
                }
              },
              "required": [
                "front",
                "back"
              ]
            }
          }
        },
        "required": [
          "path_id",
          "step_id",
          "cards"
        ]
      }
    }
    get_review_statsAnswer

    Read the user's flashcard results for a deck: per-card seen/got-it counts and last result. Cards repeatedly marked 'again' signal concepts to reinforce with remedial steps or a quiz.

    View tool JSON
    {
      "name": "get_review_stats",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the user's flashcard results for a deck: per-card seen/got-it counts and last result. Cards repeatedly marked 'again' signal concepts to reinforce with remedial steps or a quiz.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "deck_id": {
            "type": "string"
          }
        },
        "required": [
          "deck_id"
        ]
      }
    }
    plan_weeksAction

    Assign steps to calendar weeks (1-based) so the path fits the user's stated hours per week — each step shows its week badge in the UI. Provide an assignment for every step you want scheduled; steps omitted keep their current week.

    View tool JSON
    {
      "name": "plan_weeks",
      "kind": "act",
      "impl": "imperative",
      "description": "Assign steps to calendar weeks (1-based) so the path fits the user's stated hours per week — each step shows its week badge in the UI. Provide an assignment for every step you want scheduled; steps omitted keep their current week.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path_id": {
            "type": "string"
          },
          "assignments": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "properties": {
                "step_id": {
                  "type": "string"
                },
                "week": {
                  "type": "number",
                  "minimum": 1
                }
              },
              "required": [
                "step_id",
                "week"
              ]
            }
          }
        },
        "required": [
          "path_id",
          "assignments"
        ]
      }
    }