Skip to main content
Glama
CrossPad

crosspad-mcp-server

Official
by CrossPad

crosspad_flash

Destructive

Flash firmware to ESP32-S3 or STM32G0 after a preflight check verifies device, port role, build version, and board revision. Confirmation required before writing.

Instructions

[ESP HW | STM HW] Flash firmware. Danger tier: it always runs a preflight first, always returns that preflight (refusal included), and needs a confirmation before writing anything. Preflight reports: the device's USB mode, which role the target port plays (the STM32 bridge console is refused as a flash target), the binary's own version string, whether it is older than the newest file under main/ or components/, and whether the build's board revision matches the device's — a mismatch is a blocker, because the revisions differ in pinout and the wrong image looks like dead hardware. target='esp': transport='ota' streams over USB CDC with the device running (no bootloader mode); transport='uart' runs idf.py flash and needs download mode. wait_boot=true then opens the console and returns a BootResult. target='stm': method='swd' (ST-Link) or 'dfu' (system bootloader, hold pad 1 at boot). The flash runs as a job: wait_seconds=0 (default) returns a task handle for crosspad_task; wait_seconds>0 inlines the final status. dry_run=true stops after the preflight. force=true overrides every blocker except the port-role refusal.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
portNoESP only. Serial port to flash. Omit to let the daemon choose. The STM32 bridge console port is refused — it carries logs, not the flash.
forceNoProceed despite preflight blockers (stale build, board-revision mismatch, missing device). The port-role refusal is never overridden.
deviceNoESP only. Device id (dev_xxxx) or one of its port paths; omit when exactly one CrossPad is connected.
methodNoSTM only. 'swd' = ST-Link; 'dfu' = the STM32 system bootloader (hold pad 1 at boot).
targetNo'esp' = ESP32-S3 application firmware (transport uart|ota); 'stm' = STM32G0 bridge firmware via STM32_Programmer_CLI (method swd|dfu).esp
dry_runNoRun the preflight and stop: no confirmation token is minted and nothing is written.
build_dirNoESP only. Build directory holding the binary and its sdkconfig (default '<idf-root>/build'; per-revision dirs are build_v1 / build_v2).
transportNoESP only. 'ota' streams the binary over USB CDC with the device running (no bootloader mode); 'uart' runs idf.py flash and needs download mode.
wait_bootNoESP only. After flashing, open the console and wait for the boot markers; the job result carries a BootResult {complete, missing, fatal, errors, bootloops, seconds}. Default false.
build_typeNoSTM only. Picks the build/<preset> dir for the default binary. Default Debug.
delta_baseNoESP OTA only. Previously flashed binary to diff against — sends a delta instead of the whole image.
wait_secondsNo0 (default) returns the task handle immediately — poll it with crosspad_task. >0 waits that long and inlines the task status; a timeout is not an error, the job keeps running.
confirm_tokenNoToken from a previous confirmation_required result. Re-issue the identical call with it to proceed.
firmware_pathNoCustom binary. ESP default '<build_dir>/CrossPad.bin'; STM default '<stm-root>/build/<preset>/CrossPad_STM32_r20.bin'.
boot_timeout_sNowait_boot: how long to wait for a complete boot (default 45, the firmware's own boot budget).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
tsNo
hintNo
taskNo
toolNo
errorNo
deviceNo
statusNo
targetNo
detailsNo
dry_runNo
successYes
preflightNo
transportNo
resultTypeNo
confirmationNo
firmware_pathNo
Install Server

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses far beyond the annotations: a preflight always runs and is always returned (refusal included), confirmation is mandatory before any write, board-revision mismatch is a hard blocker because the wrong image 'looks like dead hardware', and the port-role refusal is never overridable. It also reveals job semantics (wait_seconds=0 returns a task handle; a timeout is not an error) and wait_boot returning a BootResult, none of which the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but logically ordered: danger tier first, then preflight details, then ESP specifics, then STM specifics, then job semantics — with the safety-critical 'needs a confirmation before writing anything' front-loaded. It runs long, but with 15 parameters and two hardware targets every sentence earns its place; light structural breaks would make it exemplary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For the most complex and dangerous tool in the set (15 params, destructiveHint=true, no required params), the description covers the complete lifecycle: preflight, confirmation, per-target transports and methods, blocker override semantics, async job polling, and boot verification. The presence of an output schema means return values need no further elaboration. Nothing an agent needs to safely invoke this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description genuinely adds cross-parameter meaning: it ties force, dry_run, and confirm_token into the preflight/confirmation lifecycle, scopes delta_base to ESP OTA-only, and explains the wait_seconds-to-crosspad_task coupling. The preflight paragraph gives force and dry_run behavioral weight the schema alone cannot.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with '[ESP HW | STM HW] Flash firmware' — a specific verb and resource that names both hardware targets. The scope is unambiguous and the sibling tools (build, repo_status, devices, doctor, snapshot, toolsets, task) are clearly distinct: this is the only one that writes firmware.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the full invocation lifecycle: a preflight always runs and returns a confirmation_required result, the identical call is re-issued with confirm_token to proceed, dry_run stops after preflight, and force overrides blockers. It also routes async polling to crosspad_task. What's absent is an explicit 'when not to use this tool' statement, though the siblings are different enough in purpose that this is a minor gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/CrossPad/crosspad-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server