# prusactl (mcpb · prusactl.mcpb)

Run a Prusa 3D printer: status, camera, files, printing, G-code, over PrusaLink or Prusa Connect.

- Trust score: 51/100 (low)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-23

## Components

- mcpb · `prusactl.mcpb`: 51/100 (this document), [markdown](https://verifymcp.io/servers/trevin-lee-prusactl/prusactl.md), [page](https://verifymcp.io/servers/trevin-lee-prusactl/prusactl)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/trevin-lee/prusactl/releases/download/v0.3.0/prusactl.mcpb`
- Transport: `stdio`
- SHA-256: `a106f81c143fb9f4ad71420be86051617d245dda98c954103ce275eb1a3d560c`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-23.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 12 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 67/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 6286 tokens (~224/item across 28 items; 28 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 83/100
  - Stability observed for 25 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 29 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the prusactl MCP server?

prusactl ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, a106f81c143fb9f4ad71420be86051617d245dda98c954103ce275eb1a3d560c; the commands to do that are on this page. If it does not match, do not open it.

- Download bundle: `https://github.com/trevin-lee/prusactl/releases/download/v0.3.0/prusactl.mcpb`
- SHA-256: `a106f81c143fb9f4ad71420be86051617d245dda98c954103ce275eb1a3d560c`

### Verify on macOS / Linux

```bash
echo "a106f81c143fb9f4ad71420be86051617d245dda98c954103ce275eb1a3d560c  prusactl.mcpb" | shasum -a 256 -c
```

### Verify on Windows (PowerShell)

```powershell
(Get-FileHash -Algorithm SHA256 .\prusactl.mcpb).Hash -eq "a106f81c143fb9f4ad71420be86051617d245dda98c954103ce275eb1a3d560c"
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-23 (score 51, +1)

No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-21 (score 50, +1)

No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-19 (score 49, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-17 (score 48, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-15 (score 47, 0)

- [functional regression] Schema quality: 201 → 224

### 2026-10-14 (score 47, +1)

- [functional improvement] Maintenance: unverified → pass

### 2026-10-13 (score 46, +1)

- [functional regression] Security disclosure: unverified → fail

### 2026-10-12 (score 45, 0)

- [security regression] Provenance: unverified → fail

## MCP tools (28)

### `add_to_queue` (~343 tokens)

Add a file to the printer's Prusa Connect print queue, either one on the printer (path) or one in Connect storage (hash). Connect starts the next queued job when the printer is idle and marked ready (send_command SET_PRINTER_READY, or set_ready here). Marking it ready says the plate is clear, the same assertion as plate_clear, and nothing verifies it: do it only after looking at get_camera_snapshot or asking the user.

Input parameters:

- `hash` (string): file in Connect storage (from upload_file or list_connect_files); use instead of path
- `path` (string): file already on the printer, e.g. /usb/part.bgcode
- `position` (null|integer): 0 = front of the queue, -1 = end (default)
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `set_ready` (boolean): also mark the printer ready so Connect starts the next job; only with hash. Ready means the plate is clear, the same confirmation plate_clear gives elsewhere: set it only after checking the camera or…
- `team_id` (integer): team owning the Connect file; default is the printer's team
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…
- `wait_until` (integer): unix time before which the job must not start; only with hash

### `api_request` (~264 tokens)

Call any printer API endpoint directly, for anything the other tools don't cover. Paths starting with /api/ go to the printer itself over the local network (PrusaLink, e.g. /api/v1/status); paths starting with /app/ go to Prusa Connect as the signed-in user (e.g. PATCH /app/printers/{uuid} for settings, /app/stats/printers/{uuid}/..., /app/teams/{team_id}/files). Credentials in responses are redacted. This is a raw escape hatch for what the other tools don't cover, not a shortcut around them: no safety checks apply (a busy printer, plate_clear), a DELETE or PUT is permanent and really done, and a mistake can start a print, move the head, or change settings. Use start_print, upload_file, run_gcode, send_command, or control_print for anything that prints or moves the printer, and GET to look.

Input parameters:

- `body`: JSON request body
- `method` (string): GET, POST, PUT, PATCH or DELETE; default GET
- `path` (string, required): /api/... for the printer (PrusaLink) or /app/... for Prusa Connect
- `query` (object): query-string parameters

### `connection_status` (~62 tokens)

How the printer can be reached right now: directly on the local network (PrusaLink) and/or through Prusa Connect, which account is signed in, and whether a local camera (RTSP) is saved. Says what to set up if neither route works.

### `control_print` (~185 tokens)

Pause, resume, or stop the current print. A question on the printer's screen (state ATTENTION) can't be answered this way; use respond_to_dialog through Prusa Connect. Pause is reversible and is the right first move when a print looks wrong; stop is final: the job can't be resumed and the part stays on the plate. Stop only for a clear failure or when the user says so.

Input parameters:

- `action` (string, required): pause, resume, or stop
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `delete_connect_files` (~186 tokens)

Delete files from Prusa Connect's cloud storage, freeing the team's quota. Takes the hashes list_connect_files and upload_file report. Permanent, with no undo, and it removes the file for the whole team. delete_printer_files is the equivalent for the printer's own storage.

Input parameters:

- `hashes` (null|array, required): file hashes from list_connect_files or upload_file
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `team_id` (integer): team owning the files; default is the team of the named printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `delete_printer_files` (~161 tokens)

Delete files from the printer's storage. Permanent: there is no trash and no undo, and a file that is printing is refused. List the folder first and delete only what the user named or clearly asked to clean up.

Input parameters:

- `paths` (null|array, required): full paths on the printer, e.g. /usb/old.bgcode
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `download_printer_file` (~196 tokens)

Copy a file from the printer's storage to this computer, e.g. to inspect the G-code or the slicer settings a finished print used. Direct route only: Prusa Connect can't read files off the printer.

Input parameters:

- `local_path` (string, required): absolute path on this computer: a folder (the file keeps its name) or a file name
- `overwrite` (boolean): replace an existing local file
- `path` (string, required): file on the printer, e.g. /usb/part.bgcode
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `get_camera_snapshot` (~272 tokens)

The latest image from the printer's camera, so you can see the print, the bed, and the nozzle. Use it before starting a print or moving anything (is the plate clear?) and to watch a print for failures. It is the only way to check the plate yourself: plate_clear is just your say-so. Where the picture comes from: the printer's own camera API if it has one; else the camera's RTSP stream, if its address is saved (prusactl setup --camera rtsp://<camera-ip>/live, or PRUSACTL_CAMERA_URL), grabbed with ffmpeg, which must be installed; else Prusa Connect. via=direct forces the first two, via=connect forces Connect. Reports where the image came from and how old it is.

Input parameters:

- `camera_id` (string): camera to use when the printer has several; default is the first
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `get_command` (~149 tokens)

Check the state of a command sent with send_command async=true. The state is the last thing that happened to it: CREATED (accepted), EMIT (sent to the printer), FINISHED, or REJECTED.

Input parameters:

- `command_id` (integer, required): id returned by an async send_command
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `get_firmware_status` (~129 tokens)

The firmware the printer runs, the latest one Prusa Connect offers for it, and whether they differ (state: supported, outdated or unsupported). Read-only; Prusa Connect only.

Input parameters:

- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `get_job` (~148 tokens)

One print job in detail, including the objects on the plate that can be cancelled individually (cancelable.objects; cancel one with send_command CANCEL_OBJECT and kwargs {"object_id": id}).

Input parameters:

- `job_id` (integer, required): job id from list_jobs or get_printer's job_info
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `get_printer` (~202 tokens)

Live status of the printer. "summary" holds the common facts in the same place whichever route was used: state, nozzle/bed/chamber temperatures with their targets, and the current job's name, progress and time remaining. Everything the route itself reported is kept alongside it, so through Prusa Connect that also includes axis positions, fans, speed/flow, filament, nozzle, settings and dialog_info (the dialog on the printer's screen, which respond_to_dialog answers), and directly it includes the printer's own status, info and job records.

Input parameters:

- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `get_queue` (~144 tokens)

The printer's print queue in Prusa Connect: jobs waiting to print, in order, with their ids.

Input parameters:

- `limit` (integer): how many entries to return; at most 500
- `offset` (integer): entries to skip, for the next page
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `get_telemetry` (~143 tokens)

Recent telemetry history from Prusa Connect: temperatures, fans, speed, and axis positions over time.

Input parameters:

- `granularity` (integer): seconds between samples; default 15
- `minutes` (integer): how far back to go; default 30
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `get_transfers` (~118 tokens)

File transfers to the printer that are in progress (with progress), plus, through Prusa Connect, files waiting in its download queue.

Input parameters:

- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `list_connect_files` (~192 tokens)

Files stored in Prusa Connect's cloud storage for a team, with the hashes add_to_queue takes. These count against the team's storage quota; delete_connect_files removes them, and delete_printer_files removes files from the printer instead.

Input parameters:

- `limit` (integer): how many entries to return; at most 500
- `offset` (integer): entries to skip, for the next page
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `team_id` (integer): team whose storage to list; default is the team of the first printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `list_events` (~166 tokens)

The printer's event log from Prusa Connect, newest first: state changes, job starts and finishes, errors, attention requests, commands, and file transfers. Use it to find out what happened while nobody was watching.

Input parameters:

- `limit` (integer): how many entries to return; at most 500
- `offset` (integer): entries to skip, for the next page
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `list_jobs` (~174 tokens)

The printer's job history, newest first: what printed, when, for how long, and how it ended.

Input parameters:

- `limit` (integer): how many entries to return; at most 500
- `offset` (integer): entries to skip, for the next page
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `states` (null|array): filter by job state, e.g. PRINTING, FIN_OK, FIN_ERROR, FIN_STOPPED
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `list_printer_files` (~175 tokens)

Browse files on the printer's own storage (USB drive). Without path, lists the storages.

Input parameters:

- `limit` (integer): how many entries to return; at most 500
- `offset` (integer): entries to skip, for the next page
- `path` (string): folder on the printer, e.g. /usb or /usb/parts; omit to list the printer's storages
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `list_printers` (~62 tokens)

The printers prusactl can reach: the one set up for direct access (with whether it answers right now) and those on the Prusa Connect account, with state, temperatures, filament, job progress, and any dialog on the printer's screen.

### `list_supported_commands` (~199 tokens)

List every command this printer's firmware accepts through Connect: its arguments (name, type, unit, default, required) and the printer states it may run in (executable_from_state). This is the full control surface of the printer: movement, homing, temperatures, fans, speed/flow, filament load/unload, mesh bed leveling, file and folder management, printer-ready flags, resets, and G-code snippets from the team library.

Input parameters:

- `executable_now` (boolean): only list commands the printer accepts in its current state
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `remove_from_queue` (~136 tokens)

Remove a job from the printer's Prusa Connect print queue. The queue entry is gone for good; add_to_queue puts it back at the end.

Input parameters:

- `job_id` (integer, required): queued job id from get_queue
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `respond_to_dialog` (~173 tokens)

Press a button on the dialog currently shown on the printer's screen (filament runout, errors, confirmations, "remove the print" prompts, etc.), the way the Connect web app does remotely. get_printer shows the open dialog in dialog_info with its text and buttons.

Input parameters:

- `button` (string, required): label of the button to press, exactly as get_printer shows it in dialog_info.buttons
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `run_gcode` (~425 tokens)

Run G-code on the printer over the direct connection: prusactl uploads it as a tiny print job (/usb/prusactl-macro.gcode) and starts it, so it only works while the printer is idle (not printing or paused). This is how to heat (M104/M140/M109/M190), home (G28), move (G90/G91 + G1), load/unload filament (M701/M702), level (G29), or send any other command when Prusa Connect isn't available. It is not a console: the G-code is written to "/usb/prusactl-macro.gcode" on the printer, overwriting the previous run's, and started as a real print job. It shows up on the printer and in history as a short print, occupies the printer until it ends (control_print stop cancels it), and does exactly what the G-code says, with no checks on its content. Moves act on real hardware: make sure nothing is in the way. After a finished or stopped print it needs plate_clear=true, which is your own assertion: verify the plate with get_camera_snapshot or the user first.

Input parameters:

- `gcode` (string, required): G-code lines to run, e.g. "G28\nM104 S215"
- `plate_clear` (boolean): your own assertion that the plate is empty; nothing checks it, so make it true: look at get_camera_snapshot and read the image, or take the user's word. Required when the printer is FINISHED or STOPP…
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `send_command` (~387 tokens)

Run any command from list_supported_commands on the printer, exactly as the Connect web app's controls do. The command and state are checked against the printer's supported-command list first. By default waits for the printer to acknowledge. Physical commands (MOVE, HOME, heating, filament, MESH_BED_LEVELING) act on real hardware: check get_printer and the camera first. After a finished or stopped print, START_PRINT, HOME, MOVE, MOVE_Z and MESH_BED_LEVELING also need plate_clear=true, as start_print does. SET_PRINTER_READY tells Connect the plate is clear, so it is itself that confirmation: send it only after looking.

Input parameters:

- `async` (boolean): queue the command and return immediately instead of waiting for the printer to acknowledge it
- `command` (string, required): command name exactly as list_supported_commands shows it, e.g. HOME, MOVE, SET_NOZZLE_TEMPERATURE
- `kwargs` (object): command arguments by name, typed as list_supported_commands describes them
- `plate_clear` (boolean): your own assertion that the plate is empty; nothing checks it, so make it true: look at get_camera_snapshot and read the image, or take the user's word. Required when the printer is FINISHED or STOPP…
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `timeout_seconds` (integer): for synchronous commands, how long Connect should wait for the printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `start_print` (~263 tokens)

Start printing a file that is already on the printer's storage. The printer must be idle and the plate clear: check get_printer and look at get_camera_snapshot first. After a finished or stopped print it needs plate_clear=true, which is your own assertion that the plate is empty, so verify it with the camera or the user before setting it.

Input parameters:

- `path` (string, required): file on the printer as list_printer_files reports it, e.g. /usb/3DBENC~2.BGC
- `plate_clear` (boolean): your own assertion that the plate is empty; nothing checks it, so make it true: look at get_camera_snapshot and read the image, or take the user's word. Required when the printer is FINISHED or STOPP…
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `update_firmware` (~314 tokens)

Install firmware through Prusa Connect: Connect copies the .bbf it hosts (the latest, or version) to the printer's USB drive, then sends the FLASH command, and the printer installs it and restarts. Waits for the copy (a few minutes at most). Without version it goes by Prusa Connect's own verdict: installs the latest when Connect says the firmware is outdated, does nothing when Connect says it is current, and refuses when there is no verdict, so a printer newer than Connect's latest is never downgraded by accident. Refuses before copying anything unless the printer is idle, ready, finished or stopped; a print that starts during the copy leaves the file on the USB drive, not installed, and the result says so. installed is true only when the printer confirmed FLASH. Run it only when the user asked for a firmware update: it restarts the printer, which may ask for a confirmation on its screen.

Input parameters:

- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `version` (string): firmware version to install, e.g. 6.8.1; default is the latest one Connect offers for this printer
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

### `upload_file` (~447 tokens)

Upload a sliced print file (.bgcode/.gcode) from this computer to the printer, optionally starting it (then=print) or adding it to the Prusa Connect queue (then=queue). Directly on the local network the file goes straight to the printer; through Connect it is stored in Connect and copied to the printer in the background (get_transfers shows progress); there then=print puts it first in the queue and marks the printer ready, and Connect starts it once the file arrives. then=print is refused unless the printer is idle. Before then=print, confirm the plate is clear (a camera snapshot, or the user); plate_clear is your own assertion. Uploading through Connect also leaves a copy in the team's Connect storage, which delete_connect_files removes.

Input parameters:

- `destination` (string): printer folder to copy it into, e.g. /usb/; default is the printer's first storage
- `filename` (string): name on the printer; default is the local file name
- `local_path` (string, required): absolute path of a sliced file (.bgcode or .gcode) on this computer
- `overwrite` (boolean): replace a file with the same name on the printer (direct route)
- `plate_clear` (boolean): your own assertion that the plate is empty; nothing checks it, so make it true: look at get_camera_snapshot and read the image, or take the user's word. Required when the printer is FINISHED or STOPP…
- `printer` (string): printer name, serial number, or Connect UUID; optional with a single printer
- `then` (string): after uploading: none (just store it), print (start it right away), or queue (add to the Prusa Connect print queue); default none
- `via` (string): force a route: direct or connect; by default direct is used when the printer is reachable. Tools that only work one way (the camera, dialogs, the queue, history, run_gcode, download_printer_file) ref…

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/trevin-lee-prusactl/prusactl#diagnostics

## Score history

- 2026-10-23: 51
- 2026-10-22: 50
- 2026-10-21: 50
- 2026-10-20: 49
- 2026-10-19: 49
- 2026-10-18: 48
- 2026-10-17: 48
- 2026-10-16: 47
- 2026-10-15: 47
- 2026-10-14: 47
- 2026-10-13: 46
- 2026-10-12: 45
- 2026-10-11: 45
- 2026-10-08: 40
- 2026-10-05: 40
- 2026-10-04: 40
- 2026-10-03: 40
- 2026-10-02: 40
- 2026-10-01: 40
- 2026-09-30: 40
- 2026-09-29: 40
- 2026-09-28: 40

## Common questions

### What is the prusactl MCP server?

prusactl is an MCP server listed in the public MCP registry as io.github.trevin-lee/prusactl. Run a Prusa 3D printer: status, camera, files, printing, G-code, over PrusaLink or Prusa Connect. This page covers its MCPB bundle (https://github.com/trevin-lee/prusactl/releases/download/v0.3.0/prusactl.mcpb).

### Is the prusactl MCP server safe to use?

prusactl scores 51 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the prusactl MCP server expose?

prusactl exposes 28 tools: add_to_queue, api_request, connection_status, control_print, delete_connect_files, and 23 more. Their descriptions and schemas cost roughly 5,815 tokens of context every time the server is loaded.

### What licence is the prusactl MCP server under?

prusactl declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- Repository: https://github.com/trevin-lee/prusactl
- Changelog RSS feed: https://verifymcp.io/servers/trevin-lee-prusactl/prusactl.xml
- Changelog JSON feed: https://verifymcp.io/servers/trevin-lee-prusactl/prusactl.json
- HTML version of this page: https://verifymcp.io/servers/trevin-lee-prusactl/prusactl
