Atlas / MCP servers / mkebiclioglu / formlabs-local-mcp

formlabs-local-mcpCAUTION

mcp/mkebiclioglu/formlabs-local-mcp

MCP server for the Formlabs Local API (PreFormServer): prep and print Formlabs jobs from Claude Code and other MCP clients.

Verdict
CAUTION
Grade
B
Trust score
89 /100
Exposed tools
40 25r · 13w · 2d
Transport
stdio
License
MIT
Stars
0
01

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

Read from source at commit 16132845da96OBSERVED · 2026-10-12
02

Connect

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-code
claude mcp add formlabs-local-mcp -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "formlabs-local-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

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.

ToolRiskDescription
add_drain_holeswriteAdd hand-placed drain holes to one model. Each entry needs
auto_add_drain_holeswritePlace 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_layoutreadArrange models on the build platform. SLA printers only (machine types starting with FORM- or FRM). For SLS printers (Fuse) use auto_pack.
auto_orientreadRotate models to the orientation PreForm judges best for printing.
auto_packreadPack 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_supportreadGenerate support structures. Leave parameters unset for PreForm
create_scenewriteCreate a new scene for a printer and material. Returns the scene including its
delete_modeldestructiveRemove a model from the scene.
delete_scenedestructiveDelete a scene and its models. Deleting
detect_thin_wallsreadFind wall regions thinner than
discover_devicesreadScan the local network for Formlabs printers. Pass
duplicate_modelreadMake
estimate_print_timereadEstimate print time in seconds for the scene. Read material usage from get_scene.
fill_build_chamberreadDuplicate the given models until the SLS build chamber is full and pack them. SLS only; returns
fill_build_platformreadDuplicate the given models as many times as fit and lay the copies out. SLA only; returns
get_devicereadStatus of one printer: connection, tank and cartridge material, time remaining.
get_interferencesreadList pairs of model ids that overlap or sit closer than
get_modelreadGet one model
get_scenereadGet a scene: its models (ids, bounding boxes, supports), print settings, material usage and build volume.
get_userreadReturn the Formlabs account currently logged in (after
health_checkreadReturn the PreFormServer version. Call this first to confirm the server is reachable; it starts PreFormServer if needed.
hollow_modelwriteHollow models to save resin. Follow up with auto_add_drain_holes so resin can escape.
import_modelwriteImport a model file (STL, OBJ, 3MF, STEP) into a scene.
install_preform_serverwriteDownload the latest PreFormServer from Formlabs (about 170 MB), verify Formlabs
label_modelreadEmboss or engrave text onto a model
list_deviceswriteList 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_materialsreadList printers with their materials and print settings. Each material setting
list_printer_typesreadShort list of printer families with machine_type codes and build volumes. Use it to map a printer name (
list_scenesreadList every scene PreFormServer currently holds in memory.
load_formreadOpen an existing .form file as a new scene.
loginreadLog 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
logoutreadLog out of Formlabs Web Services.
pack_and_cagereadPack 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_printerwriteUpload the scene to a printer and queue it, or start it. Confirm with the user first.
replace_modelreadSwap a model
save_formwriteSave 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_filewriteExport the scene
save_screenshotwriteRender the scene to a .png or .webp at an absolute path.
update_modelwriteMove, rotate, rescale, rename or lock a model.
update_scenewriteChange a scene
04

Trust audit

CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (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)

MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/config.ts:199
const baseUrl = (explicitUrl || `http://127.0.0.1:${port}`).replace(/\/+$/, "");
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_model, delete_scene
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
test/zip.test.ts:33
[{ name: "../../.ssh/authorized_keys", data: "" }],
Why it matters. touches a credential store
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/installer.test.ts:45
"https://downloads.formlabs.com/PreFormServer/Release/3.62.1/../../x.zip",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/zip.test.ts:33
[{ name: "../../.ssh/authorized_keys", data: "" }],
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/zip.test.ts:36
[{ name: "PreFormServer/link", symlinkTo: "../../outside" }],
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:103
| `PREFORM_SERVER_URL` | `http://127.0.0.1:<port>` | Connect to a PreFormServer you run yourself (disables spawning). |
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:132
PREFORM_SERVER_URL=http://127.0.0.1:44388
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/config.test.ts:11
expect(cfg.baseUrl).toBe("http://127.0.0.1:44388");
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/config.test.ts:35
const remote = loadConfig({ ...base, env: { PREFORM_SERVER_URL: "http://10.0.0.5:44388/" } });
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/server, zod, @types/node, eslint, tsx, typescript, typescript-eslint, vitest
Why it matters. 8 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 16132845da96full audit observations/trust-audit/mcp-server/mkebiclioglu__formlabs-local-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1216132845da96CAUTIONB89first audit
06

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.

Advertisement