An MCP server that encodes 100+ barcode symbologies (via bwip-js) and
decodes all the common 1D/2D formats (via zxing-wasm), with zero native
dependencies. Node runtime, served over both stdio and streamable HTTP.
Plus an ASCII/Unicode terminal QR for output that needs no image channel.
The funnel is asymmetric on purpose: encode 100+, decode the common set, round-trip-verified where both overlap. We do not claim "decode anything."
| Direction | Library | Coverage |
|---|---|---|
| Encode | bwip-js |
100+ symbologies (full BWIPP) |
| Decode | zxing-wasm |
~20 common 1D/2D (QR, Micro QR, DataMatrix, Aztec, PDF417, MaxiCode, Code128/39/93, EAN/UPC, ITF, Codabar, DataBar) |
| Terminal QR | qrcode |
block-character QR, pure text |
| Tool | Purpose |
|---|---|
encode_barcode |
Render a barcode (bcid + text + typed common options + freeform options bag). Returns a PNG. |
encode_qr_terminal |
Encode data to a block-character QR. style: unicode (default, safe in codeblocks/logs) or ansi (live TTY). |
decode_barcode |
Detect + decode 1D/2D barcodes from an image (base64 / path / url; PNG or JPEG). |
decode_batch |
Decode many images in one call; per-item results, isolated errors. |
decode_pdf |
Rasterize a PDF (mupdf WASM) and pull every barcode, tagged with page number. |
gs1_parse |
Parse a decoded GS1 string into structured Application Identifiers (GTIN, dates, batch, serial, weights…). |
verify_barcode |
Encode → decode the render → assert the payload round-trips. Self-verifying label QA. |
list_symbologies |
Supported symbologies flagged encode / decode / both. |
list_symbology_options |
Valid encode options for a bcid, segmented specific / common / sizing. Discover the options bag's keys before encoding. |
npx @cordfuse/barcoding-mcp # stdio transport (default)
npx @cordfuse/barcoding-mcp --http # streamable HTTP on :3900MCP client config (stdio):
{
"mcpServers": {
"barcoding": { "command": "npx", "args": ["-y", "@cordfuse/barcoding-mcp"] }
}
}docker run -p 3900:3900 ghcr.io/cordfuse/barcoding-mcp:latest
# or, from a checkout:
docker compose -f docker/compose.yaml upServes streamable HTTP at http://<host>:3900/mcp, with a liveness probe at
/health. Port is settable via the PORT env. stdio is per-invocation and not
containerised — the image is the HTTP endpoint.
barcoding-mcp/
packages/
mcp/ @cordfuse/barcoding-mcp (the server) → packages/mcp/README.md
docker/ Dockerfile + compose.yaml (the --http server)
.github/ CI + release workflows
npm workspace; node_modules hoists to the root.
npm ci # install (root)
npm run build -w @cordfuse/barcoding-mcp # tsc + copy option catalog into dist
npm test -w @cordfuse/barcoding-mcp # node:test smoke suite
npm run gen:options -w @cordfuse/barcoding-mcp # regenerate the option catalog from bwip-jsThe list_symbology_options catalog is generated from bwip-js's own sources
(dist/bwip-js-gen.d.ts for common options, barcode.ps for the per-symbology
option preambles) into packages/mcp/src/data/symbology-options.json.
- CI (
.github/workflows/ci.yml) — typecheck + build + test on Node 20 & 22 for every push and PR tomain. - Release (
.github/workflows/release.yml) — pushing av*tag publishes:- the npm package
@cordfuse/barcoding-mcp(guards that the tag matches the package version), and - the Docker image
ghcr.io/cordfuse/barcoding-mcp:<version>+:latest.
- the npm package
npm version patch -w @cordfuse/barcoding-mcp
git commit -am "release vX.Y.Z" && git tag vX.Y.Z && git push --follow-tagsSecrets: npm publish needs the org NPM_TOKEN (this repo must be on the
org token's selected-repo allow-list). GHCR uses the built-in GITHUB_TOKEN
(packages: write) — no secret required.
MIT