lineus-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LINEUS_HOST | No | Hostname or IP of the Line-us robot. Use the IP if mDNS is unreliable. | line-us.local |
| LINEUS_MOCK | No | Set to 1 to run without hardware. | |
| LINEUS_SWAP | No | Orientation fix. | 1 |
| LINEUS_CACHE | No | Where fetched doodles are cached. | ~/.cache/lineus-mcp |
| LINEUS_R_MAX | No | Envelope limit. | 1850 |
| LINEUS_R_MIN | No | Envelope limit. | 650 |
| LINEUS_SPEED | No | Default G94 speed, 2 (slow, sharp) … 30 (fast, rounded). | 5 |
| LINEUS_X_MIN | No | Envelope limit. | 650 |
| LINEUS_FLIP_U | No | Orientation fix. | 0 |
| LINEUS_FLIP_V | No | Orientation fix. | 0 |
| LINEUS_NIB_MM | No | Nib width for the preview. Set it when you change pens. | 0.5 |
| LINEUS_JOIN_EM | No | How close a cursive letter's exit must be to the next letter's entry to weld. | 0.13 |
| LINEUS_PREVIEW | No | Where the simulated preview is written. | ~/.cache/lineus-mcp/preview.png |
| LINEUS_TICK_MM | No | Simulated stroke-end tick at radius 1500 units; scales with reach. | 0.5 |
| LINEUS_TIMEOUT | No | Socket timeout in seconds. | 180 |
| LINEUS_BLEND_MM | No | Corner-blending window used by the simulated preview. | 1.5 |
| LINEUS_QD_BYTES | No | How much of a Quick, Draw! category file to read when fetching. | 600000 |
| LINEUS_MIN_SPEED | No | Floor for speed. Speed 1 can wedge the firmware. | 2 |
| LINEUS_PEN_DOWN_Z | No | How far down the pen goes. Not 0 — see the landing smear. | 300 |
| LINEUS_TRAVEL_SPEED | No | G94 P, pen-up step size. Proven not to affect mark quality, so it is pure throughput. | 30 |
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
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_statusA | Robot firmware banner, canvas size in mm, and current/last job. |
| preview_pathsA | Render polylines (canvas mm, [[ [u,v], ... ], ...]) without drawing. Returns the diagnostic view (pink = pen-up travel, grey box = page) and, with simulate=true (default), what the arm will actually put on paper. |
| draw_pathsA | Draw polylines given in canvas millimetres: [[ [u,v], [u,v], ... ], ...]. Each inner list is one pen-down stroke. Returns a job_id. speed: G94 S, the max step size for PEN-DOWN moves (1 finest/slowest .. 30 coarsest/fastest, default 5). Not a speed dial: it is interpolation granularity. Pen-UP travel is G94 P, set by LINEUS_TRAVEL_SPEED. order: how strokes are sequenced. "human" (default) top row first, left to right within a row, never reversed. Looks like a person drawing. Costs more pen-up travel (~2.8x on text) but this machine is slow enough that it rarely matters. "fast" nearest-neighbour, may draw a stroke backwards. Least travel, but it hops between rows and looks chaotic to watch. "asis" exactly the order supplied, untouched — you control the sequence. |
| preview_svgA | Render an SVG (paths/shapes, strokes only — fills are ignored) fitted into the box (x,y,w,h) in canvas mm (default: whole canvas). Returns a PNG. |
| draw_svgA | Draw an SVG fitted into box (x,y,w,h) in canvas mm, aspect ratio kept. Line art works best; fills are not hatched. Returns a job_id. |
| preview_textA | Render single-stroke (Hershey) text fitted into box (x,y,w,h) mm. Use \n for new lines. Prefer the HANDWRITING faces -- print: neutral architect pancakes delight casual; cursive (welded, one stroke per word): italienne cursive2 brush allure. call list_fonts() for the measurements. Hershey names still work but most of them retrace every stem. |
| draw_textA | Write text with a single-stroke Hershey font fitted into box (x,y,w,h) mm.
Prefer the handwriting faces: print |
| preview_sceneA | Render a declarative SCENE as a PNG without drawing. Prefer this over preview_paths: a scene is ~50x smaller than the coordinates it compiles to, and draw_scene given the SAME scene provably draws what you previewed. b", or [{"s":"a","font":"timesr"}, {"s":"b","font":"scriptc"}] with "font", "align" (left|center|right), "leading" (default 1.4) "svg" "..." "doodle" "cat", with "pick" (index), "source" (auto|bundled|web) -- real drawings from Google's Quick, Draw!, single strokes in the order a person drew them. Call doodles() first to SEE the candidates and choose a pick. Modifiers (any producer): "fill" {"hatch":deg, "spacing":mm (default 1.15), "cross":bool, "outline":bool} -- hatching is how you get solid black here "transform" {"translate":[dx,dy], "rotate":deg, "scale":s|[sx,sy], "about":[x,y]} "box"/"fit" [x,y,w,h] scale this shape into a box "repeat" N, with i (0..N-1) and n available in the expressions |
| draw_sceneA | Draw a declarative scene (same object as preview_scene -- see it for the shape language). Compilation is deterministic and content-hashed, so passing the scene you previewed draws exactly what you saw. Returns a job_id and the scene_id. |
| plan_sceneA | Compile a scene and report what it would cost, WITHOUT drawing or rendering: stroke/point counts, bounding box, pen-up travel and any warnings. |
| list_fontsA | Every typeface available to text, draw_text and a scene's "text" producer. Two families, and the difference matters on paper: HANDWRITING (fonts/, SIL OFL) -- real single-line handwriting faces, print and
cursive. Each letter is drawn ONCE. Prefer these.
HERSHEY -- the classic 1967 engraving set, kept for compatibility. Its bold and serif
faces fake weight by RETRACING every stem (a capital H in Three measurements decide whether a face works here, and they catch different
failures -- all three were learned the hard way on paper:
passes strokes per letter vs a human's. Catches retracing.
aperture the width of a letter's opening (the gap in s/a/e/o/g) against the 1-2 mm
the firmware's corner blending eats. Catches letters that close into blobs:
|
| get_exampleA | Worked example scenes: finished drawings that went through several rounds of critique on this machine. With no name, lists them. With a name, returns the scene -- pass it to preview_scene as-is, or modify it ("the cat, lying down") rather than starting from nothing. Each carries a _comment explaining what made it work. |
| doodlesA | Real doodles from Google's Quick, Draw! dataset (CC BY 4.0): single strokes, in the order a person drew them, so line width comes from the pen alone. With no category: the curated categories bundled with the server, and every category that can be fetched from the web (345 in all). With a category: a NUMBERED CONTACT SHEET of candidates. Look at it and choose a pick, then use {"doodle": category, "pick": N, "box": [x,y,w,h]} in a scene. source: "auto" (default) uses the curated set if the category has one, else fetches from the web; "web" always fetches -- more variety, NO human review; "bundled" never goes online. Fetched categories are cached on disk, which keeps preview and draw identical. Web candidates are ranked automatically but many are still scribbles or have the word written in them: that is what the contact sheet is for. Draw with order="asis" to replay a doodle exactly as its author drew it. |
| get_jobC | Progress of a drawing job. |
| abortB | Stop the current drawing, lift the pen and go home. |
| homeA | Lift the pen and move the arm to its home position. |
| draw_orientation_testA | Draws a frame around the canvas plus an 'F' in the top-left corner so a human can confirm the canvas orientation (F must read normally, top-left). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| examples_resource | Index of worked example scenes -- finished drawings to start from. |
TDQS
Scored across 17 tools
The preview_*/draw_* pairing gives each tool a clear render-vs-execute role, and distinct modalities (paths, svg, text, scene) separate the rest. Some overlap remains: preview_scene explicitly supersedes preview_paths and its text producer overlaps preview_text/draw_text, but the descriptions steer the agent well.
The dominant pattern is verb_noun (get_status, get_job, preview_paths, draw_scene, plan_scene, list_fonts, get_example). A few deviate (bare 'abort', 'home', and the noun 'doodles'), but overall it is predictable and readable.
17 tools is on the heavier side but each preview/draw pair and helper (plan_scene, list_fonts, get_example, doodles) earns its place. Nothing feels redundant or padded.
Strong lifecycle coverage: status/job monitoring, abort/home, orientation calibration, four input modalities with preview and execute, plus cost planning, font enumeration, examples, and doodle sourcing. Minor gaps like explicit queue management or pen/feed control are easy to work around.