@bestimmaa/posprint-mcp
This server lets you print markdown content to a POS (point-of-sale) receipt printer via a CUPS URI, using a two-step confirmation flow.
Preview before printing: Call the
printtool withmode=previewto get a preview snippet, line count, and a confirmation token — without sending anything to the printer yet. Receive an excessive length warning if the markdown exceeds 80 lines.Confirm and print: Call the
printtool again withmode=confirmand theconfirmationTokento actually send the job to the printer.Target specific printers: Provide a CUPS/IPP printer URI, or omit it if a default is configured via the
PRINTER_URIenvironment variable.Control print options: Optionally specify the number of copies and a timeout (in milliseconds) for the print job.
Receive job metadata: Upon successful confirmation, get details like the printer URI, duration, timestamp, and an optional job ID.
Error handling: Returns specific error codes for validation, printer, or timeout issues.
Remote access: Can run as an HTTP server with an authentication token for remote clients, plus an unauthenticated health check endpoint.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@bestimmaa/posprint-mcp print receipt for order #123"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@bestimmaa/posprint-mcp
MCP server for POS printer receipts using @bestimmaa/posprint.
The tool is intentionally named print so clients can map natural user phrasing such as "print receipt", "hard copy", or "print this out" to the same operation.
Requirements
Node.js 20+
A printer reachable via a CUPS URI supported by
@bestimmaa/posprint
Related MCP server: Yamato Printer MCP Server
MCP Client Configuration
Add this to your MCP client config. No separate installation step is required — npx fetches the package on first run.
{
"mcpServers": {
"posprint": {
"command": "npx",
"args": ["-y", "@bestimmaa/posprint-mcp"]
}
}
}Global Install (optional)
npm install -g @bestimmaa/posprint-mcpAfter global installation, you can use the shorter form in your MCP client config:
{
"mcpServers": {
"posprint": {
"command": "posprint-mcp"
}
}
}Docker (remote MCP server)
For clients that can only talk to a remote MCP server (e.g. Notion custom agents), run posprint-mcp in a Docker container over HTTP instead of stdio. The image defaults to MCP_TRANSPORT=http.
Configuration via .env
Copy .env.example to .env and fill in your values — .env is gitignored, so real tokens/URIs never get committed.
cp .env.example .env
# edit .env: set POSPRINT_AUTH_TOKEN (e.g. `openssl rand -hex 32`) and PRINTER_URI
docker compose up -d --builddocker-compose.yml reads .env automatically (both for the container's env vars and the host port mapping). To run without Compose, pass the same file to docker run directly:
docker build -t posprint-mcp .
docker run -d --name posprint-mcp -p 3000:3000 --env-file .env posprint-mcpThe server listens on POST /mcp (MCP Streamable HTTP transport, stateless) and GET /healthz (unauthenticated health check). It refuses to start if POSPRINT_AUTH_TOKEN is unset, since an unauthenticated remote endpoint would let anyone on the network print to your printer.
Point your remote MCP client at http://<host>:3000/mcp with header-based auth:
Authorization: Bearer <POSPRINT_AUTH_TOKEN>Note: the container needs network access to your printer's CUPS/IPP endpoint (typically on your LAN), so run it on a network that can reach it (e.g. --network host, or a bridge network with routing to the printer's subnet).
.local (mDNS) hostnames will not resolve inside the container — most base images (including this one) have no mDNS support, so a PRINTER_URI like ipp://myprinter.local:631/... will fail to connect. Use one of:
The printer's static/reserved IP address, or
A regular DNS name if your router provides one (e.g. many Fritz!Box routers also expose LAN devices as
<name>.fritz.box, which resolves via normal DNS and works fine in containers).
Environment variables
Variable | Applies to | Description |
| both |
|
|
| Port to listen on. Defaults to |
|
| Bearer token required on every |
| both | Default CUPS printer URI. When set, the |
Development
npm install
npm run build
npm testRun the local server from source:
npm run devRun the built server:
npm startTool: print
Input:
printerUri?: string(optional if the server has a default configured via thePRINTER_URIenvironment variable)markdown: stringmode: "preview" | "confirm"confirmationToken?: string(required whenmode="confirm")options?: { copies?: number; timeoutMs?: number }
Two-step confirmation flow
Call
printwithmode: "preview".Show the returned snippet to the user and ask for confirmation.
Call
printagain withmode: "confirm"and the returnedconfirmationToken.
Preview response includes:
requiresConfirmation: trueconfirmationTokenpreview.lineCountpreview.snippetpreview.excessiveLengthWarning(present when markdown is more than 80 lines)
Confirm response shape:
{ "ok": true, "meta": { "printerUri": "...", "durationMs": 20, "printedAt": "...", "jobId": "optional" } }Error codes:
VALIDATION_ERRORPRINTER_ERRORTIMEOUT
Available Tools
1 toolprintA
Print markdown content to a POS printer via CUPS URI. Use this when the user asks to print, print a receipt, make a hard copy, or print something out. Call with mode=preview first, then call again with mode=confirm and confirmationToken.
Inputs: printerUri (required), markdown (required), mode (required), confirmationToken, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 1 tool
With only one tool, there is no risk of confusion or overlap between tools.
A single tool named 'print' is perfectly consistent with itself.
A single tool for a POS printing server feels too minimal; typically one would expect additional utilities like printer listing or status checks.
The print tool covers only the core print action via two modes, missing obvious features like printer discovery, job management, or error handling.
Maintenance
Related MCP Connectors
MCP server for Probo print-on-demand — search products, configure orders, track shipments.
Thermal label MCP server: render, validate, debug and convert ZPL, EPL, TSPL and CPCL labels.
HTML and CSS to PDF MCP server with page headers, footers and page numbers. No headless browser.
A paid remote MCP for hosted MCP server, built to return verdicts, receipts, usage logs, and audit-r
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables users to print markdown tasklists, Notion tasks with QR codes, and arbitrary images directly to ESC/POS thermal printers over USB. It includes specialized tools for task processing, automated card generation, and printer diagnostics.71MIT
- AlicenseNot gradedqualityDmaintenanceEnables printing of Yamato B2 Cloud shipping label PDFs to a thermal label printer through a Raspberry Pi-based MCP server.MIT

polydoc-mcpofficial
AlicenseNot gradedqualityBmaintenanceMCP server that converts HTML or URLs to PDF, captures screenshots, and generates EU-compliant e-invoices (Factur-X/ZUGFeRD).311 npmMIT- FlicenseNot gradedqualityDmaintenanceA cross-platform MCP server that enables AI assistants to manage printers, query printer status, and print files on Windows, macOS, and Linux.14-