Customization SDK
Build bounded reusable tools for your local board, with optional panels, through the discovered FlashBoards SDK contracts.
Use the FlashBoards SDK for behavior you want to reuse: a selected-note cleanup action, a selection layout, or a small reporting tool. A tool can run without showing a panel; an optional panel calls the same authored actions. For a single board edit, use an existing board action.
NoteLimited rollout
Plugin execution is available only to eligible pilot accounts with a fully loaded, signed-in local board. A paid subscription alone does not enable it. Shared boards are excluded. Settings → Plugins appears only with the required access. Reading this guide or an SDK schema does not enable execution.
Start with an agent
Connect over MCP or the Public API. Ask the agent to read get_skill with skillId: "flashboards-sdk", then discover the connected version's contracts. The SDK guide is also available as a public Markdown file. Live schemas and receipts govern which capabilities that version accepts. For SDK 2, discover tool-artifact, tool-context and tool-installations as shown below. The live contracts describe authored actions, bounded context and independent installed tools.
Where Settings → Plugins is available, Build with Assistant opens a customization request in the sidebar; Copy instructions for my agent supplies connection instructions; Read SDK guide opens the same guide. These controls do not install a package.
Discover before writing
The public guide and describe_board_action envelope schema can be read without SDK pilot access. Live extension schemas and installed-tool discovery through extensionsRequest require an eligible pilot account and local-board tab, even for read-only requests; they do not require installation consent.
With that access, first call list_board_sessions and get_board_snapshot for the intended tab. Then send extensionsRequest through execute_board_action, with the snapshot's activeBoardId as the outer expectedBoardId and sessionId when needed:
{
"operation": "execute_board_action",
"input": {
"action": "extensionsRequest",
"args": { "operation": "describe", "section": "tool-artifact" },
"expectedBoardId": "BOARD_ID_FROM_SNAPSHOT",
"sessionId": "SESSION_ID_FROM_DISCOVERY"
}
}This is the Public API envelope. For MCP, send its input object as the arguments to execute_board_action. Replace the placeholder IDs with returned values. Request section: "tool-context" separately to inspect the bounded context schema, then section: "tool-installations" for version-4 installation requests.
Execution, including invocation without a visible panel, uses the authorized local-board tab. It does not run on the server against an arbitrary board. WebMCP's browser tools do not expose plugin execution.
Choose the package contract
| Package | Contract |
|---|---|
| SDK 2 custom tool | formatVersion: 3, kind: "custom-tool", sdkVersion: 2; 1–16 named actions, optional panel |
| SDK 1 custom panel | formatVersion: 2, kind: "custom-panel", sdkVersion: 1; event-based panel logic that can also be invoked while hidden |
| Alignment toolbar | formatVersion: 1; native layout recipes or a bounded placement script, with its own draft and activation flow |
An SDK 2 action reads bounded context, requests item pages, then returns a result or one declared effect. Its program is stored as function-body strings in JSON. It cannot access arbitrary page DOM, network requests, files, shell commands or paid generation.
SDK 2 grants are explicit:
- Item reads.
board.items.readreturns up to 32 summaries per page, including IDs, kinds and available geometry. It excludes note bodies and media URLs. Continue with the returned offset and revision. - Select and focus. These effects require matching capabilities and IDs from the captured selection or latest item page.
- Note editing.
notes.readexposes one supported selected note.notes.writealso needs that read grant and can update only that captured note's title, content, font size, text color and background color. The body limit is 2 KiB UTF-8 and the title limit is 256 bytes. - Selection layout.
board.layoutalso requiresselection.geometry. One position-only layout must cover exactly the captured selection of 1–32 items. Paged or remembered IDs cannot expand that authority. Missing, extra, duplicate or stale targets refuse the whole effect. Bound arrows can follow moved targets;changedIdsreports the directly positioned items.
The invocation has a two-second deadline and at most eight reads; eight reads are a ceiling, not a guaranteed throughput. Arguments and results are at most 2 KiB, state and each step at most 16 KiB. Agent installation accepts at most 8 KiB of serialized package JSON. Discover the exact schemas before authoring.
Install and invoke deliberately
Before an agent installs, replaces or invokes a plugin, a human must enable Allow my connected agents to install panels, save toolbar drafts and run local plugins here under Settings → Plugins → Official Alignment. The agent must wait for that Settings action. A shared file or connected app does not supply consent.
Up to eight independent SDK 2 tools can be installed. Discover tool-installations, then use operation: "panel" with request.version: 4. Keep the installation ID and entry revision. Obtain fresh context with get before invokeAction, using the same ID, revision and token. Updates, enable/disable and removal require the entry revision. See the SDK guide and live schema for complete requests.
Metadata reads do not require agent consent; writes, context and execution do. Installation does not invoke an action. Hiding a panel leaves its tool installed. Obtain fresh context after board, selection or installation changes.
Version-2 SDK 1 panels and version-3 SDK 2 requests share the separate legacy single slot, alongside the alignment toolbar. Inspect its occupant before intentional replacement; these requests do not target version-4 installations.
Read the full receipt. Applied edits use normal Undo; pending persistence does not confirm durable saving. Version-4 committed: "runtime" acknowledges transient state; "registry" acknowledges an installation-registry write. Legacy receipts may use stateCommitted: true. Inspect withheld or uncertain results; never automatically replay them.
Share a definition
Exported packages transfer their JSON definition, code and optional CSS. They do not transfer private runtime state, live context tokens, account authority or consent. Check the editor text before export: export downloads the current editor text, including unsaved changes. Import the actual file when transferring a definition, then discover fresh context on the receiving board. Switching local boards alone does not normally require reimporting an installed tool.
An unsupported package or declared capability is refused and asks you to save your work and refresh. Refresh does not automatically replay an invocation.