{"_id":"@boarderless/mcp-server","_rev":"5-b5b502fce18a931d7c26229ba358ac15","name":"@boarderless/mcp-server","dist-tags":{"latest":"0.1.28"},"versions":{"0.1.26":{"name":"@boarderless/mcp-server","version":"0.1.26","keywords":["mcp","model-context-protocol","boarderless","spatial-canvas","puppeteer","agentic-ui"],"author":{"name":"Boarderless"},"license":"Apache-2.0","_id":"@boarderless/mcp-server@0.1.26","maintainers":[{"name":"boarderlessapp-publisher","email":"info@boarderless.app"}],"homepage":"https://boarderless.app/","bugs":{"url":"https://github.com/CrackenReleased/boarderless.app_MCP/issues"},"bin":{"boarderless-mcp-server":"src/mcp-stdio-server.js"},"dist":{"shasum":"9fb5a55ecf478dac09cf49e1755e83814d6a8722","tarball":"https://registry.npmjs.org/@boarderless/mcp-server/-/mcp-server-0.1.26.tgz","fileCount":12,"integrity":"sha512-vk3UuFCiLAAnQEQ1+uFAljuXaja150p4LJaTfY8hzOJIYBc+uUKK4s0YneSJH5aa0mCf8WKKBaW+ETVeF/cQXA==","signatures":[{"sig":"MEQCIA3sowA4DKx5i68cbw+7pAFHeHT4zPb9gGfcOmRMIddTAiBePOOpaznw19l4BSWu3zK6/sIZf+t2EgKaccMlcVpUzA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142237},"main":"src/mcp-stdio-server.js","type":"module","engines":{"node":">=18"},"gitHead":"85fa0b91f305230d5f54bbf2fe40207027bc83e0","scripts":{"test":"node src/verify_shortcut.js && node src/verify_nonblocking_auth.js && node src/verify_board_files.js && node src/verify_package_contents.js","setup":"node src/setup.js","start":"node src/mcp-stdio-server.js","tauri":"tauri","example":"node src/index.js","verify:status":"node src/verify_nonblocking_auth.js","verify:package":"node src/verify_package_contents.js","verify:board-files":"node src/verify_board_files.js"},"_npmUser":{"name":"boarderlessapp-publisher","email":"info@boarderless.app"},"repository":{"url":"git+https://github.com/CrackenReleased/boarderless.app_MCP.git","type":"git"},"_npmVersion":"11.16.0","description":"Model Context Protocol (MCP) server for Boarderless, allowing Ai agents to read the canvas state, mutate Objects, and calculate export bounds.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"jimp":"^0.22.12","heic-convert":"^2.1.0","puppeteer-core":"^22.0.0","@modelcontextprotocol/sdk":"^0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@tauri-apps/cli":"^2.11.2"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.26_1783046106380_0.5272824503247278","host":"s3://npm-registry-packages-npm-production"}},"0.1.27":{"name":"@boarderless/mcp-server","version":"0.1.27","keywords":["mcp","model-context-protocol","boarderless","spatial-canvas","puppeteer","agentic-ui"],"author":{"name":"Boarderless"},"license":"Apache-2.0","_id":"@boarderless/mcp-server@0.1.27","maintainers":[{"name":"boarderlessapp-publisher","email":"info@boarderless.app"}],"homepage":"https://boarderless.app/","bugs":{"url":"https://github.com/CrackenReleased/boarderless.app_MCP/issues"},"bin":{"boarderless-mcp-server":"src/mcp-stdio-server.js"},"dist":{"shasum":"3d9f716aef5dac41b61fd0a2b099ca9847544c5a","tarball":"https://registry.npmjs.org/@boarderless/mcp-server/-/mcp-server-0.1.27.tgz","fileCount":12,"integrity":"sha512-Op0tY4K899mxJwdPFRaeZxSEdyFVECRQd752E4QuSgnHirOhUbZR1AEroJBYaHog5PEE032EFlQbnWgC2834Xg==","signatures":[{"sig":"MEUCIQCmoul+KBsFxyUStJz4UA34nANyj57vsO55nECbDXnZxAIgaWm+GNFxZoULDbw+NFNE6ycf7sNf0eJNnKAbbcn81gg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156091},"main":"src/mcp-stdio-server.js","type":"module","engines":{"node":">=18"},"gitHead":"d60a117035765f054343b030cb836cfd281e1af5","scripts":{"test":"node src/verify_shortcut.js && node src/verify_nonblocking_auth.js && node src/verify_board_files.js && node src/verify_package_contents.js","setup":"node src/setup.js","start":"node src/start-server.js","tauri":"tauri","example":"node src/index.js","verify:status":"node src/verify_nonblocking_auth.js","verify:package":"node src/verify_package_contents.js","verify:board-files":"node src/verify_board_files.js"},"_npmUser":{"name":"boarderlessapp-publisher","email":"info@boarderless.app"},"repository":{"url":"git+https://github.com/CrackenReleased/boarderless.app_MCP.git","type":"git"},"_npmVersion":"11.16.0","description":"Model Context Protocol (MCP) server for Boarderless, allowing Ai agents to read the canvas state, mutate Objects, and calculate export bounds.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"jimp":"^0.22.12","heic-convert":"^2.1.0","puppeteer-core":"^22.0.0","@modelcontextprotocol/sdk":"^0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@tauri-apps/cli":"^2.11.2"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.27_1783127636243_0.4405165474006545","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"name":"@boarderless/mcp-server","version":"0.1.28","description":"Model Context Protocol (MCP) server for Boarderless, allowing Ai agents to read the canvas state, mutate Objects, and calculate export bounds.","engines":{"node":">=18"},"type":"module","main":"src/mcp-stdio-server.js","bin":{"boarderless-mcp-server":"src/mcp-stdio-server.js"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/CrackenReleased/boarderless.app_MCP.git"},"homepage":"https://boarderless.app/","bugs":{"url":"https://github.com/CrackenReleased/boarderless.app_MCP/issues"},"scripts":{"start":"node src/start-server.js","example":"node src/index.js","setup":"node src/setup.js","tauri":"tauri","test":"node src/verify_visible_operation.js && node src/verify_shortcut.js && node src/verify_nonblocking_auth.js && node src/verify_board_files.js && node src/verify_package_contents.js","verify:visible-operation":"node src/verify_visible_operation.js","verify:status":"node src/verify_nonblocking_auth.js","verify:board-files":"node src/verify_board_files.js","verify:package":"node src/verify_package_contents.js"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","heic-convert":"^2.1.0","jimp":"^0.22.12","puppeteer-core":"^22.0.0"},"keywords":["mcp","model-context-protocol","boarderless","spatial-canvas","puppeteer","agentic-ui"],"author":{"name":"Boarderless"},"license":"Apache-2.0","devDependencies":{"@tauri-apps/cli":"^2.11.2"},"gitHead":"a97c10867d09992eb1a7f923a64b7cace7844790","_id":"@boarderless/mcp-server@0.1.28","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-X1rOKrzphXL00fdLdn8b/+pqsvWH22rvV31wcHX9mCDoD8L70oqsAS/WCT5or7u+gQ1PLdlMx7dSLINhpNczQQ==","shasum":"1d2682b86a44aa23c14a9ce5974e16ffb9733327","tarball":"https://registry.npmjs.org/@boarderless/mcp-server/-/mcp-server-0.1.28.tgz","fileCount":13,"unpackedSize":163000,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAl0KoAOFey4A/cku7VOIcHf8TcEQOinMw05F/riTG1qAiAN6g0gY2cixRqqfIlhzumRivhUYoQv7HXODhBUTFRT5Q=="}]},"_npmUser":{"name":"boarderlessapp-publisher","email":"info@boarderless.app"},"directories":{},"maintainers":[{"name":"boarderlessapp-publisher","email":"info@boarderless.app"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-server_0.1.28_1784082879660_0.8856888661496547"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-03T02:35:06.197Z","modified":"2026-07-15T02:34:39.930Z","0.1.26":"2026-07-03T02:35:06.532Z","0.1.27":"2026-07-04T01:13:56.387Z","0.2.543":"2026-07-15T02:09:35.091Z","0.1.28":"2026-07-15T02:34:39.800Z"},"bugs":{"url":"https://github.com/CrackenReleased/boarderless.app_MCP/issues"},"author":{"name":"Boarderless"},"license":"Apache-2.0","homepage":"https://boarderless.app/","keywords":["mcp","model-context-protocol","boarderless","spatial-canvas","puppeteer","agentic-ui"],"repository":{"type":"git","url":"git+https://github.com/CrackenReleased/boarderless.app_MCP.git"},"description":"Model Context Protocol (MCP) server for Boarderless, allowing Ai agents to read the canvas state, mutate Objects, and calculate export bounds.","maintainers":[{"name":"boarderlessapp-publisher","email":"info@boarderless.app"}],"readme":"# Boarderless Model Context Protocol (MCP) Server\r\n\r\n> [!IMPORTANT]\r\n> **Operating System & Browser Support**: This Model Context Protocol (MCP) server and launcher tool are designed and optimized **specifically for Windows and Google Chrome**. Chromium-based browsers (including Microsoft Edge, Brave Browser, and Opera) are also supported on Windows. Other platforms (such as macOS or Linux) are supported as fallbacks but are not the primary target.\r\n\r\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\r\n\r\nA Model Context Protocol (MCP) server for **https://Boarderless.app/**, allowing Ai agents (like Claude Desktop, Cursor, and Claude Code) to inspect and edit the live browser-resident canvas directly. Boarderless remains Local First: the browser owns the working canvas, and this server connects an agent to that visible local session rather than inventing a hidden cloud copy.\r\n\r\nLooking for the app-wide map—canvas tools, image editing, slides, Ai Partner, persistence, plan boundaries, and the exact MCP subset? Ai agents connecting to this repository should parse the [Boarderless Product & MCP Feature Catalog](docs/features_catalog.md) before proposing work. Connector distribution and OpenAI/Microsoft readiness are tracked in [docs/connector_distribution_plan.md](docs/connector_distribution_plan.md); the future OAuth 2.1/Streamable HTTP adapter design is in [docs/oauth21_remote_adapter_plan.md](docs/oauth21_remote_adapter_plan.md); Joel's selected Option A browser bridge is specified in [docs/remote_session_bridge_spec.md](docs/remote_session_bridge_spec.md); Joel's operator path is in [docs/connector_operator_runbook.md](docs/connector_operator_runbook.md).\r\n\r\nRather than scraping pixels or guessing layouts from DOM selectors, agents communicate with a clean, typed spatial ledger.\r\n\r\n---\r\n\r\n## ⚡ Quick Start (TL;DR)\r\n\r\n**Step 1: Start the Interactive Configurator (Windows, Mac, or Linux)**\r\nRun the installer to configure your environment and client settings:\r\n*   **Windows (PowerShell)**:\r\n    ```powershell\r\n    Set-ExecutionPolicy Bypass -Scope Process -Force; .\\src\\setup.ps1\r\n    ```\r\n*   **Mac / Linux (Terminal)**:\r\n    ```bash\r\n    chmod +x ./src/setup.sh && ./src/setup.sh\r\n    ```\r\n\r\n**Step 2: Choose Option 1 (Standard Auto-Setup)**\r\nThe interactive installer will:\r\n1. Explain permissions (browser connection, file access).\r\n2. Install pure JavaScript dependencies automatically.\r\n3. Register the MCP server in your Claude Desktop configuration.\r\n4. Provide immediate copy-paste instructions for Cursor or Windsurf.\r\n\r\n---\r\n\r\n## Architecture Overview\r\n\r\n```\r\n+------------------+                   +--------------------+\r\n|  Ai Agent Client |                   | Boarderless App    |\r\n|  (Claude/Cursor) |                   | (Zustand + React)  |\r\n+--------+---------+                   +---------+----------+\r\n         |                                       ^\r\n         | (Stdio JSON-RPC)                      | (window.boarderlessMcp)\r\n         v                                       v\r\n+------------------+  CDP / Puppeteer  +---------+----------+\r\n|    MCP Server    +------------------>|  Chrome / Edge     |\r\n| (Stdio Transport)|                   |  Debugging Port    |\r\n+------------------+                   +--------------------+\r\n```\r\n\r\n1. **Boarderless Web App**: Exposes `window.boarderlessMcp` containing typed tool execution methods over Zustand state.\r\n2. **MCP Server (`mcp-stdio-server.js`)**: Connects only to a visible browser via Chrome DevTools Protocol (CDP), brings the Boarderless canvas tab to the front, rejects headless or invisible browser identities, maps incoming stdio messages to the browser runtime, and checks authentication. If the remote debugging port (9222) is closed, the server automatically scans and launches a visible Chrome or Edge window in remote-debugging mode.\n3. **Ai Agent**: Connects as a client to the MCP server's stdio transport.\r\n4. **Workspace Board File**: After every successful canvas mutation, the MCP server asks the browser persistence layer for the canonical schema-v2 snapshot and atomically writes `<board-name>--<board-id>.bdrl.json` into the configured local workspace.\r\n\r\n### One product, two different agent surfaces\r\n\r\n- **Ai Partner** lives inside the Boarderless app. It interprets supported natural-language canvas requests through Gemini, OpenAI, Anthropic Claude, Z.AI/GLM, local models, or a custom OpenAI-compatible endpoint, and performs local per-image background removal.\r\n- **Boarderless MCP** connects external agent clients to the running, human-visible canvas. It can inspect, measure, create supported text/shapes, mutate, delete, group, ungroup, reorder, undo, redo, export, and maintain durable `.bdrl.json` artifacts.\r\n- MCP does not inherit the user's Google identity, grant itself Drive access, upload arbitrary local images into the canvas, or bypass plan restrictions. Those boundaries stay with the human and the app.\r\n\r\nThe complete app feature surface—including image editing, presentations, minimap, typography, exports, persistence, plan boundaries, Ai Partner, and MCP—is indexed in [docs/features_catalog.md](docs/features_catalog.md).\r\n\r\n### Always-saved `.bdrl.json` workflow\r\n\r\nAgents must treat the board file as part of the task artifact, not as an optional final export:\r\n\r\n1. Call `get_board_workspace` before canvas work.\r\n2. If it is not the user's current project directory, call `set_board_workspace` with that absolute directory (or set `BOARDERLESS_WORKSPACE_DIR` in MCP configuration).\r\n3. Use the normal mutation tools. Every successful create, mutate, delete, group, reorder, undo, or redo automatically refreshes the canonical `.bdrl.json` file.\r\n4. Before handoff, call `export_board_file` and report its returned path. This explicit final flush makes the artifact requirement visible even if an earlier autosave warning occurred.\r\n5. To resume work, place a schema-v2 `.bdrl.json` file in the workspace and call `import_board_file` with its filename. The backend validates containment and schema, imports it through Boarderless persistence, switches the live canvas to it, and refreshes autosave.\r\n\r\nBoard file reads and writes are restricted to the configured workspace. Filenames cannot contain directories or traversal segments. Writes use a same-directory temporary file followed by an atomic rename so interrupted writes do not leave half-valid JSON.\r\n\r\n---\r\n\r\n## Prerequisites\r\n\r\n1. **Node.js** (v18 or higher)\r\n2. **Supported OS & Browser**: Windows 10/11 with a Chromium-based browser—Google Chrome, Brave Browser, Opera, or Microsoft Edge—uses the primary tested path. macOS and Linux use community fallback paths.\r\n3. **Boarderless Web App**: Access via production at `https://boarderless.app/canvas` (default) or your local dev server if running one.\r\n\r\n*Note: This Model Context Protocol server is optimized specifically for Windows. Google Chrome, Brave Browser, Opera, and Microsoft Edge are all fully supported. macOS and Linux are supported as community fallbacks.*\r\n\r\n---\r\n\r\n## Getting Started\r\n\r\n### 1. Launch Browser with Remote Debugging Enabled\r\n\r\nTo allow the MCP server to attach to your browser tab, you must start Chrome or Edge with debugging port `9222` active.\r\n*The MCP server will automatically try to find and launch Chrome/Edge on port 9222 if it is not already running.*\r\n\r\nIf you want to launch it manually, we provide pre-built launchers:\r\n* **Windows**: Double-click `./launch-chrome-debugging.bat` (or run it via cmd/PowerShell).\r\n* **macOS/Linux**: Run `chmod +x ./launch-chrome-debugging.sh && ./launch-chrome-debugging.sh`.\r\n\r\nAlternatively, launch manual instances:\r\n**Windows (PowerShell)**:\r\n```powershell\r\n& \"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe\" --remote-debugging-port=9222 --user-data-dir=\"$env:LOCALAPPDATA\\boarderless-mcp-profile\" https://boarderless.app/canvas\r\n```\r\n\r\n**macOS (Terminal)**:\r\n```bash\r\n/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --remote-debugging-port=9222 --user-data-dir=\"$HOME/Library/Application Support/boarderless-mcp-profile\" https://boarderless.app/canvas\r\n```\r\n\r\n*Note: Make sure to sign in/authenticate Google OAuth on the canvas page.*\r\n\r\n### 2. Install & Setup (Seamless Installers)\r\n\r\nWe provide pre-built install scripts that automatically check for Node.js (offering to install it if missing), install all package dependencies, write the Claude Desktop configuration, and offer to launch debugging:\r\n\r\n* **Windows**: Open PowerShell in this folder and run:\r\n  ```powershell\r\n  Set-ExecutionPolicy Bypass -Scope Process -Force; .\\src\\setup.ps1\r\n  ```\r\n* **macOS & Linux (Ubuntu)**: Open Terminal in this folder and run:\r\n  ```bash\r\n  chmod +x ./src/setup.sh && ./src/setup.sh\r\n  ```\r\n\r\n*Alternatively, perform manual installation:*\r\n1. Run `npm install`.\r\n2. Run `npm run setup`.\r\n\r\n### 3. Run the Example\r\n\r\nVerify your connection by running the test client, which queries the canvas state and moves the first element:\r\n```bash\r\nnpm run example\r\n```\r\n\r\n---\r\n\r\n## Diagnosing Issues — `get_server_status`\r\n\r\n**Always call `get_server_status` first** before attempting canvas operations.\r\n\r\nIt returns a structured JSON report with four health checks and actionable resolution steps for every failure:\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"ready\": true,\r\n  \"summary\": \"All systems operational. Ready to control Boarderless.\",\r\n  \"checks\": [\r\n    { \"check\": \"browser_port\",    \"passed\": true,  \"detail\": \"Chromium DevTools listening on http://127.0.0.1:9222\" },\r\n    { \"check\": \"canvas_tab\",      \"passed\": true,  \"detail\": \"Active canvas tab: https://boarderless.app/canvas\" },\r\n    { \"check\": \"mcp_bridge\",      \"passed\": true,  \"detail\": \"window.boarderlessMcp bridge is mounted and ready\" },\r\n    { \"check\": \"authentication\",  \"passed\": true,  \"detail\": \"User is authenticated — canvas tools are available\" }\r\n  ],\r\n  \"runtime\": {\r\n    \"platform\": \"win32\",\r\n    \"node_version\": \"v22.3.0\",\r\n    \"server_version\": \"0.1.28\",\r\n    \"app_url\": \"https://boarderless.app/canvas\",\r\n    \"browser_url\": \"http://127.0.0.1:9222\",\r\n    \"started_at\": \"2026-06-16T19:07:00.000Z\",\r\n    \"tool_calls\": 1,\r\n    \"tool_errors\": {}\r\n  },\r\n  \"next_steps\": [\"Call get_board_state to inspect the current canvas.\"]\r\n}\r\n```\r\n\r\nWhen something fails, each check includes a `resolution` field with exact fix steps:\r\n```json\r\n{ \"check\": \"authentication\", \"passed\": false,\r\n  \"resolution\": \"Sign in with Google at https://boarderless.app/canvas. Canvas tools require an active Boarderless session.\" }\r\n```\r\n\r\n---\r\n\r\n## Structured Error Responses\r\n\r\nEvery tool returns a structured JSON error object — never a raw exception string. Agents can parse `error_code` to decide next steps programmatically.\r\n\r\n| `error_code` | Meaning | Resolution |\r\n|---|---|---|\r\n| `BROWSER_CONNECT_FAILED` | No Chromium browser running on the debug port | Launch Chrome with `--remote-debugging-port=9222` |\r\n| `AUTH_REQUIRED` | Canvas session not authenticated | Sign in at `boarderless.app/canvas` |\r\n| `BRIDGE_NOT_READY` | `window.boarderlessMcp` not mounted | Navigate to `/canvas` and refresh |\r\n| `BRIDGE_MISSING` | Bridge removed mid-session | Refresh the browser tab |\r\n| `EXPORT_FN_MISSING` | Export function not bound on page | Ensure a board is open and you're on `/canvas` |\r\n| `EXPORT_RUNTIME_ERROR` | Export threw a runtime exception | Check plan tier — SVG/PDF require Pro |\r\n| `WORKSPACE_PATH_INVALID` | Workspace configuration was not an absolute path | Pass the agent's absolute project directory to `set_board_workspace` |\r\n| `BOARD_FILE_EXPORT_FAILED` | Canonical snapshot could not be written | Confirm workspace permissions and refresh the canvas persistence bridge |\r\n| `BOARD_FILE_IMPORT_FAILED` | Workspace board file failed containment, schema, or browser import | Use a schema-v2 `.bdrl.json` basename inside the configured workspace |\r\n| `PATH_NOT_FOUND` | Filesystem path argument doesn't exist | Use an absolute path to an existing directory |\r\n| `MISSING_ARGUMENT` | Required tool argument was omitted | Check the tool's input schema |\r\n| `TOOL_UNEXPECTED_ERROR` | Unhandled error in the tool silo | Check server stderr; open a GitHub issue |\r\n\r\nError shape:\r\n```json\r\n{\r\n  \"status\": \"error\",\r\n  \"error_code\": \"AUTH_REQUIRED\",\r\n  \"message\": \"You must be signed in to Boarderless to use canvas tools.\",\r\n  \"resolution\": \"1. Open https://boarderless.app/canvas ...\\n2. Sign in...\",\r\n  \"server\": \"boarderless-mcp-bridge\",\r\n  \"version\": \"0.1.28\",\r\n  \"timestamp\": \"2026-06-16T19:07:00.000Z\"\r\n}\r\n```\r\n\r\n---\r\n\r\n## Environment Variables (Full Reference)\r\n\r\nAll configuration uses environment variables — no hardcoded paths, no user-specific assumptions.\r\n\r\n| Variable | Default | Description |\r\n|---|---|---|\r\n| `BOARDERLESS_MCP_APP_URL` | `https://boarderless.app/canvas` | Canvas URL to connect to. Set to `http://127.0.0.1:5174/canvas` for local dev. |\r\n| `BOARDERLESS_MCP_BROWSER_URL` | `http://127.0.0.1:9222` | Chrome DevTools URL. Change if you use a different debug port. |\r\n| `BOARDERLESS_MCP_BROWSER_EXE` | *(auto-detected)* | Full path to browser executable. Set if auto-detection misses your browser. |\r\n| `BOARDERLESS_MCP_PROFILE_DIR` | *(OS-standard, see below)* | Override the persistent browser profile directory. |\r\n| `BOARDERLESS_WORKSPACE_DIR` | MCP process working directory | Absolute directory where canonical `.bdrl.json` files are always saved. Agents can change it at runtime with `set_board_workspace`. |\r\n\r\n**Default profile directories** (resolved from OS env vars, never hardcoded):\r\n- **Windows**: `%LOCALAPPDATA%\\boarderless-mcp-profile`\r\n- **macOS**: `~/Library/Application Support/boarderless-mcp-profile`\r\n- **Linux**: `~/.boarderless-mcp-profile`\r\n\r\n---\r\n\r\n## Tool API Specifications\r\n\r\n### `get_server_status` *(always call this first)*\r\nReturns a full diagnostic report. Input: none. See [Diagnosing Issues](#diagnosing-issues--get_server_status) above.\r\n\r\n---\r\n\r\n### `get_board_state`\r\nReturns the canvas as a structured, render-ordered JSON ledger.\r\n\r\n- **Input**: None (`{}`)\r\n- **Output**:\r\n  ```json\r\n  {\r\n    \"schema\": \"boarderless.boardSnapshot.v1\",\r\n    \"generatedAt\": \"2026-06-16T19:00:00.000Z\",\r\n    \"objectCount\": 3,\r\n    \"objects\": [\r\n      {\r\n        \"id\": \"rect-1\",\r\n        \"objectKind\": \"shape\",\r\n        \"objectType\": \"rect\",\r\n        \"x\": 20, \"y\": 20,\r\n        \"rawWidth\": 80, \"rawHeight\": 50,\r\n        \"fill\": \"#ff0000\", \"stroke\": \"#ff0000\",\r\n        \"strokeWidth\": 4, \"opacity\": 1, \"rotation\": 0\r\n      }\r\n    ]\r\n  }\r\n  ```\r\n\r\n---\r\n\r\n### `mutate_object`\r\nModifies coordinates or style properties of a canvas object. Writes to the undo stack.\r\n\r\n- **Required**: `id` (string)\r\n- **Optional mutable fields**: `x`, `y`, `width`, `height`, `rotation`, `opacity`, `fill`, `stroke`, `strokeWidth`, `text`, `fontSize`, `fontFamily`, `align`, `cornerRadius`, `edgeFeather`, `points`, `scaleX`, `scaleY`\r\n\r\n---\r\n\r\n### `remix_style`\r\nApplies one canonical Boarderless palette to selected shape/text Objects—or explicitly to the whole board—as one undoable history step. Images remain unchanged.\r\n\r\n- **Required**: `paletteId` — `\"boarderless\"` | `\"midnight\"` | `\"sunroom\"` | `\"editorial\"` | `\"earthbound\"`\r\n- **Optional**: `scope` — `\"selection\"` (default) | `\"board\"`; `ids` — explicit selection-scope Object IDs\r\n\r\n---\r\n\r\n### `calculate_export_bounds`\r\nReturns the collective bounding box of all active objects.\r\n\r\n- **Input**: None (`{}`)\r\n- **Output**: `{ bounds: { x, y, width, height, left, top, right, bottom } }`\r\n\r\n---\r\n\r\n### `create_object`\r\nCreate a new object (text or shape: rect, ellipse, triangle, arrow) on the canvas.\r\n\r\n- **Required**: `type` — `\"text\"` | `\"rect\"` | `\"ellipse\"` | `\"triangle\"` | `\"arrow\"`\r\n- **Optional**: `x` (number), `y` (number), `width` (number), `height` (number), `text` (string), `fill` (string), `stroke` (string), `strokeWidth` (number)\r\n\r\n---\r\n\r\n### `delete_objects`\r\nDelete one or more objects by their IDs from the canvas.\r\n\r\n- **Required**: `ids` (array of strings)\r\n\r\n---\r\n\r\n### `history_undo`\r\nUndo the last action on the canvas.\r\n\r\n- **Input**: None (`{}`)\r\n\r\n---\r\n\r\n### `history_redo`\r\nRedo the next action in the history queue on the canvas.\r\n\r\n- **Input**: None (`{}`)\r\n\r\n---\r\n\r\n### `group_objects`\r\nGroup multiple canvas objects under a unique `groupId`.\r\n\r\n- **Required**: `ids` (array of strings)\r\n\r\n---\r\n\r\n### `ungroup_objects`\r\nUngroup objects belonging to a specific `groupId`.\r\n\r\n- **Required**: `groupId` (string)\r\n\r\n---\r\n\r\n### `reorder_object`\r\nReorder z-index layering of an object (bring to front, send to back, forward, backward).\r\n\r\n- **Required**: `id` (string), `action` — `\"front\"` | `\"back\"` | `\"forward\"` | `\"backward\"`\r\n\r\n---\r\n\r\n### `get_board_workspace`\r\nReturns the active filesystem directory, autosave state, and filename pattern. Agents should call this before their first canvas mutation.\r\n\r\n---\r\n\r\n### `set_board_workspace`\r\nSets the absolute project directory used for board artifacts. The directory is created when necessary.\r\n\r\n- **Required**: `directory` (absolute path)\r\n\r\n---\r\n\r\n### `export_board_file`\r\nFlushes the browser's current board and atomically writes its complete schema-v2 snapshot, including JSON-safe image assets.\r\n\r\n- **Optional**: `filename` — a single filename ending in `.bdrl.json`; omitting it uses the stable autosave name.\r\n\r\n---\r\n\r\n### `import_board_file`\r\nReads, validates, imports, and opens a board from the configured workspace.\r\n\r\n- **Required**: `filename` — a single `.bdrl.json` filename in the workspace\r\n\r\n---\r\n\r\n### `export_board`\r\nExports the current canvas to PNG, PDF, or SVG.\r\n\r\n- **Required**: `format` — `\"png\"` | `\"pdf\"` | `\"svg\"`\r\n- **Optional**: `mode` — `\"canvas\"` (default) | `\"selection\"`, `filename` — output name override\r\n- **Note**: SVG and PDF require a Pro plan. The error response will indicate this clearly.\r\n\r\n---\r\n\r\n### `graduation_rename_photos`\r\nRenames photo files in a local directory to sequential format. **No browser required.**\r\n\r\n- **Required**: `seniorsDir` (absolute path), `mode` (`\"sequential\"` | `\"gap_fill\"`)\r\n\r\n---\r\n\r\n### `graduation_standardize_images`\r\nConverts progressive JPEGs and HEIC files to baseline RGB JPEGs. **No browser required.**\r\n\r\n- **Required**: `seniorsDir` (absolute path)\r\n\r\n---\r\n\r\n## Connecting to AI Clients\r\n\r\n### Claude Desktop\r\nAdd to `%APPDATA%\\Claude\\claude_desktop_config.json` (Windows) or `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS).\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"boarderless\": {\r\n      \"command\": \"node\",\r\n      \"args\": [\"/absolute/path/to/boarderless.app_MCP/src/mcp-stdio-server.js\"],\r\n      \"env\": {\r\n        \"BOARDERLESS_MCP_APP_URL\": \"https://boarderless.app/canvas\",\r\n        \"BOARDERLESS_MCP_BROWSER_URL\": \"http://127.0.0.1:9222\",\r\n        \"BOARDERLESS_WORKSPACE_DIR\": \"C:\\\\absolute\\\\path\\\\to\\\\your\\\\project\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nRunning `npm run setup` will write this automatically.\r\n\r\n### Hermes / OpenClaw (Local AI Gateway)\r\nAdd to your `openclaw.json` under `mcp.servers`:\r\n\r\n```json\r\n\"mcp\": {\r\n  \"servers\": {\r\n    \"boarderless\": {\r\n      \"command\": \"node\",\r\n      \"args\": [\"/absolute/path/to/boarderless.app_MCP/src/mcp-stdio-server.js\"],\r\n      \"env\": {\r\n        \"BOARDERLESS_MCP_APP_URL\": \"https://boarderless.app/canvas\",\r\n        \"BOARDERLESS_MCP_BROWSER_URL\": \"http://127.0.0.1:9222\",\r\n        \"BOARDERLESS_WORKSPACE_DIR\": \"/absolute/path/to/your/project\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### Cursor / Windsurf\r\nSee the `mcp-config.json` file generated by `npm run setup` for the exact config block to paste.\r\n\r\n### VS Code / GitHub Copilot and connector directories\r\nVS Code / GitHub Copilot can use Boarderless as a local stdio MCP server through `.vscode/mcp.json`.\r\n\r\n### Hosted OpenAI and Microsoft status\r\n\r\nJoel selected **Option A: browser-mediated visible-session bridge** for future remote readiness. Boarderless will not host user data or server-side boards; user data stays user-managed, user-owned, and user-controlled. See [docs/remote_session_bridge_spec.md](docs/remote_session_bridge_spec.md).\r\n\r\n`@boarderless/mcp-server` v0.1.28 is **not** a hosted ChatGPT App or Microsoft Copilot Studio connector. npm distributes the local `stdio` connector only.\r\n\r\n- **OpenAI outstanding:** public HTTPS MCP resource server, OAuth 2.1 authorization-code flow with PKCE, protected-resource and authorization-server discovery metadata, ChatGPT client registration/callback, scoped token validation, and a secure relay from the hosted service to the user's visible Boarderless browser session.\r\n- **Microsoft outstanding:** public Streamable HTTP MCP endpoint, OAuth 2.0 through DCR/discovery or manual client registration, Copilot callback registration, scoped token validation/refresh/revocation, and the same secure remote-to-visible-canvas relay.\r\n- **Shared outstanding:** remote-safe tool policy, explicit controls for writes, rate limits, audit logging, privacy/retention rules, secret management, security review, end-to-end tests, and platform submission/review.\r\n\r\nOAuth identifies and authorizes a user; it does not make a cloud service capable of reaching that user's localhost browser or Chrome DevTools port. The selected path is a user-approved outbound browser bridge bound to the visible tab/canvas, not a hidden cloud board. See [the complete hosted-connector checklists](docs/connector_distribution_plan.md#outstanding-hosted-openai-work--not-included-in-v0126), [the docs-only remote adapter plan](docs/oauth21_remote_adapter_plan.md), [the browser bridge spec](docs/remote_session_bridge_spec.md), and [the operator gates](docs/connector_operator_runbook.md#phase-c-hosted-openai-and-microsoft-adapters-later).\r\n\r\n---\r\n\r\n## Privacy Policy\r\n\r\nBoarderless MCP is a **local** connector. The full Boarderless privacy policy is published at **<https://boarderless.app/privacy>** (also declared in `manifest.json` `privacy_policies`).\r\n\r\nSummary of how this MCP server handles data:\r\n\r\n- **Data collection**: The server itself collects no analytics and sends no telemetry. It reads canvas state from your own signed-in, human-visible Boarderless browser tab via the Chrome DevTools Protocol on `127.0.0.1:9222`.\r\n- **Usage and storage**: Board snapshots (`.bdrl.json`) and exports are written only to the local workspace directory you configure. Nothing is uploaded to Boarderless servers by this MCP server.\r\n- **Third-party sharing**: None. The server communicates only with your local browser and the Boarderless canvas page you are signed into. It never inherits your Google identity or Google Drive access.\r\n- **Data retention**: Local board files remain on your machine under your control; delete them at any time. The server keeps no databases, queues, or server-side copies.\r\n- **Contact**: Questions or concerns — open an issue at <https://github.com/CrackenReleased/boarderless.app_MCP/issues> or use the contact channel listed at <https://boarderless.app/privacy>.\r\n\r\n---\r\n\r\n## Contributing\r\n\r\nThis MCP server is open source under the Apache 2.0 license. Contributions are welcome!\r\n\r\n- **Bug reports**: Open an issue describing the `error_code` you received and your `get_server_status` output.\r\n- **New tools**: Tools should be added as siloed handlers in `mcp-stdio-server.js` with structured `makeError` / `makeSuccess` responses. Every new tool must have a corresponding regression test.\r\n- **Platform support**: If your browser or OS isn't detected, open a PR adding its path to `getBrowserCandidates()` — all paths must use OS env vars, never hardcoded usernames.\r\n\r\n### Production release synchronization\r\n\r\nAfter the initial npm publication is approved, every production MCP version must be delivered to both GitHub and npm under the same version number. A production release is not complete until `npm test` and `npm publish --dry-run --access public` pass, the Git commit is pushed, `npm publish --access public` succeeds, and `npm view @boarderless/mcp-server version` returns that exact version. Documentation-only commits that do not change the MCP package version do not require an npm publication.\r\n\r\n---\r\n\r\n## License\r\n\r\nLicensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for details.\r\n","readmeFilename":"README.md"}