formlabs-local-mcpCAUTION
MCP server for the Formlabs Local API (PreFormServer): prep and print Formlabs jobs from Claude Code and other MCP clients.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
An MCP server for the Formlabs Local API. It lets Claude Code, Claude Desktop, Cursor and any other MCP client drive PreForm from a chat prompt:
"Import~/parts/bracket.stl, orient and support it for the Form 4 in Black V5, estimate the print time, then save it as~/jobs/bracket.form."
See it work: https://mkebiclioglu.github.io/formlabs-claude-skills/ (a downloaded bracket to a validated Form 4 job in one prompt; spin the result, compare materials)
Docs and the Claude Code plugin: https://mkebiclioglu.github.io/formlabs-claude-skills/docs.html
[](https://mkebiclioglu.github.io/formlabs-claude-skills/)
Install
Needs Node.js 20 or newer. Nothing else. Published on npm as `formlabs-local-mcp` with build provenance. Pin the version you tested with:
claude mcp add --scope user formlabs -- npx -y [email protected]
Using Claude Code? The plugin installs this server plus print-prep skills in one line, so you do not need the command above.
For other MCP clients, put the same command in their config:
{
"mcpServers": {
"formlabs": {
"command": "npx",
"args": ["-y", "[email protected]"]
}
}
}Then ask Claude to run health_check. If PreFormServer (Formlabs' headless PreForm) is not installed yet, the server says so and offers the install_preform_server tool, which downloads the current release from Formlabs, verifies Formlabs' code signature, and installs it into a folder you own. From a shell the same thing is:
npx -y [email protected] install-preform
If you already have PreFormServer.app in /Applications, it is picked up as is.
Commands
16132845da96OBSERVED · 2026-10-12Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.
claude mcp add formlabs-local-mcp -- npx -y [email protected]
{
"mcpServers": {
"formlabs-local-mcp": {
"command": "npx",
"args": [
"-y",
"[email protected]"
]
}
}
}Exposed tools (40)
25 read · 13 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
add_drain_holes | write | Add hand-placed drain holes to one model. Each entry needs |
auto_add_drain_holes | write | Place drain holes automatically on every model that cup detection flags. Runs detect_cups, then for each cupped model samples points under its bounding box and lets PreForm project them onto the surface (depth AUTO). Models without cups are skipped. A |
auto_layout | read | Arrange models on the build platform. SLA printers only (machine types starting with FORM- or FRM). For SLS printers (Fuse) use auto_pack. |
auto_orient | read | Rotate models to the orientation PreForm judges best for printing. |
auto_pack | read | Pack all models into the 3D build chamber. SLS printers only (machine types starting with FS or PILK; PreFormServer 3.63 refuses it for the Fuse X1, FUSX-1-0, where models stay where import_model put them). For SLA printers use auto_layout. |
auto_support | read | Generate support structures. Leave parameters unset for PreForm |
create_scene | write | Create a new scene for a printer and material. Returns the scene including its |
delete_model | destructive | Remove a model from the scene. |
delete_scene | destructive | Delete a scene and its models. Deleting |
detect_thin_walls | read | Find wall regions thinner than |
discover_devices | read | Scan the local network for Formlabs printers. Pass |
duplicate_model | read | Make |
estimate_print_time | read | Estimate print time in seconds for the scene. Read material usage from get_scene. |
fill_build_chamber | read | Duplicate the given models until the SLS build chamber is full and pack them. SLS only; returns |
fill_build_platform | read | Duplicate the given models as many times as fit and lay the copies out. SLA only; returns |
get_device | read | Status of one printer: connection, tank and cartridge material, time remaining. |
get_interferences | read | List pairs of model ids that overlap or sit closer than |
get_model | read | Get one model |
get_scene | read | Get a scene: its models (ids, bounding boxes, supports), print settings, material usage and build volume. |
get_user | read | Return the Formlabs account currently logged in (after |
health_check | read | Return the PreFormServer version. Call this first to confirm the server is reachable; it starts PreFormServer if needed. |
hollow_model | write | Hollow models to save resin. Follow up with auto_add_drain_holes so resin can escape. |
import_model | write | Import a model file (STL, OBJ, 3MF, STEP) into a scene. |
install_preform_server | write | Download the latest PreFormServer from Formlabs (about 170 MB), verify Formlabs |
label_model | read | Emboss or engrave text onto a model |
list_devices | write | List printers PreFormServer knows: discovered LAN printers (run discover_devices to refresh), Fleet Control queues and Dashboard printers after login, and its built-in virtual printers (connection_type VIRTUAL, one per model such as |
list_materials | read | List printers with their materials and print settings. Each material setting |
list_printer_types | read | Short list of printer families with machine_type codes and build volumes. Use it to map a printer name ( |
list_scenes | read | List every scene PreFormServer currently holds in memory. |
load_form | read | Open an existing .form file as a new scene. |
login | read | Log in to Formlabs Web Services for remote printing, Fleet Control and Dashboard printers. Credentials never pass through the conversation: set FORMLABS_USERNAME and FORMLABS_PASSWORD (or FORMLABS_ACCESS_TOKEN) in the MCP server |
logout | read | Log out of Formlabs Web Services. |
pack_and_cage | read | Pack models and build a printed cage around them so they stay together after SLS printing. SLS only; acts on the most recently created scene. |
print_to_printer | write | Upload the scene to a printer and queue it, or start it. Confirm with the user first. |
replace_model | read | Swap a model |
save_form | write | Save the scene as a .form file at an absolute path. Overwrites silently, so confirm with the user first if the file already exists. |
save_fps_file | write | Export the scene |
save_screenshot | write | Render the scene to a .png or .webp at an absolute path. |
update_model | write | Move, rotate, rescale, rename or lock a model. |
update_scene | write | Change a scene |
Trust audit
CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (2 observation(s))
- Network
- declared (6 observation(s))
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (11)
const baseUrl = (explicitUrl || `http://127.0.0.1:${port}`).replace(/\/+$/, "");delete_model, delete_scene
[{ name: "../../.ssh/authorized_keys", data: "" }],"https://downloads.formlabs.com/PreFormServer/Release/3.62.1/../../x.zip",
[{ name: "../../.ssh/authorized_keys", data: "" }],[{ name: "PreFormServer/link", symlinkTo: "../../outside" }],| `PREFORM_SERVER_URL` | `http://127.0.0.1:<port>` | Connect to a PreFormServer you run yourself (disables spawning). |
PREFORM_SERVER_URL=http://127.0.0.1:44388
expect(cfg.baseUrl).toBe("http://127.0.0.1:44388");const remote = loadConfig({ ...base, env: { PREFORM_SERVER_URL: "http://10.0.0.5:44388/" } });@modelcontextprotocol/server, zod, @types/node, eslint, tsx, typescript, typescript-eslint, vitest
Gates applied: no_behavioural_pass.
16132845da96full audit observations/trust-audit/mcp-server/mkebiclioglu__formlabs-local-mcp.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-12 | 16132845da96 | CAUTION | B | 89 | first audit |
Questions
What is the formlabs-local-mcp MCP server?
MCP server for the Formlabs Local API (PreFormServer): prep and print Formlabs jobs from Claude Code and other MCP clients.
What tools does formlabs-local-mcp expose?
40 in total: 25 read-only, 13 that write, and 2 that can delete or overwrite (delete_model, delete_scene). Every one is listed on this page with its risk.
Is formlabs-local-mcp safe to connect to an agent?
With care. The audit graded it B (89/100) and found 11 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does formlabs-local-mcp need?
No credential environment variables were found in its source, so it appears to need none.
How does formlabs-local-mcp run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as formlabs-local-mcp at 1.0.13.
How current is this page?
The grade is for one exact copy of the source (16132845da96), read on 2026-10-12. The repository is watched and re-audited when it changes.