← WebMCP Directory

Tool tree

remap-xi.vercel.app

Developer ToolsTools verified
Website
Your keyboard's best friend
Explore capabilities
    get_keyboard_stateAnswer

    Get the currently connected keyboard: its name, protocol version, layer count, active layer, and layout options. Call this first to see what keyboard (if any) is connected before using other keymap tools.

    View tool JSON
    {
      "name": "get_keyboard_state",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the currently connected keyboard: its name, protocol version, layer count, active layer, and layout options. Call this first to see what keyboard (if any) is connected before using other keymap tools.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    get_keymapAnswer

    Get the keycodes assigned to every key position (as human-readable QMK keycode strings like "KC_A") for one layer, or all layers if none is given. Each entry's array index is the "keyIndex" used by remap_key and propose_remap.

    View tool JSON
    {
      "name": "get_keymap",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the keycodes assigned to every key position (as human-readable QMK keycode strings like \"KC_A\") for one layer, or all layers if none is given. Each entry's array index is the \"keyIndex\" used by remap_key and propose_remap.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "layer": {
            "type": "number",
            "description": "Layer index to read; omit to read every layer."
          }
        },
        "additionalProperties": false
      }
    }
    remap_keyAction

    Assign a QMK keycode (e.g. "KC_A", "KC_LSFT", "MO(1)") to one key position on a layer. keyIndex is the position in the array returned by get_keymap. Switches the active layer first if it differs from the requested one, so the change is visible on screen. For changing several keys together as one reviewable set, use propose_remap instead.

    View tool JSON
    {
      "name": "remap_key",
      "kind": "act",
      "impl": "imperative",
      "description": "Assign a QMK keycode (e.g. \"KC_A\", \"KC_LSFT\", \"MO(1)\") to one key position on a layer. keyIndex is the position in the array returned by get_keymap. Switches the active layer first if it differs from the requested one, so the change is visible on screen. For changing several keys together as one reviewable set, use propose_remap instead.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "layer": {
            "type": "number",
            "description": "Target layer index."
          },
          "keyIndex": {
            "type": "number",
            "description": "Key position index, from get_keymap."
          },
          "keycode": {
            "type": "string",
            "description": "QMK keycode string, e.g. \"KC_A\"."
          }
        },
        "required": [
          "layer",
          "keyIndex",
          "keycode"
        ],
        "additionalProperties": false
      }
    }
    set_active_layerAction

    Switch the keyboard configurator UI to show a different layer.

    View tool JSON
    {
      "name": "set_active_layer",
      "kind": "act",
      "impl": "imperative",
      "description": "Switch the keyboard configurator UI to show a different layer.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "layer": {
            "type": "number"
          }
        },
        "required": [
          "layer"
        ],
        "additionalProperties": false
      }
    }
    list_available_keycodesAnswer

    List QMK keycodes supported by the connected keyboard, for use with remap_key and propose_remap. Use "search" to filter (e.g. "shift", "KC_F") since the full list can be large.

    View tool JSON
    {
      "name": "list_available_keycodes",
      "kind": "answer",
      "impl": "imperative",
      "description": "List QMK keycodes supported by the connected keyboard, for use with remap_key and propose_remap. Use \"search\" to filter (e.g. \"shift\", \"KC_F\") since the full list can be large.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "search": {
            "type": "string",
            "description": "Substring filter, optional."
          },
          "limit": {
            "type": "number",
            "description": "Max results to return, default 60."
          }
        },
        "additionalProperties": false
      }
    }
    save_keymap_snapshotAction

    Export the full keymap (every layer) and macros as a JSON snapshot the agent can hand back to the user or restore later with load_keymap_snapshot.

    View tool JSON
    {
      "name": "save_keymap_snapshot",
      "kind": "act",
      "impl": "imperative",
      "description": "Export the full keymap (every layer) and macros as a JSON snapshot the agent can hand back to the user or restore later with load_keymap_snapshot.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    load_keymap_snapshotAction

    Overwrite the entire keymap (all layers) and macros from a JSON snapshot produced by save_keymap_snapshot. This replaces every key on the keyboard, so it requires user confirmation.

    View tool JSON
    {
      "name": "load_keymap_snapshot",
      "kind": "act",
      "impl": "imperative",
      "description": "Overwrite the entire keymap (all layers) and macros from a JSON snapshot produced by save_keymap_snapshot. This replaces every key on the keyboard, so it requires user confirmation.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "vendorProductId": {
            "type": "number"
          },
          "layers": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "macros": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "vendorProductId",
          "layers"
        ],
        "additionalProperties": false
      }
    }
    get_lighting_stateAnswer

    Read the current RGB/backlight state of the connected keyboard: raw values for v2 keyboards, or the list of controllable lighting/custom options (with current values) for v3+ keyboards.

    View tool JSON
    {
      "name": "get_lighting_state",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the current RGB/backlight state of the connected keyboard: raw values for v2 keyboards, or the list of controllable lighting/custom options (with current values) for v3+ keyboards.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    set_lighting_valueAction

    Set a raw backlight/RGB value on a v2-protocol keyboard. "command" is a LightingValue name such as "BACKLIGHT_BRIGHTNESS", "BACKLIGHT_EFFECT", "QMK_RGBLIGHT_COLOR", or "BACKLIGHT_COLOR_1". "values" is the raw byte payload (e.g. [hue, saturation] for a color, [level] for brightness/effect). Use get_lighting_state first to see supported commands. Only works on v2 keyboards -- use set_custom_menu_option for v3.

    View tool JSON
    {
      "name": "set_lighting_value",
      "kind": "act",
      "impl": "imperative",
      "description": "Set a raw backlight/RGB value on a v2-protocol keyboard. \"command\" is a LightingValue name such as \"BACKLIGHT_BRIGHTNESS\", \"BACKLIGHT_EFFECT\", \"QMK_RGBLIGHT_COLOR\", or \"BACKLIGHT_COLOR_1\". \"values\" is the raw byte payload (e.g. [hue, saturation] for a color, [level] for brightness/effect). Use get_lighting_state first to see supported commands. Only works on v2 keyboards -- use set_custom_menu_option for v3.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "command": {
            "type": "string"
          },
          "values": {
            "type": "array",
            "items": {
              "type": "number"
            }
          }
        },
        "required": [
          "command",
          "values"
        ],
        "additionalProperties": false
      }
    }
    set_custom_menu_optionAction

    Set a keyboard-defined "custom menu" option on a v3+ keyboard, identified by the "id" returned from get_lighting_state (covers RGB and other firmware-defined settings). "value" is the logical value within the option's [min, max] range.

    View tool JSON
    {
      "name": "set_custom_menu_option",
      "kind": "act",
      "impl": "imperative",
      "description": "Set a keyboard-defined \"custom menu\" option on a v3+ keyboard, identified by the \"id\" returned from get_lighting_state (covers RGB and other firmware-defined settings). \"value\" is the logical value within the option's [min, max] range.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "value": {
            "type": "number"
          }
        },
        "required": [
          "id",
          "value"
        ],
        "additionalProperties": false
      }
    }
    get_macro_capabilitiesAnswer

    Check whether this keyboard supports macros at all, how many slots it has, the buffer size in bytes, and whether explicit delays are supported in macro expressions. Call this before authoring a long or delay-using macro.

    View tool JSON
    {
      "name": "get_macro_capabilities",
      "kind": "answer",
      "impl": "imperative",
      "description": "Check whether this keyboard supports macros at all, how many slots it has, the buffer size in bytes, and whether explicit delays are supported in macro expressions. Call this before authoring a long or delay-using macro.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    list_macrosAnswer

    List every macro slot and its current expression text (empty string means unassigned).

    View tool JSON
    {
      "name": "list_macros",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every macro slot and its current expression text (empty string means unassigned).",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    set_macroAction

    Set the expression for one macro slot, e.g. "KC_H,KC_I,KC_LSFT(KC_1)". Use list_macros to see available slot indices and the expression syntax already in use.

    View tool JSON
    {
      "name": "set_macro",
      "kind": "act",
      "impl": "imperative",
      "description": "Set the expression for one macro slot, e.g. \"KC_H,KC_I,KC_LSFT(KC_1)\". Use list_macros to see available slot indices and the expression syntax already in use.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "index": {
            "type": "number"
          },
          "expression": {
            "type": "string"
          }
        },
        "required": [
          "index",
          "expression"
        ],
        "additionalProperties": false
      }
    }
    clear_macroAction

    Clear one macro slot back to empty.

    View tool JSON
    {
      "name": "clear_macro",
      "kind": "act",
      "impl": "imperative",
      "description": "Clear one macro slot back to empty.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "index": {
            "type": "number"
          }
        },
        "required": [
          "index"
        ],
        "additionalProperties": false
      }
    }
    get_layout_optionsAnswer

    Get the physical layout option labels and their currently selected values (e.g. index 0 of a "Bottom Row" option meaning ANSI vs ISO).

    View tool JSON
    {
      "name": "get_layout_options",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the physical layout option labels and their currently selected values (e.g. index 0 of a \"Bottom Row\" option meaning ANSI vs ISO).",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    set_layout_optionAction

    Set one physical layout option to a new value, from the list returned by get_layout_options.

    View tool JSON
    {
      "name": "set_layout_option",
      "kind": "act",
      "impl": "imperative",
      "description": "Set one physical layout option to a new value, from the list returned by get_layout_options.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "optionIndex": {
            "type": "number"
          },
          "value": {
            "type": "number"
          }
        },
        "required": [
          "optionIndex",
          "value"
        ],
        "additionalProperties": false
      }
    }
    remap_encoderAction

    Assign a QMK keycode to a rotary encoder's clockwise or counter-clockwise rotation on a given layer.

    View tool JSON
    {
      "name": "remap_encoder",
      "kind": "act",
      "impl": "imperative",
      "description": "Assign a QMK keycode to a rotary encoder's clockwise or counter-clockwise rotation on a given layer.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "layer": {
            "type": "number"
          },
          "encoderIndex": {
            "type": "number"
          },
          "direction": {
            "type": "string",
            "enum": [
              "cw",
              "ccw"
            ]
          },
          "keycode": {
            "type": "string"
          }
        },
        "required": [
          "layer",
          "encoderIndex",
          "direction",
          "keycode"
        ],
        "additionalProperties": false
      }
    }
    navigate_to_paneAction

    Switch the app's top-level view. Available panes: default, test, design, console, settings, debug, errors.

    View tool JSON
    {
      "name": "navigate_to_pane",
      "kind": "act",
      "impl": "imperative",
      "description": "Switch the app's top-level view. Available panes: default, test, design, console, settings, debug, errors.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "pane": {
            "type": "string",
            "enum": [
              "default",
              "test",
              "design",
              "console",
              "settings",
              "debug",
              "errors"
            ]
          }
        },
        "required": [
          "pane"
        ],
        "additionalProperties": false
      }
    }
    switch_configure_tabAction

    Switch the sub-tab within the Configure pane (Keymap/Lighting/Macros/Layouts/Save + Load). Navigates to the Configure pane first if needed. Not every tab is available on every keyboard.

    View tool JSON
    {
      "name": "switch_configure_tab",
      "kind": "act",
      "impl": "imperative",
      "description": "Switch the sub-tab within the Configure pane (Keymap/Lighting/Macros/Layouts/Save + Load). Navigates to the Configure pane first if needed. Not every tab is available on every keyboard.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tab": {
            "type": "string",
            "enum": [
              "Keymap",
              "Lighting",
              "Macros",
              "Layouts",
              "Save + Load"
            ]
          }
        },
        "required": [
          "tab"
        ],
        "additionalProperties": false
      }
    }
    reset_eepromSensitive Action

    Erase the keyboard's saved settings (keymap, macros, lighting) back to firmware defaults. Irreversible -- requires user confirmation.

    View tool JSON
    {
      "name": "reset_eeprom",
      "kind": "transact",
      "impl": "imperative",
      "description": "Erase the keyboard's saved settings (keymap, macros, lighting) back to firmware defaults. Irreversible -- requires user confirmation.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    jump_to_bootloaderAction

    Reboot the keyboard into its firmware bootloader for reflashing. The keyboard will disconnect. Requires user confirmation.

    View tool JSON
    {
      "name": "jump_to_bootloader",
      "kind": "act",
      "impl": "imperative",
      "description": "Reboot the keyboard into its firmware bootloader for reflashing. The keyboard will disconnect. Requires user confirmation.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    propose_remapAction

    Propose a set of key changes for a person to review, across one or more keys. This writes nothing to the keyboard. It returns a proposal_id, the exact before and after for every key, and any collisions found against what is already bound. Every change needs its own reason in plain language, because that reason is what the person reviewing it is actually evaluating. Use this for anything touching more than one key; for a single key, use remap_key directly instead.

    View tool JSON
    {
      "name": "propose_remap",
      "kind": "act",
      "impl": "imperative",
      "description": "Propose a set of key changes for a person to review, across one or more keys. This writes nothing to the keyboard. It returns a proposal_id, the exact before and after for every key, and any collisions found against what is already bound. Every change needs its own reason in plain language, because that reason is what the person reviewing it is actually evaluating. Use this for anything touching more than one key; for a single key, use remap_key directly instead.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "rationale": {
            "type": "string",
            "description": "One or two sentences on what this set of changes is for, as a whole."
          },
          "changes": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "properties": {
                "layer": {
                  "type": "integer"
                },
                "keyIndex": {
                  "type": "integer",
                  "description": "From get_keymap."
                },
                "keycode": {
                  "type": "string",
                  "description": "e.g. \"KC_ESC\", \"MO(1)\"."
                },
                "reason": {
                  "type": "string",
                  "description": "Why this specific key moves."
                }
              },
              "required": [
                "layer",
                "keyIndex",
                "keycode",
                "reason"
              ]
            }
          }
        },
        "required": [
          "rationale",
          "changes"
        ],
        "additionalProperties": false
      }
    }
    get_proposalAnswer

    Check what happened to a proposal from propose_remap: still waiting, approved, rejected, written, or reverted.

    View tool JSON
    {
      "name": "get_proposal",
      "kind": "answer",
      "impl": "imperative",
      "description": "Check what happened to a proposal from propose_remap: still waiting, approved, rejected, written, or reverted.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposal_id": {
            "type": "string"
          }
        },
        "required": [
          "proposal_id"
        ],
        "additionalProperties": false
      }
    }
    list_connected_devicesAnswer

    List every keyboard this browser currently has WebHID access to: which one is active, which are connected but not selected, and which were seen but could not be used (no definition found, or an unsupported protocol). Pairing a new device is not possible from a tool -- the human has to click "Authorize device" -- but this tells an agent what is already available.

    View tool JSON
    {
      "name": "list_connected_devices",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every keyboard this browser currently has WebHID access to: which one is active, which are connected but not selected, and which were seen but could not be used (no definition found, or an unsupported protocol). Pairing a new device is not possible from a tool -- the human has to click \"Authorize device\" -- but this tells an agent what is already available.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    select_deviceAction

    Make a different already-connected keyboard the active one, by path from list_connected_devices. All other tools (keymap, lighting, macros, ...) act on whichever device is active.

    View tool JSON
    {
      "name": "select_device",
      "kind": "act",
      "impl": "imperative",
      "description": "Make a different already-connected keyboard the active one, by path from list_connected_devices. All other tools (keymap, lighting, macros, ...) act on whichever device is active.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "additionalProperties": false
      }
    }
    list_custom_controlsAnswer

    List every keyboard-defined custom setting (toggle, dropdown, button, color, range, or keycode) with its type, label, options, and current value. Covers whatever the keyboard's own firmware definition exposes beyond the keymap -- often lighting, but also anything else the maker defined. Use "id" from here with set_custom_control.

    View tool JSON
    {
      "name": "list_custom_controls",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every keyboard-defined custom setting (toggle, dropdown, button, color, range, or keycode) with its type, label, options, and current value. Covers whatever the keyboard's own firmware definition exposes beyond the keymap -- often lighting, but also anything else the maker defined. Use \"id\" from here with set_custom_control.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    set_custom_controlAction

    Set one keyboard-defined custom control, by "id" from list_custom_controls. The shape of "value" depends on the control's type: toggle wants a boolean, dropdown wants the option's label (string) or explicit value (number), button wants no value at all, color wants {hue, sat} (each 0-255), range and keycode want a single number or keycode string respectively -- list_custom_controls tells you which.

    View tool JSON
    {
      "name": "set_custom_control",
      "kind": "act",
      "impl": "imperative",
      "description": "Set one keyboard-defined custom control, by \"id\" from list_custom_controls. The shape of \"value\" depends on the control's type: toggle wants a boolean, dropdown wants the option's label (string) or explicit value (number), button wants no value at all, color wants {hue, sat} (each 0-255), range and keycode want a single number or keycode string respectively -- list_custom_controls tells you which.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "value": {}
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      }
    }
    get_per_key_rgbAnswer

    Read the individual RGB color (hue, saturation, each 0-255) of every key that has its own addressable LED. Only meaningful on v3+ keyboards with per-key lighting; returns an empty list otherwise.

    View tool JSON
    {
      "name": "get_per_key_rgb",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the individual RGB color (hue, saturation, each 0-255) of every key that has its own addressable LED. Only meaningful on v3+ keyboards with per-key lighting; returns an empty list otherwise.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    set_per_key_rgbAction

    Set the RGB color of one key with its own addressable LED, by keyIndex from get_keymap. hue and sat are each 0-255. Only works on v3+ keyboards with per-key lighting.

    View tool JSON
    {
      "name": "set_per_key_rgb",
      "kind": "act",
      "impl": "imperative",
      "description": "Set the RGB color of one key with its own addressable LED, by keyIndex from get_keymap. hue and sat are each 0-255. Only works on v3+ keyboards with per-key lighting.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "keyIndex": {
            "type": "number"
          },
          "hue": {
            "type": "number"
          },
          "sat": {
            "type": "number"
          }
        },
        "required": [
          "keyIndex",
          "hue",
          "sat"
        ],
        "additionalProperties": false
      }
    }
    get_custom_colorsAnswer

    Read the v2-protocol custom color palette (the small set of saved colors some boards offer, indexed 0..N) as a list of {index, hue, sat}.

    View tool JSON
    {
      "name": "get_custom_colors",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the v2-protocol custom color palette (the small set of saved colors some boards offer, indexed 0..N) as a list of {index, hue, sat}.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    set_custom_colorAction

    Set one entry in the v2-protocol custom color palette, by index. hue and sat are each 0-255.

    View tool JSON
    {
      "name": "set_custom_color",
      "kind": "act",
      "impl": "imperative",
      "description": "Set one entry in the v2-protocol custom color palette, by index. hue and sat are each 0-255.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "index": {
            "type": "number"
          },
          "hue": {
            "type": "number"
          },
          "sat": {
            "type": "number"
          }
        },
        "required": [
          "index",
          "hue",
          "sat"
        ],
        "additionalProperties": false
      }
    }
    get_app_settingsAnswer

    Read the configurator app's own display preferences: theme (light/dark), theme name, keyboard render mode (2D/3D), and macro editor behavior. This is about the app, not the connected keyboard.

    View tool JSON
    {
      "name": "get_app_settings",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the configurator app's own display preferences: theme (light/dark), theme name, keyboard render mode (2D/3D), and macro editor behavior. This is about the app, not the connected keyboard.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    set_theme_modeAction

    Switch the app between light and dark mode.

    View tool JSON
    {
      "name": "set_theme_mode",
      "kind": "act",
      "impl": "imperative",
      "description": "Switch the app between light and dark mode.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ]
          }
        },
        "required": [
          "mode"
        ],
        "additionalProperties": false
      }
    }
    set_render_modeAction

    Switch the on-screen keyboard between a 2D and 3D render. Falls back to 2D automatically if this browser doesn't support WebGL.

    View tool JSON
    {
      "name": "set_render_mode",
      "kind": "act",
      "impl": "imperative",
      "description": "Switch the on-screen keyboard between a 2D and 3D render. Falls back to 2D automatically if this browser doesn't support WebGL.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "2D",
              "3D"
            ]
          }
        },
        "required": [
          "mode"
        ],
        "additionalProperties": false
      }
    }
    get_app_errorsAnswer

    Read the app's internal error log -- failed HID commands, device-loading retries, and similar. Useful for diagnosing "why didn't that work" without asking the person to open DevTools.

    View tool JSON
    {
      "name": "get_app_errors",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the app's internal error log -- failed HID commands, device-loading retries, and similar. Useful for diagnosing \"why didn't that work\" without asking the person to open DevTools.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    clear_app_errorsAction

    Clear the app's internal error log.

    View tool JSON
    {
      "name": "clear_app_errors",
      "kind": "act",
      "impl": "imperative",
      "description": "Clear the app's internal error log.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    get_activity_logAnswer

    Read this agent's own recent tool calls -- name, input, result or error, and timing -- the same feed shown in the Agent Dock's Activity tab. Lets an agent check what it already did instead of relying on conversation memory, e.g. after a page reload mid-task.

    View tool JSON
    {
      "name": "get_activity_log",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read this agent's own recent tool calls -- name, input, result or error, and timing -- the same feed shown in the Agent Dock's Activity tab. Lets an agent check what it already did instead of relying on conversation memory, e.g. after a page reload mid-task.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number",
            "description": "Max entries to return, newest first. Default 20."
          }
        },
        "additionalProperties": false
      }
    }
    get_host_keyboard_layoutAnswer

    Read the OS keyboard layout the app assumes when showing keycodes (e.g. "keymap_us"). This affects display only, not what's written to the device.

    View tool JSON
    {
      "name": "get_host_keyboard_layout",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the OS keyboard layout the app assumes when showing keycodes (e.g. \"keymap_us\"). This affects display only, not what's written to the device.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    set_host_keyboard_layoutAction

    Set the OS keyboard layout the app assumes for display purposes (e.g. "keymap_us", "keymap_uk", "keymap_dvorak"). Does not change anything on the device itself.

    View tool JSON
    {
      "name": "set_host_keyboard_layout",
      "kind": "act",
      "impl": "imperative",
      "description": "Set the OS keyboard layout the app assumes for display purposes (e.g. \"keymap_us\", \"keymap_uk\", \"keymap_dvorak\"). Does not change anything on the device itself.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "layout": {
            "type": "string"
          }
        },
        "required": [
          "layout"
        ],
        "additionalProperties": false
      }
    }
    set_test_keyboard_soundAction

    Configure the app's own audio feedback for the Key Tester (a synthesized tone per keypress, played by the browser -- not the physical keyboard). Omit any field to leave it unchanged.

    View tool JSON
    {
      "name": "set_test_keyboard_sound",
      "kind": "act",
      "impl": "imperative",
      "description": "Configure the app's own audio feedback for the Key Tester (a synthesized tone per keypress, played by the browser -- not the physical keyboard). Omit any field to leave it unchanged.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "isEnabled": {
            "type": "boolean"
          },
          "volume": {
            "type": "number",
            "description": "0-100."
          },
          "waveform": {
            "type": "string",
            "enum": [
              "sine",
              "square",
              "sawtooth",
              "triangle"
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "Random",
              "WickiHayden",
              "Chromatic"
            ]
          },
          "transpose": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    }
    get_definitionAnswer

    Get the physical layout of every key: its position/size in key units (x, y, w, h, rotation), its firmware matrix position (row, col), and the keycode currently bound to it on the given layer. Use this instead of get_keymap when the request is spatial (e.g. "the key left of spacebar") rather than by keyIndex.

    View tool JSON
    {
      "name": "get_definition",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the physical layout of every key: its position/size in key units (x, y, w, h, rotation), its firmware matrix position (row, col), and the keycode currently bound to it on the given layer. Use this instead of get_keymap when the request is spatial (e.g. \"the key left of spacebar\") rather than by keyIndex.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "layer": {
            "type": "number",
            "description": "Layer to resolve keycodes against. Default 0."
          }
        },
        "additionalProperties": false
      }
    }
    diagnose_matrixAction

    Read the live physical switch matrix from the device -- which row/col positions are electrically closed right now. Real-time, not related to what keycodes are assigned; use it to check for a stuck key or a wiring problem, not to read the keymap.

    View tool JSON
    {
      "name": "diagnose_matrix",
      "kind": "act",
      "impl": "imperative",
      "description": "Read the live physical switch matrix from the device -- which row/col positions are electrically closed right now. Real-time, not related to what keycodes are assigned; use it to check for a stuck key or a wiring problem, not to read the keymap.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }
    get_device_infoAnswer

    Read device identity and health: QMK firmware version, VIA keycodes protocol version (both cached from connection time), and live uptime in milliseconds (a fresh read).

    View tool JSON
    {
      "name": "get_device_info",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read device identity and health: QMK firmware version, VIA keycodes protocol version (both cached from connection time), and live uptime in milliseconds (a fresh read).",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    }