Local-first image-to-SVG + PDF/Office toolkit that measures its own output. Nothing uploaded.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Measurable raster β SVG conversion β and a broad image + document toolkit. Ten raster formats, every one convertible to every other, with the accuracy of every conversion actually measured rather than asserted; plus PDF & Office (docx/xlsx/pptx) rendering and conversion, images β PDF, DXF at a real physical cut size alongside EPS and G-code for makers, centerline tracing and content-aware crop β most of it in a zero-dependency core that is CI-proven to bundle for a browser.
On flat artwork β logos, icons, UI, screenshots, pixel art β the output is bit-exact: SSIM 1.0000, PSNR β, zero differing pixels, and on a real logo smaller than imagetracerjs or vtracer manage while still only approximating β 24 KB against their 60 and 64. That comes from recognising the image is cheaper to encode exactly than to approximate, not from a better curve fit. Tracing now emits real curves by default β sub-pixel edge placement is on, which is the only thing that lets the curve fitter run at all; before this the default returned a staircase with zero curve commands on real artwork. It costs about 2.35x the gzipped bytes, because moving coordinates off the integer lattice costs compression, and --no-subpixel buys the old smaller output back. Pixel and exact modes are untouched and stay bit-exact. potrace is smaller than everyone and much less accurate, which is a real trade and not one this README will hide. On real photographs it leads all three on SSIM by 0.05β0.18 at their default settings; one documented vtracer flag closes part of that. It is not the fastest β imagetracerjs is quicker on every fixture measured. Every number in this README is reproducible: node scripts/fetch-corpus.mjs && npm run compare. (The corpus is fetched rather than committed β the photographs are not ours to redistribute.)
βΆ Vecline Studio β vecline.xyz β the whole toolkit in your browser. Drop an image, a PDF, or a TGA/PNM/ICO no browser can read; tune it; watch live SSIM / PSNR / CIEDE2000; export SVG, DXF at a real cut size, EPS, PDF, G-code, React/Vue/Svelte/Solid components, colour separations, sprite sheets, favicons, BlurHash, or just re-encode between ten raster formats. Free, unlimited, no signup, works offline, and nothing is uploaded β every conversion runs in your tab, not on a server. (How it compares Β· dev playground)
--lossless returns a bit-exact SVG or it fails. It never silently gives you a near-miss.
That is enforced by measurement, not by construction. Every candidate encoding is rendered back to pixels and compared against the source; anything that is not bit-identical is discarded, and if nothing survives, the command errors out. Candidates are tried in order of how useful the result is:
Measured across every fixture in the test suite β flat artwork, pixel art, soft alpha, photographs, JPEG sources, a single pixel β all of them come back PSNR β, maxChannelDiff 0.
When the original file is preserved, the SVG records its SHA-256. extract hands the file back and checks the digest:
extract exits non-zero on any mismatch, so it works as a CI gate. Note the honest caveat: an embedded JPEG survives byte for byte but does not render bit-identically, because resvg's decoder rounds its inverse DCT differently. Strict --lossless detects that, discards the candidate, and says so.
| Input | Result | Size | Exact? |
|---|---|---|---|
| Flat artwork 400Γ300 | real geometry (contours) | 3.9 KB | β |
| Pixel art 128Γ128 | real geometry (rectangles) | 0.6 KB | β |
favicon.ico 64Γ64 | real geometry (rectangles) | 0.5 KB | β |
| BMP 400Γ300 | real geometry (contours) | 3.9 KB | β |
| Photo 320Γ240 | embedded PNG | 230 KB | β |
A photograph can be emitted as exact geometry, and --prefer geometry will do it β but it costs one rectangle per pixel, so that same photo becomes a 1.99 MB file of 42,933 shapes. It is vector in name only, so auto uses the bitmap and tells you the ratio it measured. Nothing is hidden.
Most vectorizers claim perfect accuracy. Here is what is actually true, because it determines which tool you should use:
| Direction | Can it be exact? | Why |
|---|---|---|
| SVG β raster | Yes, at any resolution you name | Rendering is a well-defined computation. Ask for 4000px wide and you get exactly that, correct to the renderer's rasterisation rules. |
| Raster β SVG, lossless | Yes | Two different ways, both bit-exact. See pixel and embed below. |
| Raster β SVG, traced into curves | No, and it never can be | A photograph holds more independent information than any compact set of BΓ©zier curves can encode. Tracing is approximation by definition. |
Anyone promising exact photo-to-curves vectorization is either embedding a bitmap and calling it vector, or is wrong. Vecline does both exact conversions properly, does the approximate one well, and always tells you which one you got and how close it landed.
| Mode | Output | Exact? | Use it for |
|---|---|---|---|
lossless | Real geometry, or an embedded bitmap | Bit-exact, verified | Anything, when exactness is non-negotiable |
pixel | Real vector geometry (rectangles or contours) | Bit-exact | Logos, icons, pixel art, screenshots, diagrams, flat colour |
trace | Real BΓ©zier curves | Approximate, measured | Photos, complex art, anything you want to scale or edit |
embed | Bitmap inside an SVG wrapper | Bit-exact | You need this exact image, in an SVG container |
auto (the default) inspects the image and picks between pixel and trace. --lossless overrides everything with the guarantee described above.
pixel mode is the one people don't expect. It produces genuine, editable, infinitely-scalable vector paths that rasterise back to your input with zero differing pixels β not "visually identical", literally identical. For flat artwork it is usually what you actually wanted.
Node.js 18.17+. The native dependencies (sharp, resvg) ship prebuilt binaries for Linux, macOS and Windows.
| You want | Import | Native deps |
|---|---|---|
| The full Node toolkit | import { vectorize } from 'vecline' | yes |
| β¦ from CommonJS | const { vectorize } = require('vecline') | yes |
| Just the vectoriser | import { trace } from 'vecline/vectorize' | none |
| Just the metrics | import { compareImages } from 'vecline/metrics' | none |
| Just the pure-TS codecs | import { encodeBmp } from 'vecline/formats' | none |
| Everything portable | import { vectorizeExact } from 'vecline/core' | none |
| Image editing (resize, rotateβ¦) | import { editImage } from 'vecline/ops' | sharp only |
| Register a custom codec | import { registerDecoder } from 'vecline/codecs' | none |
Install only what you use. Every none subpath imports in isolation with the native codecs omitted (npm install vecline --omit=optional), and the package is "sideEffects": false, so a bundler drops everything you never import. vecline/core is the vectorisation and measurement engine with zero dependencies and no Node built-ins. It takes a plain { width, height, data } β byte-for-byte the layout of the browser's ImageData β so canvas pixels go straight in:
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/vecline)<a href="https://allmcps.com/mcp/vecline"><img src="https://allmcps.com/api/badge/vecline?style=directory" alt="Vecline on AllMCPs" /></a>