{
  "markdown": "# FabTally MCP Server\n\nThe **first [MCP](https://modelcontextprotocol.io) server for real FDM 3D-printing\nslicing, quoting, and DFM / printability analysis.** Every other 3D-printing MCP just\ndrives a printer (OctoPrint, Bambu). None of them *slice*, *quote*, or run\n*design-for-manufacturability* checks — FabTally does.\n\nIt fronts the **FabTally agent API** (https://fabtally.com), which runs a **production\nslicing engine** against **12 calibrated FDM printer profiles** and **12 filament\nmaterials**, and exposes it as MCP tools so any MCP-capable agent (Claude Desktop,\nCursor, custom agents) can discover and call it.\n\n- **Two-angle design.** A human at a keyboard (Claude Desktop, ChatGPT Desktop — no crypto\n  wallet) gets **real answers with zero payment** from the everyday tools: `list_printers`,\n  `check_printability`, `analyze_model`, `get_print_quote`. These call FabTally's free,\n  rate-limited public endpoints. An autonomous agent with a wallet gets the heavier/exact\n  tools — `optimize_orientation`, `slice_model`, and the full (`full=true`) DFM report —\n  metered over [x402](https://www.x402.org) (USDC on Base). With no payment supplied, those\n  return the x402 *challenge* (price, network, asset, `payTo`) so the calling agent knows the\n  cost and can pay and retry.\n- This server holds **no private key** and **persists no models**. It only relays calls to\n  `https://fabtally.com/...`; uploaded models are streamed to the slicer, never stored.\n\n## Tools\n\n| Tool | Price | What it does |\n|---|---|---|\n| `list_printers` | **free** | Live 12-printer fleet (id, bed, nozzle), 12 materials, and x402 pricing tiers. **Call this first.** |\n| `check_printability` | **free** / premium $0.01 | DFM/printability report. Free geometry preview: printable verdict, watertight, wall-thickness estimate, overhang/support heuristic, fits-on-bed. `full=true` → premium, x402-metered full report with **exact** slice-derived support & material deltas. |\n| `analyze_model` | **free** | Geometry preview, no payment: bounding box (mm), volume (cm³), triangle count, watertight, fits-on-bed, plus a printable-so-far verdict as a bonus. |\n| `get_print_quote` | **free** (rate-limited) | Slicer-accurate FDM price quote: print time, filament grams, priced quote with volume discounts. Supports optional bring-your-own pricing (`currency`, `machine_rate_per_hour`, `margin`, `setup_fee`, `minimum_price`, `material_cost_per_kg`, `markup_percent`) — omit for FabTally's hobbyist defaults. |\n| `optimize_orientation` | premium, x402-metered $0.02 | Slices up to 4 orientations and recommends the one using the **least support material** (exact), with savings vs as-is. For autonomous agents with a wallet — unlimited, machine-speed. |\n| `slice_model` | premium, x402-metered $0.005–$0.02 | Full slice on any printer: time, filament, layers, geometry. Optional preview PNG (+$0.005) and/or G-code (+$0.01). For autonomous agents with a wallet. |\n\nThe free tools are rate-limited public endpoints — fine for a human exploring a design, not for\nhigh-volume or production integrations. For unlimited, machine-speed access, an autonomous\nagent with a wallet can pay per call via x402: the premium tools above, or `check_printability`\nwith `full=true` for the exact (slice-derived) DFM report.\n\n## The 12 printers\n\n| id | printer | bed X×Y×Z (mm) | nozzle |\n|---|---|---|---|\n| `elegoo-neptune4-max` | Elegoo Neptune 4 Max | 420×420×480 | 0.4 |\n| `bambu-a1` | Bambu Lab A1 | 256×256×256 | 0.4 |\n| `bambu-a1-mini` | Bambu Lab A1 mini | 180×180×180 | 0.4 |\n| `bambu-p1s` | Bambu Lab P1S | 256×256×250 | 0.4 |\n| `bambu-x1c` | Bambu Lab X1 Carbon | 256×256×250 | 0.4 |\n| `prusa-mk4` | Prusa MK4 | 250×210×220 | 0.4 |\n| `prusa-mini` | Prusa MINI | 180×180×180 | 0.4 |\n| `ender3-v3` | Creality Ender-3 V3 | 220×220×250 | 0.4 |\n| `creality-k1` | Creality K1 | 220×220×250 | 0.4 |\n| `creality-k1-max` | Creality K1 Max | 300×300×300 | 0.4 |\n| `voron-24-350` | Voron 2.4 350 | 350×350×325 | 0.4 |\n| `anycubic-kobra2` | Anycubic Kobra 2 | 220×220×250 | 0.4 |\n\n**Materials:** `pla`, `pla-cf`, `petg`, `petg-cf`, `abs`, `abs-cf`, `asa`, `asa-cf`,\n`nylon`, `pc`, `pet`, `tpu` (PLA/PETG/ABS/ASA + carbon-fiber variants, Nylon, PC, PET, TPU).\n`list_printers` always returns the authoritative live list.\n\n## Supplying a model file\n\nMCP tools can't take raw file uploads, so every model-consuming tool accepts the model **two\nways** — pick one:\n\n- **`model_url`** (preferred for local files) — a public `https` URL to an `STL` / `3MF` /\n  `OBJ` / `PLY` / `STEP` file. The server fetches it. (Try\n  `https://fabtally.com/sample-cube-20mm.stl`.) Got a file on your machine — Claude Desktop,\n  ChatGPT Desktop? Drop it at **https://fabtally.com/upload** (no account, drag-and-drop) to get\n  a short-lived URL back (auto-deletes in ~2 hours, nothing kept), then pass that URL as\n  `model_url`. That page also has a \"Get quote now\" button for an instant human-readable quote\n  with zero MCP involved.\n- **`model_base64`** + **`filename`** — the raw file bytes, base64-encoded, plus a filename\n  (e.g. `\"cube.stl\"`) so the file type is known. **Only reliable for small files (roughly\n  <50KB).** MCP clients truncate large inline tool-call arguments, so a real STL sent this way\n  can silently arrive as a corrupted fragment and produce garbage results (wrong dimensions,\n  bogus quotes) with no error. For anything bigger, use `model_url` via the upload bridge above.\n\n## Example tool calls\n\n```jsonc\n// 1) Discover printers/materials/pricing (free)\n{ \"name\": \"list_printers\", \"arguments\": {} }\n\n// 2) Free printability check on a hosted model\n{ \"name\": \"check_printability\",\n  \"arguments\": { \"model_url\": \"https://fabtally.com/sample-cube-20mm.stl\" } }\n\n// 3) Full DFM report (premium, x402-metered; returns x402 challenge unless x_payment is supplied)\n{ \"name\": \"check_printability\",\n  \"arguments\": { \"model_url\": \"https://example.com/bracket.stl\",\n                 \"full\": true, \"printer\": \"bambu-p1s\", \"material\": \"petg\" } }\n\n// 4) Price quote, base64 model, 10 parts (free, real result, no payment)\n{ \"name\": \"get_print_quote\",\n  \"arguments\": { \"model_base64\": \"<...>\", \"filename\": \"part.stl\",\n                 \"material\": \"pla\", \"quantity\": 10 } }\n\n// 5) Least-support orientation (premium, x402-metered, $0.02)\n{ \"name\": \"optimize_orientation\",\n  \"arguments\": { \"model_url\": \"https://example.com/handle.stl\", \"printer\": \"prusa-mk4\" } }\n\n// 6) Slice with a preview PNG (premium, x402-metered tier, $0.01)\n{ \"name\": \"slice_model\",\n  \"arguments\": { \"model_url\": \"https://example.com/gear.stl\",\n                 \"printer\": \"voron-24-350\", \"material\": \"abs\",\n                 \"quality\": \"standard\", \"include_preview\": true } }\n```\n\n## Install\n\n```bash\ncd fabtally-mcp-server\nnpm install\n```\n\n## Run (stdio — primary)\n\n```bash\nnode index.js\n# or, after `npm install -g .`:  fabtally-mcp\n```\n\nThe server speaks MCP over stdio. Point your MCP client at it.\n\n### Claude Desktop / MCP client config\n\n```json\n{\n  \"mcpServers\": {\n    \"fabtally\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/fabtally-mcp-server/index.js\"]\n    }\n  }\n}\n```\n\n## Run (Streamable HTTP — optional)\n\n```bash\nMCP_HTTP_PORT=8103 node http.js\n# POST MCP JSON-RPC messages to http://127.0.0.1:8103/mcp   (stateless)\n```\n\n## Configuration\n\n| Env var | Default | Purpose |\n|---|---|---|\n| `FABTALLY_BASE` | `https://fabtally.com` | Base origin of the FabTally API. |\n| `MCP_HTTP_PORT` | `8103` | Port for the optional HTTP transport (`http.js`). |\n| `MCP_HTTP_HOST` | `127.0.0.1` | Bind address for the HTTP transport. |\n\n## How paid calls work (x402)\n\n1. Call a paid tool (or `check_printability` with `full: true`) **without** `x_payment`.\n   You get `{ \"payment_required\": true, \"http_status\": 402, \"challenge\": { ... } }` containing\n   the x402 `accepts` entry (scheme `exact`, network `eip155:8453` = Base, asset USDC, atomic\n   `amount`, `payTo`).\n2. Build an x402 payment authorization (EIP-3009 `transferWithAuthorization` to `payTo`) for\n   that entry using your x402 client / wallet.\n3. Call the tool again with the resulting token in the **`x_payment`** argument. The server\n   forwards it as the `X-PAYMENT` header and returns the actual result.\n\nFree discovery is always at `GET https://fabtally.com/agent/overview`; the OpenAPI contract at\n`https://fabtally.com/openapi.json`; x402 discovery at `https://fabtally.com/.well-known/x402`.\n\n## Test\n\n```bash\nnode smoke-test.mjs   # lists tools, calls list_printers + check_printability, checks paid 402s\n```\n\n## License\n\nMIT · Sunstone Soft · https://fabtally.com\n",
  "bytes": 8578,
  "sha": "3116c8f1635017ad959df33ff1c75075324068de7fd9be54883261fd3589080f",
  "repo_slug": "zvmzaretsky/fabtally-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_fabtally_slicer_fc46f3b4/readme"
}