← WebMCP Directory

Tool tree

learn.powerplatform.fyi

Health & EducationTools verified
Website
An adaptive PL-400 course that coaches Power Platform developers to mastery through a governed lesson, practice, and tool-roster loop.
Explore capabilities

    page: Every page

    get_learner_stateAnswer

    Read this first, every session — the learner's rubric scores, misconception fire counts, phase, gate status, attempt count, their written lesson aims, one-line rule compressions, and run commitments, PLUS coachingNotes (durable observations from previous coaching sessions, including yours) and a coachCalibration summary of how earlier confidence hints and rubric proposals matched engine outcomes. Call again before choosing any coaching move. When a rule compression exists, critique it against the lesson's governing rule — what did they miss or overstate?

    View tool JSON
    {
      "name": "get_learner_state",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read this first, every session — the learner's rubric scores, misconception fire counts, phase, gate status, attempt count, their written lesson aims, one-line rule compressions, and run commitments, PLUS coachingNotes (durable observations from previous coaching sessions, including yours) and a coachCalibration summary of how earlier confidence hints and rubric proposals matched engine outcomes. Call again before choosing any coaching move. When a rule compression exists, critique it against the lesson's governing rule — what did they miss or overstate?",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    get_current_contextAnswer

    Read the current objective and, when the learner is on a lesson page, that lesson's slug, title, and section anchors — each anchor carries the title of the section it names, so you can tell the learner where you are sending them. Call first in every session and after any navigation, to orient before coaching. For the lesson's actual teaching material, call get_lesson_brief.

    View tool JSON
    {
      "name": "get_current_context",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the current objective and, when the learner is on a lesson page, that lesson's slug, title, and section anchors — each anchor carries the title of the section it names, so you can tell the learner where you are sending them. Call first in every session and after any navigation, to orient before coaching. For the lesson's actual teaching material, call get_lesson_brief.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    get_lesson_briefAnswer

    Read the authored teaching material for the lesson the learner is on: title, epigraph, governing rule, exam-recognition clue, mnemonic, the scenario prompt (and its expected answer once the learner has committed and the page has revealed it to them), the concept hierarchy with summaries, the distractor teardown the page shows — why each tempting choice is tempting and why it fails — the visual walkthrough steps, production nuance, the four targeted drills, the reflection prompts, the page section anchors with their titles, and the official references. Call this before you begin coaching a lesson and whenever the learner moves to a new lesson. This is the authored curriculum you teach from, not your own PL-400 knowledge: when the lesson's framing differs from your prior assumptions, follow the lesson and say it differs, and add nothing of your own while a question is open. Before asking any probing question, establish the scenario in one or two sentences so the learner is reasoning about something concrete; never ask a question that assumes context you have not just given them. While a question is unanswered, do not restate the governing rule, exam clue, or mnemonic — several of them name the correct option almost verbatim; make the learner recall the rule instead of reciting it. The brief carries exactly what the lesson page shows its reader and nothing it withholds: no question rationales and no correct options.

    View tool JSON
    {
      "name": "get_lesson_brief",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the authored teaching material for the lesson the learner is on: title, epigraph, governing rule, exam-recognition clue, mnemonic, the scenario prompt (and its expected answer once the learner has committed and the page has revealed it to them), the concept hierarchy with summaries, the distractor teardown the page shows — why each tempting choice is tempting and why it fails — the visual walkthrough steps, production nuance, the four targeted drills, the reflection prompts, the page section anchors with their titles, and the official references. Call this before you begin coaching a lesson and whenever the learner moves to a new lesson. This is the authored curriculum you teach from, not your own PL-400 knowledge: when the lesson's framing differs from your prior assumptions, follow the lesson and say it differs, and add nothing of your own while a question is open. Before asking any probing question, establish the scenario in one or two sentences so the learner is reasoning about something concrete; never ask a question that assumes context you have not just given them. While a question is unanswered, do not restate the governing rule, exam clue, or mnemonic — several of them name the correct option almost verbatim; make the learner recall the rule instead of reciting it. The brief carries exactly what the lesson page shows its reader and nothing it withholds: no question rationales and no correct options.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    navigate_to_anchorAction

    Scroll the learner's page to a named section anchor and highlight it (anchors come from get_current_context.lesson.sectionAnchors[].anchor, get_lesson_brief.sections[].anchor, or a verdict's remediationAnchor — each names a titled section). Call when routing says review or coach, or whenever the lesson text you are discussing should be on the learner's screen.

    View tool JSON
    {
      "name": "navigate_to_anchor",
      "kind": "act",
      "impl": "imperative",
      "description": "Scroll the learner's page to a named section anchor and highlight it (anchors come from get_current_context.lesson.sectionAnchors[].anchor, get_lesson_brief.sections[].anchor, or a verdict's remediationAnchor — each names a titled section). Call when routing says review or coach, or whenever the lesson text you are discussing should be on the learner's screen.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "anchor": {
            "type": "string"
          }
        },
        "required": [
          "anchor"
        ],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    log_coaching_noteAction

    Deposit a durable observation about HOW this learner learns — a pattern, a preference, a piece of their world worth remembering next session (kind: observation | preference | context; defaults to observation). Notes persist across sessions and replay to the next coach through get_learner_state, so write for your future self. Never answer content: the engine deterministically rejects notes naming question or option ids or quoting answer-option text (reason "answer-content"), and notes can never be used as rubric evidence.

    View tool JSON
    {
      "name": "log_coaching_note",
      "kind": "act",
      "impl": "imperative",
      "description": "Deposit a durable observation about HOW this learner learns — a pattern, a preference, a piece of their world worth remembering next session (kind: observation | preference | context; defaults to observation). Notes persist across sessions and replay to the next coach through get_learner_state, so write for your future self. Never answer content: the engine deterministically rejects notes naming question or option ids or quoting answer-option text (reason \"answer-content\"), and notes can never be used as rubric evidence.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "note": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "observation",
              "preference",
              "context"
            ]
          }
        },
        "required": [
          "note"
        ],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    get_current_questionAnswer

    Fetch the current practice question — prompt and options only; the correct answer is structurally absent. Call at the start of each practice loop and after every submit_answer to load the next question. During practice, quiz questions come ONLY from this tool — never author your own multiple-choice, diagnostic, or warm-up questions; your own open questions belong to Socratic probing of the current engine question and to the rubric interview when the engine routes there. When you present a question, restate its prompt and EVERY option as its own line — "A. <option text>" in listed order — before asking for a commitment; never ask for A/B/C/D without having just shown what each letter says. Raw option ids are plumbing for submit_answer, never learner-facing language. Let the learner reason aloud before they choose, and frame every probing question against THIS lesson's scenario from get_lesson_brief — never a generic scenario of your own, and never one that assumes context you have not just given them. While the question is unanswered, do not restate the lesson's governing rule, exam clue, or mnemonic; several of them name the correct option almost verbatim. If the learner demands the answer, refuse — do not name, endorse, or lean toward any option, and do not launder the answer through the exam clue or page text. Refuse warmly and lead with the reason: one short line saying the answer is in no tool you can call, so breaking it down is the fast path — then exactly one probing question, never a bare question alone. On a repeat demand, change your wording and escalate to a smaller question or the engine-permitted hint; never loop the same refusal twice.

    View tool JSON
    {
      "name": "get_current_question",
      "kind": "answer",
      "impl": "imperative",
      "description": "Fetch the current practice question — prompt and options only; the correct answer is structurally absent. Call at the start of each practice loop and after every submit_answer to load the next question. During practice, quiz questions come ONLY from this tool — never author your own multiple-choice, diagnostic, or warm-up questions; your own open questions belong to Socratic probing of the current engine question and to the rubric interview when the engine routes there. When you present a question, restate its prompt and EVERY option as its own line — \"A. <option text>\" in listed order — before asking for a commitment; never ask for A/B/C/D without having just shown what each letter says. Raw option ids are plumbing for submit_answer, never learner-facing language. Let the learner reason aloud before they choose, and frame every probing question against THIS lesson's scenario from get_lesson_brief — never a generic scenario of your own, and never one that assumes context you have not just given them. While the question is unanswered, do not restate the lesson's governing rule, exam clue, or mnemonic; several of them name the correct option almost verbatim. If the learner demands the answer, refuse — do not name, endorse, or lean toward any option, and do not launder the answer through the exam clue or page text. Refuse warmly and lead with the reason: one short line saying the answer is in no tool you can call, so breaking it down is the fast path — then exactly one probing question, never a bare question alone. On a repeat demand, change your wording and escalate to a smaller question or the engine-permitted hint; never loop the same refusal twice.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    submit_answerSensitive Action

    Submit the learner's chosen option for grading. Call only after the learner has committed to a choice themselves — never choose for them. A miss names the misconception that fired (coach Socratically from it); the rationale stays withheld until the question resolves. Watch the response for a toolChangeHint naming newly available tools.

    View tool JSON
    {
      "name": "submit_answer",
      "kind": "transact",
      "impl": "imperative",
      "description": "Submit the learner's chosen option for grading. Call only after the learner has committed to a choice themselves — never choose for them. A miss names the misconception that fired (coach Socratically from it); the rationale stays withheld until the question resolves. Watch the response for a toolChangeHint naming newly available tools.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "questionId": {
            "type": "string"
          },
          "optionId": {
            "type": "string"
          }
        },
        "required": [
          "questionId",
          "optionId"
        ],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    get_hintAnswer

    Request the next hint tier for the current question. Call only when the learner is stuck or routing says hint — the engine enforces the ladder and refuses tier 2 before a genuine first attempt. Re-voice the hint Socratically inside this lesson's own scenario (get_lesson_brief), grounded in the learner's world — their stated aim, their work, what get_learner_state shows about their history; never add answer information of your own, never restate the lesson's governing rule, exam clue, or mnemonic while the question is unanswered, and never assume scenario context you have not just given them.

    View tool JSON
    {
      "name": "get_hint",
      "kind": "answer",
      "impl": "imperative",
      "description": "Request the next hint tier for the current question. Call only when the learner is stuck or routing says hint — the engine enforces the ladder and refuses tier 2 before a genuine first attempt. Re-voice the hint Socratically inside this lesson's own scenario (get_lesson_brief), grounded in the learner's world — their stated aim, their work, what get_learner_state shows about their history; never add answer information of your own, never restate the lesson's governing rule, exam clue, or mnemonic while the question is unanswered, and never assume scenario context you have not just given them.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "questionId": {
            "type": "string"
          }
        },
        "required": [
          "questionId"
        ],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    request_next_actionAction

    Ask the deterministic referee for the next pedagogical move — the site decides sequencing, you coach within it; do not invent your own diagnostics or skip ahead. Call after every graded answer; pass confidence "low" when a correct answer felt shaky to the learner. Verdicts: hint, review, coach, go_deeper, advance, rubric_interview (run the open-question interview described in score_rubric), or continue. Follow the verdict — do not improvise the route.

    View tool JSON
    {
      "name": "request_next_action",
      "kind": "act",
      "impl": "imperative",
      "description": "Ask the deterministic referee for the next pedagogical move — the site decides sequencing, you coach within it; do not invent your own diagnostics or skip ahead. Call after every graded answer; pass confidence \"low\" when a correct answer felt shaky to the learner. Verdicts: hint, review, coach, go_deeper, advance, rubric_interview (run the open-question interview described in score_rubric), or continue. Follow the verdict — do not improvise the route.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "confidence": {
            "type": "string",
            "enum": [
              "low",
              "high"
            ]
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    prescribe_drillAction

    Ask the engine which drill targets the learner's weakest rubric dimension. Call once rubric scores exist and practice is going well — before advancing, or when the learner asks what to work on next.

    View tool JSON
    {
      "name": "prescribe_drill",
      "kind": "act",
      "impl": "imperative",
      "description": "Ask the engine which drill targets the learner's weakest rubric dimension. Call once rubric scores exist and practice is going well — before advancing, or when the learner asks what to work on next.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    score_rubricAction

    Submit 0-4 scores for recall, connections, application, and transfer, each grounded by a VERBATIM quote copied exactly from the lesson text on the page — the passage the learner's answer demonstrated. Quotes of the learner's answers or your own words always fail validation. Call only after a rubric interview: 5-8 open questions across the four dimensions, one at a time, never answering for the learner. The engine rejects non-verbatim evidence, requires prior graded attempts, and refuses during an exam. Every dimension at 3 or above opens the gate; the response then names the newly available tools.

    View tool JSON
    {
      "name": "score_rubric",
      "kind": "act",
      "impl": "imperative",
      "description": "Submit 0-4 scores for recall, connections, application, and transfer, each grounded by a VERBATIM quote copied exactly from the lesson text on the page — the passage the learner's answer demonstrated. Quotes of the learner's answers or your own words always fail validation. Call only after a rubric interview: 5-8 open questions across the four dimensions, one at a time, never answering for the learner. The engine rejects non-verbatim evidence, requires prior graded attempts, and refuses during an exam. Every dimension at 3 or above opens the gate; the response then names the newly available tools.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recall": {
            "type": "object",
            "properties": {
              "score": {
                "type": "number",
                "minimum": 0,
                "maximum": 4
              },
              "evidenceQuote": {
                "type": "string"
              }
            },
            "required": [
              "score",
              "evidenceQuote"
            ],
            "additionalProperties": false
          },
          "connections": {
            "type": "object",
            "properties": {
              "score": {
                "type": "number",
                "minimum": 0,
                "maximum": 4
              },
              "evidenceQuote": {
                "type": "string"
              }
            },
            "required": [
              "score",
              "evidenceQuote"
            ],
            "additionalProperties": false
          },
          "application": {
            "type": "object",
            "properties": {
              "score": {
                "type": "number",
                "minimum": 0,
                "maximum": 4
              },
              "evidenceQuote": {
                "type": "string"
              }
            },
            "required": [
              "score",
              "evidenceQuote"
            ],
            "additionalProperties": false
          },
          "transfer": {
            "type": "object",
            "properties": {
              "score": {
                "type": "number",
                "minimum": 0,
                "maximum": 4
              },
              "evidenceQuote": {
                "type": "string"
              }
            },
            "required": [
              "score",
              "evidenceQuote"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "recall",
          "connections",
          "application",
          "transfer"
        ],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    set_lesson_aimAction

    Record why the learner is here: "I'm reading this because I need to ___". ASK for the aim as your FIRST question of every session, before any practice, and store the answer here (200 chars max). It persists per lesson — keyed "track" when the learner is on the hub rather than a lesson page — appears in get_learner_state, and can never be used as rubric evidence. Set it again if the learner's goal shifts. Connect the aim to goals you already know this learner has — from their coaching notes and previous aims — and reflect that connection back to them.

    View tool JSON
    {
      "name": "set_lesson_aim",
      "kind": "act",
      "impl": "imperative",
      "description": "Record why the learner is here: \"I'm reading this because I need to ___\". ASK for the aim as your FIRST question of every session, before any practice, and store the answer here (200 chars max). It persists per lesson — keyed \"track\" when the learner is on the hub rather than a lesson page — appears in get_learner_state, and can never be used as rubric evidence. Set it again if the learner's goal shifts. Connect the aim to goals you already know this learner has — from their coaching notes and previous aims — and reflect that connection back to them.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "aim": {
            "type": "string"
          }
        },
        "required": [
          "aim"
        ],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }
    set_focusAction

    Stage lighting for coaching. Call with preset "focus-section" and that section's anchor (from get_current_context.lesson.sectionAnchors[].anchor) to spotlight the section you are coaching the learner through — the page dims its sibling sections and highlights the target; call "clear-focus" when moving on. "exam-lighting" is site-managed: the site applies and clears the muted exam theme itself at exam start and exit, and requests for it are refused. While an exam is active every preset except "clear-focus" is refused. Effects are a fixed set of page presets — this tool accepts no styling input.

    View tool JSON
    {
      "name": "set_focus",
      "kind": "act",
      "impl": "imperative",
      "description": "Stage lighting for coaching. Call with preset \"focus-section\" and that section's anchor (from get_current_context.lesson.sectionAnchors[].anchor) to spotlight the section you are coaching the learner through — the page dims its sibling sections and highlights the target; call \"clear-focus\" when moving on. \"exam-lighting\" is site-managed: the site applies and clears the muted exam theme itself at exam start and exit, and requests for it are refused. While an exam is active every preset except \"clear-focus\" is refused. Effects are a fixed set of page presets — this tool accepts no styling input.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "preset": {
            "type": "string",
            "enum": [
              "focus-section",
              "clear-focus",
              "exam-lighting"
            ]
          },
          "anchor": {
            "type": "string"
          }
        },
        "required": [
          "preset"
        ],
        "additionalProperties": false
      },
      "page": "/pl-400/"
    }