Skip to main content
Glama
MaxEllis

orcaslicer-mcp

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ORCA_API_URLNoURL of the OrcaSlicer MCP build's local API. Set only if you changed the port or if OrcaSlicer runs on another machine with LAN access enabled.http://127.0.0.1:13130
ORCA_API_TOKENYesThe API token from OrcaSlicer Preferences > Remote API, used to authenticate to the local API.
ORCA_MCP_NOTES_DIRNoDirectory for persistent notes saved with `remember`. Defaults to ~/.orcaslicer-mcp/notes/.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_statusA

Snapshot of the current OrcaSlicer session: app and project info, the active print/filament/printer presets with which of their keys are modified (dirty), whether the last slice is still valid, and whether a slice is running. Read-only.

Call it first to orient before slicing or editing, to see which settings drift from their preset, or to check slice_result_valid before trusting earlier stats.

get_configA

Read merged config values (optionally filtered to keys).

set_configA

Apply config changes to the active project as unsaved overrides, atomically: if any key is invalid the whole batch is rejected and nothing changes. Returns {applied, errors}.

Overrides show as modified in get_status, are not written to any preset file, and revert if the preset is reselected; call save_preset to persist them. Each apply invalidates the last slice, so re-slice afterwards. It does not run the physics gate, so for temperature, speed, acceleration, or flow keys run check_profile_physics before trusting the result. To edit a stored preset rather than the live project, use edit_preset.

sliceA

Start slicing the current plate in the background and return immediately, without waiting for the result. The reply is 'started' (a slice began), 'already_valid' (the plate is unchanged and the last result still holds), or a conflict if a slice is already running.

Fire-and-forget: poll get_slice_status for progress and stats, or cancel_slice to stop it. Prefer slice_and_wait when you want the finished stats back in one call.

get_slice_statusA

State of the current or most recent slice: state (slicing, done, error, or idle), stats (print time and filament use when done), and any warnings or errors. Read-only.

Poll this after slice to follow progress and read the result; 'idle' means no slice has run or it was cancelled. For only the pass/fail warnings use get_slice_warnings; for a per-feature time and filament breakdown use get_slice_breakdown.

get_slice_warningsA

Just the warnings/errors from the last (or current) slice, plus validity - the fast 'did anything go wrong' check and the way to confirm a fix cleared.

NOTE: only as complete as the API exposes. On the current fork build this may report valid with an empty warnings list even when the GUI shows a plate-boundary toast - the fork must populate the plater warning list (tracked as the fork batch). Once it does, this reports the real warnings with no change here.

get_slice_breakdownA

Per-feature breakdown of the last slice + a stateless predicted-vs-observed flow check.

Returns per-role time/filament + speed/flow ranges, global time-weighted metric distributions, per-layer aggregates, and a prediction_check flagging where the profile's speed was silently throttled at the flow ceiling ('clamped'). Answers 'which feature is the time hog' directly instead of by trial slicing.

Degrades to {"available": false, "reason": ...} on fork builds that don't emit the breakdown, or when there is no valid slice.

cancel_sliceA

Abort a running slice, or unwedge a stale 'slicing' state (e.g. after an object outside the bed). Safe when idle.

slice_and_waitA

Slice the current plate and block until it finishes, then return the final stats and warnings in one call. If the plate is already sliced and unchanged, it returns the existing result without re-slicing.

This is the usual way to slice when you want the outcome immediately. For a non-blocking start, use slice then poll get_slice_status; to sweep one setting across values, use compare_settings.

apply_and_sliceA

Apply config overrides and then slice in one step, returning {applied, errors, result} with the resulting stats and warnings. The changes are atomic (any invalid key rejects the whole batch) and unsaved, exactly like set_config, so they revert if the preset is reselected.

Use this to test the effect of a tweak in a single call. Use set_config then slice_and_wait to keep the steps separate, or compare_settings to try several values of one key.

compare_settingsA

For each value of key, slice and collect stats/warnings; restore the original when done.

Non-destructive: the original value of key is put back even on error.

compare_slicesA

Slice the current plate under several named variants and compare the cost of each.

Each variant is {"name": str, "changes": {setting: value}}; changes={} means the current config as-is (a natural baseline row). Applies each variant over the ORIGINAL config (resetting between variants, so they don't stack), slices it, then restores your config exactly as it was - nothing is left changed (slice validity is left false, as after any un-resliced edit).

Returns a ready-to-relay headline and table_markdown, plus structured variants. All deltas and percentages are ALREADY computed and rounded against baseline (defaults to the changes={} variant, else the first) - relay them as given rather than recomputing. recommended names one pick; recommended_is_dominant says whether it beats every variant on every axis (time, filament, warnings) or is only the fastest warning-free option amid a genuine trade-off (tradeoff then names the frontier).

Each variant is a full slice (minutes); capped at 8. Set detail=True only when a per-feature (wall/infill/support) split is wanted - it grows the response ~N x. With more than ~5 variants, lead with the recommendation and the extremes, not all rows.

list_objectsA

List objects on the current plate: id (stable), name, size_mm, and transform (offset/rotation/scale).

set_object_configA

Set per-object config overrides on an object by id, e.g. {"wall_loops": 4, "sparse_infill_density": "30%"}. Atomic (nothing applied if any key is invalid).

duplicate_objectA

Duplicate an object on the plate by id (adds a copy, offset from the original).

delete_objectA

Remove one object from the current plate by id. This is permanent within the session and cannot be undone through the API; the other objects keep their ids.

Call list_objects first to get the id. Deleting leaves the last slice invalid, so re-slice afterwards. To drop just one copy made with duplicate_object, pass that copy's id.

transform_objectA

Move/rotate/scale an object by id. translate=[dx,dy,dz] mm (relative), rotate=[rx,ry,rz] degrees (relative), scale=[sx,sy,sz] absolute factor. Provide at least one.

arrange_plateA

Auto-arrange all objects on the plate (async job; poll get_job_status until idle).

auto_orientA

Auto-orient all objects for printing (async job; poll get_job_status until idle).

get_job_statusA

Whether the plate's background job worker is idle or still running. Read-only.

arrange_plate and auto_orient start async jobs; poll this until it reports idle before you read object positions or slice, so you act on the settled layout rather than a mid-move state.

watch_eventsA

Collect live events (slice.*/config.changed/project.opened) over a bounded window.

find_config_keysA

Find config keys containing substring (helps discover among the ~600 keys).

diagnose_plateA

One-call plate diagnosis: app/slice status, objects on the plate, bed + active skirt/brim/clearance settings, and the last slice's warnings - so you don't have to chain status->objects->config. Start here for 'why won't this slice / fit'.

Slice warnings are only as complete as the fork exposes today (see get_slice_warnings). For a 'does it fit the bed' estimate, pair with check_placement.

check_placementA

Estimate whether every object (plus its skirt/brim ring) fits inside the printable area. Returns per-object fit, expanded first-layer bbox, per-edge clearance (mm), and overflow.

APPROXIMATE: uses the object footprint from size+offset, not the sliced toolpath (skirt arcs, half-line-width, travel/wipe excluded); single-instance objects only. At ~mm margins the true verdict needs get_slice_warnings - this is a fast first-pass.

consultA

Retrieve curated slicing knowledge + saved context notes for a topic, symptom, or intent. ALWAYS call before deriving or changing settings for a user goal. Composes principles per situation - never returns preset bundles. Falls back to find_config_keys/web search if empty.

When recommending, present 2-3 concrete options quantified with predicted print time and filament mass from real slice results (slice + status tools) - never adjectives alone.

check_profile_physicsA

Deterministic pre-save gate: fetches the live config, overlays optional proposed changes, and runs flow/temperature/geometry/cooling math. RUN THIS BEFORE save_preset. verdict=blocked means DO NOT SAVE.

rememberA

Persist a context fact for future sessions. scope: 'machine:/', 'user', or 'project:'. Local plain files; user-readable and deletable.

describe_settingA

Authoritative definition of one OrcaSlicer setting: label, tooltip, type, unit, valid range, enum values, and default. Read-only and offline, so it works even when OrcaSlicer is not running.

Use it to learn a setting's exact type and allowed values before writing it with set_config or edit_preset. To find candidate keys by keyword first, use search_settings.

search_settingsA

Search settings by keyword across key/label/tooltip; returns compact matches (key, label, category, short tooltip), ranked key/label first. Offline.

load_modelA

Load a model file (path on the OrcaSlicer host) onto the current plate. Accepts .stl/.obj/.3mf, plus .step/.stp on fork v2.3.2-mcp.3+. Large STEP files can take a minute to tessellate; the call waits.

select_presetA

Make the named preset the active one for its group (print, filament, or printer).

Selecting a preset discards unsaved set_config overrides and reverts settings to the preset's stored values, so it is also the canonical way to reset dirty config; it leaves the last slice invalid, so re-slice afterwards. Use list_presets for valid names, and save_preset first if unsaved edits should survive the switch.

save_presetA

Save the currently edited settings as a named user preset (create or update, visible in the GUI immediately). type = print|filament|printer. detach=True saves it standalone instead of inheriting the current base preset.

Run check_profile_physics first; do not save when verdict=blocked.

list_presetsA

List print/filament/printer presets with system/selected/visible flags.

F12: by default returns only USER presets plus whatever is currently SELECTED - the built-in system presets are ~400 entries of noise. Pass include_system=True for the full list, and/or type='print'|'filament'|'printer' to restrict to one category. hidden_system reports how many system presets were filtered out.

set_layer_heightA

Variable layer height for one object. mode='adaptive' (quality 0..1, higher = finer detail) generates an adaptive profile; mode='reset' (aliases: 'default', 'none') restores uniform layers.

set_height_rangeA

Override the layer height over a Z band of one object (e.g. 0 to 5 mm printed at 0.1 mm for finer detail near the base). Passing the same min_z and max_z again updates that band's height; clear=True removes every band on the object.

Bands are per-object and invalidate the last slice, so re-slice afterwards. For a single height across the whole object use set_layer_height instead. Get the id from list_objects.

get_preset_configA

Read the full settings of a named preset without selecting it. type = print|filament|printer.

delete_presetA

Delete a USER preset (system presets and the currently-selected one are refused). type = print|filament|printer.

edit_presetA

Edit a named preset's settings and persist them: selects it, applies the changes atomically, saves under the same name. Runs the check_profile_physics gate first (F15) and refuses with error=physics_blocked if the changes would INTRODUCE a failing physics check (pre-existing failures do not block unrelated edits).

rename_presetA

Rename a user preset by copying it to new_name, selecting the copy, and deleting the original. Only user presets can be renamed; system presets are read-only.

Because it selects the renamed preset, this leaves it active and discards unsaved config overrides, the same as select_preset, and leaves the last slice invalid, so re-slice afterwards.

get_gcodeA

Retrieve the last successful slice's G-code as text.

describe_plateA

Machine-readable plate facts from the last slice's G-code, per object, so you can answer orientation and placement questions instead of guessing from Euler angles or a picture: how the part stands (flat / tilted / on an edge or corner, from first-layer contact versus its widest layer), the first-layer footprint as islands, where overhang extrusions concentrate by 10 mm height band, where support stands and where its interface touches the part, and which side the outer-wall seams sit on (checked against seam_position). Each object gets a server-written summary sentence; relay it rather than recomputing. Read-only. Needs a valid slice; returns {"error": "not_sliced"} otherwise. Copies of one object are aggregated (Orca labels every copy 0); footprint islands still show per-copy contact. The parsed result is cached per slice (the G-code itself is still downloaded each call to detect a new slice). All bboxes are [x0, y0, x1, y1] in plate millimetres.

save_gcodeA

Save the last successful slice's G-code and record the slice (model, geometry, full settings snapshot) under that filename, so that when klipper-mcp later prints this exact file the real outcome joins back to these settings. Returns the saved path; hand it to klipper-mcp's start_print. Default filename: _.gcode. Never overwrites an existing file — a name collision gets a -2, -3, ... suffix. Writes into a gcode folder under PRINT_OUTCOMES_DIR if set, else under the shared print-outcomes folder (~/projects/_shared/print-outcomes) if it already exists, else under ~/.orcaslicer-mcp; the gcode folder itself is created if missing. If the shared outcome store is not present, or the store write fails, the file is still saved and outcome_recorded is False.

recall_printsA

How did past prints of THIS model actually turn out? Matches the current plate by geometry (or by model_name if given / the slicer is offline), returning each past print's result (success/cancelled/error), your recorded verdict (e.g. 'warped'), and the settings it was sliced with. Call this BEFORE slicing and tell the user anything relevant (a past warp, a failed layer height). Read-only. Returns available=false and nothing else when no outcome store exists. If neither geometry nor name matches, it returns the most recent prints of ANY model with matched_by='recent'; never attribute those to the current model.

render_plateA

Render a PNG picture of the current plate so you can SEE it.

view="editor": the models on the bed BEFORE slicing - use to check orientation, plate contact, and first-layer footprint (an Euler triple is near-unreadable; this is the ground truth). view="preview": the sliced toolpaths colored by feature role AFTER a successful slice - support is visibly distinct, so use it to check where support actually went. angle: iso|top|front|left|right|rear|bottom. frame: "plate" zooms out to the whole bed (where the part sits, footprint), "object" zooms in on the model/toolpaths (detail). Defaults to "plate" for the editor view and "object" for the preview view; pass it explicitly when a side view of a small part would otherwise be a speck on a big bed.

Prompts

Interactive templates invoked by user choice

NameDescription
slice-a-modelGuided load -> check -> slice -> read-back workflow for one model file.
optimize-print-timeData-driven print-time reduction from a real slice breakdown, never adjectives alone.
edit-preset-safelyPreset change with the physics gate: consult -> set_config -> check_profile_physics -> save_preset.

Resources

Contextual data attached and managed by the client

NameDescription
knowledge_index_resourceIndex of the curated slicing knowledge base shipped with this server; each entry lists its orca://knowledge/{slug} URI.

TDQS

A4/5.0

Scored across 44 tools

Disambiguation3/5

Some tools overlap heavily: find_config_keys vs search_settings, get_slice_status vs get_slice_warnings vs diagnose_plate, and compare_settings vs compare_slices all have similar intents. The descriptions are detailed enough to tell most apart, but an agent must read carefully to avoid picking the wrong tool.

Naming Consistency4/5

The vast majority of names follow a consistent snake_case verb_noun pattern like list_objects, set_config, and save_preset. A few bare-verb outliers such as consult, remember, and slice are minor deviations rather than a systemic inconsistency.

Tool Count2/5

44 tools is well beyond the heavy band and makes the surface daunting for an agent to navigate. Many near-duplicates could be consolidated, such as the three slice-invocation variants and the two key/setting search tools.

Completeness4/5

The tool set covers the full slicing workflow well: object management, configuration, presets, slicing, comparison, G-code retrieval/saving, and print outcome recall. Minor gaps like reading back per-object overrides or managing project files exist but do not create dead ends.

Maintenance

ActivityActive
ResponsivenessSlow