MCP
The same loopback server speaks the
Model Context Protocol at /mcp
(streamable HTTP, via the official MCP Rust SDK) — so Claude Code, Claude
Desktop, or any MCP client can drive Vindue as a tool.
Register
Claude Code:
claude mcp add --transport http vindue http://127.0.0.1:47725/mcp
Claude Desktop / Cursor / other clients: add an HTTP MCP server pointing
at http://127.0.0.1:47725/mcp (Settings → MCP servers; the URL is copyable
from Vindue's Settings → API section).
Then just ask: "Put Safari on the left half of my right monitor."
Tools
Settings + tiling; no UI control by design. The catalog below is generated
from the compiled Rust code — descriptions and parameter schemas exactly as
tools/list serves them to clients — and pinned by a CI drift gate, so it
cannot go stale.
| Tool | What it does | Parameters |
|---|---|---|
delete_shortcut | Remove a shortcut binding by its KeyboardEvent.code. Reports whether it existed. |
|
get_config | The full config: grid (rows, cols, windowGap, screenMargins), keybindings (openPanel hotkey; "" = none), shortcuts (assignment + keys), api (port, enabled). | none |
get_state | Everything about Vindue right now: Accessibility trust, the current target window (frontmost), all monitors with canonical labels, and the full config (grid, keybindings, shortcuts, api). Call this first. | none |
list_apps | Running apps that own windows: pid and name — pass either to tile_window's app parameter. | none |
list_monitors | All connected displays: canonical label (use these strings to target monitors — twins get positional suffixes like "(left)"/"(right)"), position, size, work area, and scale factor. | none |
list_shortcuts | The shortcuts config: assignment mode (pinned binds new shortcuts to the monitor they are created on; relative follows the panel's monitor) plus every key → { monitor, selection } binding. | none |
set_grid | Update the grid: rows/cols (1-12), windowGap and screenMargins (px 0-300). Only the fields passed change. Stored shortcuts that no longer fit are rescaled proportionally, and open panel/Settings views refresh. |
|
set_hotkey | Set or clear the global hotkey that opens the Vindue panel (e.g. "CommandOrControl+Alt+S"; "" = none). Registration fails if macOS or another app owns the combo — the error will say so. |
|
set_margins | Set screen margins (px 0-300) inset from each edge of every display's work area. |
|
set_shortcut | Create or update a keyboard shortcut that tiles the frontmost window into the given grid cells. Pass a monitor label from list_monitors (or index) to pin it to a display; omit monitor for a relative shortcut. |
|
set_shortcut_assignment | Set whether new shortcuts are "pinned" to the monitor they are created on or "relative" (following the panel's monitor). |
|
tile_window | Move and resize a window to a grid region. Presets: full, left_half, right_half, top_half, bottom_half, top_left, top_right, bottom_left, bottom_right — or pass explicit inclusive cells. Targets the frontmost window by default; pass an app name or pid for another app. The monitor defaults to the one holding the target window. |
|
Design notes
- One implementation, two protocols — every tool delegates to the exact same handler functions as the REST API
- Self-describing — the server advertises usage instructions in its
initializeresponse, so clients learn the workflow (checkget_state, use canonical labels, cells are inclusive) without docs - Same guard as REST — rmcp enforces its own loopback Host allowlist on every request; browsers can't reach it
Requirements
- Vindue running with
api.enabled(the default) - The Accessibility grant for
tile_windowto move windows (read-only tools work without it)
Walkthrough: Tile windows with Claude.