← WebMCP Directory

Tool tree

ryan-roemer.github.io

Media & PersonalTools verified
Website
WebMCP and web AI: the browser as an agent interface and runtime.
Explore capabilities
    get_slideAnswer

    Read one slide: its number, title, and every addressable piece of text on it with a short id (like 9.3), what kind of thing it is (title, bullet, sub-bullet, takeaway, code), and its wording. Defaults to the slide on screen. Use this first when asked to change, summarise, or describe 'this slide'. The ids it returns are what the editing tools take. Set notes to true to also read the presenter's private speaker notes, which are not shown to the audience.

    View tool JSON
    {
      "name": "get_slide",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read one slide: its number, title, and every addressable piece of text on it with a short id (like 9.3), what kind of thing it is (title, bullet, sub-bullet, takeaway, code), and its wording. Defaults to the slide on screen. Use this first when asked to change, summarise, or describe 'this slide'. The ids it returns are what the editing tools take. Set notes to true to also read the presenter's private speaker notes, which are not shown to the audience.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slide": {
            "type": "integer",
            "minimum": 1,
            "description": "Slide number, 1-based (the first slide is 1, not 0). Defaults to the slide on screen."
          },
          "notes": {
            "type": "boolean",
            "description": "Also return the presenter's private speaker notes. Most slides have them; the chapter dividers do not."
          }
        }
      },
      "page": "/the-frontend-strikes-back/?slideIndex=0&stepIndex=0"
    }
    get_deck_outlineAnswer

    List every slide in the deck: number, title, chapter, and whether it carries a code example. Use this to find which slide covers a topic before navigating, or to answer questions about the deck's shape. It does not include slide body text — use find_nodes with scope 'deck' for that.

    View tool JSON
    {
      "name": "get_deck_outline",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every slide in the deck: number, title, chapter, and whether it carries a code example. Use this to find which slide covers a topic before navigating, or to answer questions about the deck's shape. It does not include slide body text — use find_nodes with scope 'deck' for that.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "/the-frontend-strikes-back/?slideIndex=0&stepIndex=0"
    }
    find_nodesAnswer

    Find what matches a description and get the ids that name it. On one slide (the default) it accepts either wording from the slide ('the WebMCP bullet', 'One API') or a position ('the second bullet', 'the heading', 'the last sub-bullet'). With scope set to 'deck' it searches the text of every slide instead — use that for 'which slide covers X' or 'every slide that still says TODO'. Returns every match: one id when the description fits one thing, several when it fits several, and the slide's contents when it fits nothing.

    View tool JSON
    {
      "name": "find_nodes",
      "kind": "answer",
      "impl": "imperative",
      "description": "Find what matches a description and get the ids that name it. On one slide (the default) it accepts either wording from the slide ('the WebMCP bullet', 'One API') or a position ('the second bullet', 'the heading', 'the last sub-bullet'). With scope set to 'deck' it searches the text of every slide instead — use that for 'which slide covers X' or 'every slide that still says TODO'. Returns every match: one id when the description fits one thing, several when it fits several, and the slide's contents when it fits nothing.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "How a person would refer to it: quoted wording, or a position like 'the second bullet' (positions only work on a single slide)."
          },
          "slide": {
            "type": "integer",
            "minimum": 1,
            "description": "Slide number, 1-based (the first slide is 1, not 0). Defaults to the slide on screen."
          },
          "scope": {
            "type": "string",
            "enum": [
              "slide",
              "deck"
            ],
            "description": "'slide' searches one slide and understands positions. 'deck' searches every slide's text and ignores `slide`. Defaults to 'slide'."
          }
        },
        "required": [
          "query"
        ]
      },
      "page": "/the-frontend-strikes-back/?slideIndex=0&stepIndex=0"
    }
    go_to_slideAction

    Move the deck. Give `slide` to jump to a slide number (1-based), `title` to jump to the slide whose title has those words, `chapter` to jump to a chapter's first slide, or `move` to go somewhere relative to where the deck is now — next, previous, first, last, or one reveal forward or back within a slide that has them. Out-of-range slide numbers are clamped rather than refused, and at either end of the deck a relative move stays put.

    View tool JSON
    {
      "name": "go_to_slide",
      "kind": "act",
      "impl": "imperative",
      "description": "Move the deck. Give `slide` to jump to a slide number (1-based), `title` to jump to the slide whose title has those words, `chapter` to jump to a chapter's first slide, or `move` to go somewhere relative to where the deck is now — next, previous, first, last, or one reveal forward or back within a slide that has them. Out-of-range slide numbers are clamped rather than refused, and at either end of the deck a relative move stays put.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slide": {
            "type": "integer",
            "description": "Slide number, 1-based."
          },
          "title": {
            "type": "string",
            "description": "A word or two from the slide's title, like 'reebok'. Falls back to the slide's text when no title matches. Ignored when `slide` is given."
          },
          "chapter": {
            "type": "integer",
            "description": "Chapter number. Goes to that chapter's first slide. Ignored when `slide` or `title` is given."
          },
          "move": {
            "type": "string",
            "enum": [
              "next_step",
              "previous_step",
              "next",
              "previous",
              "first",
              "last"
            ],
            "description": "Where to move, relative to now. Ignored when `slide`, `title` or `chapter` is given."
          }
        }
      },
      "page": "/the-frontend-strikes-back/?slideIndex=0&stepIndex=0"
    }
    edit_textAction

    Change, replace or remove wording on the deck — `target` and `text` rewrite one piece of text completely, `find` and `text` replace a phrase wherever it appears, and `find` with an empty `text` deletes it. Identify a `target` by id (like 9.3) or by describing it ('the second bullet', 'the heading'). A `find` is scoped to one node when `target` is set, to one slide when `slide` is set, and to the whole deck when neither is. Replacing a phrase is the right choice when the text has inline code or emphasis in it, because it changes only the words matched and leaves the markup alone. Changes are live-only: they affect the running deck, not the source files, and undo_edits puts them back.

    View tool JSON
    {
      "name": "edit_text",
      "kind": "act",
      "impl": "imperative",
      "description": "Change, replace or remove wording on the deck — `target` and `text` rewrite one piece of text completely, `find` and `text` replace a phrase wherever it appears, and `find` with an empty `text` deletes it. Identify a `target` by id (like 9.3) or by describing it ('the second bullet', 'the heading'). A `find` is scoped to one node when `target` is set, to one slide when `slide` is set, and to the whole deck when neither is. Replacing a phrase is the right choice when the text has inline code or emphasis in it, because it changes only the words matched and leaves the markup alone. Changes are live-only: they affect the running deck, not the source files, and undo_edits puts them back.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "A node id like '9.3', or a description like 'the second bullet'. Omit to act on a whole slide or the whole deck."
          },
          "slide": {
            "type": "integer",
            "minimum": 1,
            "description": "Restrict a find-and-replace to this slide, 1-based. You do not have to be on it. Ignored when `target` is given."
          },
          "find": {
            "type": "string",
            "description": "The phrase to replace, matched anywhere it appears and case-insensitively. Omit to replace a target's whole wording instead."
          },
          "text": {
            "type": "string",
            "description": "The new wording — the whole text when there is no `find`, otherwise what to put in its place. An empty string (\"\") alongside a `find` deletes the phrase. Keep a piece of text under 140 characters or it overflows the slide."
          }
        },
        "required": [
          "text"
        ]
      },
      "page": "/the-frontend-strikes-back/?slideIndex=0&stepIndex=0"
    }
    style_nodeAction

    Restyle text on a slide — its colour, size, weight, alignment and so on — and a plural target like 'the bullets' or 'the takeaways' restyles the whole group in one call. Identify what to style by id (like 9.3) or by describing it ('the heading', 'the second bullet'). A description that names a group styles the whole group, so 'the bullets' or 'this list' restyles every bullet on the slide in one go. Give the styling as CSS declarations: "color: yellow", or "color: yellow; text-decoration: underline" to set several at once. You can set: color, background-color, font-size, font-weight, font-style, letter-spacing, line-height, text-align, text-transform, text-decoration, opacity, border-radius, display, visibility. Relative sizes like 'bigger' are resolved against the element's real size, and the receipt reports the value the slide actually got. To hide something use "display: none" or "visibility: hidden" — nothing is ever removed, so undo_edits brings it straight back. A value the browser will not accept is refused rather than silently dropped.

    View tool JSON
    {
      "name": "style_node",
      "kind": "act",
      "impl": "imperative",
      "description": "Restyle text on a slide — its colour, size, weight, alignment and so on — and a plural target like 'the bullets' or 'the takeaways' restyles the whole group in one call. Identify what to style by id (like 9.3) or by describing it ('the heading', 'the second bullet'). A description that names a group styles the whole group, so 'the bullets' or 'this list' restyles every bullet on the slide in one go. Give the styling as CSS declarations: \"color: yellow\", or \"color: yellow; text-decoration: underline\" to set several at once. You can set: color, background-color, font-size, font-weight, font-style, letter-spacing, line-height, text-align, text-transform, text-decoration, opacity, border-radius, display, visibility. Relative sizes like 'bigger' are resolved against the element's real size, and the receipt reports the value the slide actually got. To hide something use \"display: none\" or \"visibility: hidden\" — nothing is ever removed, so undo_edits brings it straight back. A value the browser will not accept is refused rather than silently dropped.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "A node id like '9.3', or a description like 'the heading' or 'the bullets'."
          },
          "style": {
            "type": "string",
            "description": "CSS declarations, e.g. 'color: yellow' or 'color: yellow; text-decoration: underline'. For font-size, 'bigger' and 'smaller' also work."
          }
        },
        "required": [
          "target",
          "style"
        ]
      },
      "page": "/the-frontend-strikes-back/?slideIndex=0&stepIndex=0"
    }
    set_deck_variableAction

    Change one of the deck's theme colours, either for the current chapter or across the whole deck — `--chapter-accent` is the main one. These drive the accent colour, surfaces and hairlines that every slide is built from, so one change is visible everywhere.

    View tool JSON
    {
      "name": "set_deck_variable",
      "kind": "act",
      "impl": "imperative",
      "description": "Change one of the deck's theme colours, either for the current chapter or across the whole deck — `--chapter-accent` is the main one. These drive the accent colour, surfaces and hairlines that every slide is built from, so one change is visible everywhere.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "enum": [
              "--chapter-accent",
              "--chapter-accent-base",
              "--surface-1",
              "--surface-2",
              "--hairline",
              "--muted"
            ],
            "description": "Which theme variable."
          },
          "value": {
            "type": "string",
            "description": "A CSS colour, e.g. 'orange' or '#ff8800'."
          },
          "scope": {
            "type": "string",
            "enum": [
              "deck",
              "chapter"
            ],
            "description": "'deck' changes it everywhere; 'chapter' only for the chapter the deck is on."
          }
        },
        "required": [
          "name",
          "value",
          "scope"
        ]
      },
      "page": "/the-frontend-strikes-back/?slideIndex=0&stepIndex=0"
    }
    undo_editsAction

    Put changes back. 'last' undoes the most recent change — a find-and-replace counts as one change however many places it touched. 'slide' undoes everything changed on one slide and leaves the rest of the deck alone. 'all' returns the whole deck to exactly how it shipped. Navigation is not a change, so this never moves the deck.

    View tool JSON
    {
      "name": "undo_edits",
      "kind": "act",
      "impl": "imperative",
      "description": "Put changes back. 'last' undoes the most recent change — a find-and-replace counts as one change however many places it touched. 'slide' undoes everything changed on one slide and leaves the rest of the deck alone. 'all' returns the whole deck to exactly how it shipped. Navigation is not a change, so this never moves the deck.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "enum": [
              "last",
              "slide",
              "all"
            ],
            "description": "How much to put back. Defaults to 'last'."
          },
          "slide": {
            "type": "integer",
            "minimum": 1,
            "description": "Which slide to revert, 1-based. Only read when scope is 'slide'; defaults to the slide on screen."
          }
        }
      },
      "page": "/the-frontend-strikes-back/?slideIndex=0&stepIndex=0"
    }