print-blocks
Click on "Install 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., "@print-blocksprint a centered text block with 'Hello World'"
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.
print-blocks
print-blocks is a small TypeScript service that prints structured documents to ESC/POS thermal printers.
It has an API endpoint /print that accepts a JSON payload describing a document as an array of blocks, renders them to ESC/POS bytes with react-thermal-printer, and submits the resulting bytes to a CUPS printer with lp.
The service has no UI. It exposes:
POST /printfor authenticated print jobs.GET /healthzfor unauthenticated liveness checks.GET /openapi.jsonfor generated OpenAPI JSON.GET /docsfor an interactive Scalar API reference whenEXPOSE_DOCS=true.GET /llms.txtfor LLM-friendly Markdown API documentation whenEXPOSE_LLMS_TXT=true.ALL /mcpfor authenticated MCP clients whenEXPOSE_MCP=true.
Requirements
Node.js 24 and pnpm 10 for local development.
CUPS configured on the host.
A CUPS printer queue that accepts raw/native ESC/POS data.
The CUPS client command
lpavailable wherever the app runs.
The production container installs cups-client, so lp is available inside the image.
Related MCP server: MCPOSprint
Configuration
Copy the example environment file and edit it:
cp .env.example .envNote:
Documentation endpoints are disabled by default. Set
EXPOSE_DOCS=trueto enable/docsandEXPOSE_LLMS_TXT=trueto enable/llms.txt.The MCP endpoint is disabled by default. Set
EXPOSE_MCP=trueand provide a separateMCP_TOKENwith at least 32 characters to enable/mcp.PRINTER_WIDTHconfigures the printer text width in characters and defaults to48.PRINTER_DOT_WIDTHconfigures the raster width used for image-like blocks and defaults to576dots. Set it explicitly when your printer mode uses a different raster width, such as384dots.Image blocks accept base64-encoded data through the
dataproperty. Supported image formats are JPEG, PNG, WebP, and SVG. Remote image URLs are disabled by default. SetALLOW_REMOTE_IMAGE_URLS=trueto allow image blocks to use an HTTPSurlinstead. Remote image fetching is intentionally strict: only HTTPS URLs with public domain hostnames are accepted, direct IP addresses and credentials are rejected, redirects are not followed, downloaded bytes are limited byMAX_REMOTE_IMAGE_BYTES, fetches time out afterREMOTE_IMAGE_TIMEOUT_MS, and decoded image input is limited byMAX_IMAGE_INPUT_PIXELS. These restrictions are in place to prevent abuse and security issues, but enabling remote image URLs is only recommended in trusted environments.
Development
Install dependencies:
pnpm installRun the dev server:
pnpm devSVG-backed block previews are available in development at:
http://localhost:3000/previewRun checks:
pnpm typecheck
pnpm lint
pnpm format:check
pnpm test
pnpm buildAPI
POST /print
Headers:
Content-Type: application/json
Authorization: Bearer <API_TOKEN>Body:
{
"blocks": [
{
"type": "text",
"content": "Hello from print-blocks",
"align": "center",
"bold": true
}
]
}Success response:
{
"ok": true
}GET /healthz
Returns:
{
"ok": true
}GET /openapi.json
Returns the OpenAPI specification for the API.
GET /docs
Returns an interactive API reference backed by Scalar and /openapi.json. This endpoint is only registered when EXPOSE_DOCS=true.
GET /llms.txt
Returns Markdown API documentation generated from the OpenAPI specification. This endpoint is only registered when EXPOSE_LLMS_TXT=true.
ALL /mcp
Serves a stateless MCP server over streamable HTTP. This endpoint is only registered when EXPOSE_MCP=true and requires Authorization: Bearer <MCP_TOKEN>.
Available tools:
get_inforeturns printer settings, service limits, supported blocks, and templates.printrenders print instructions and submits them to the configured printer.list_templateslists examplary print templates that can be used as starting points or inspiration for print requests.get_templatereturns Markdown instructions and the template's JSON structure for a given template id.
Manual smoke test
After the app is running:
curl -X POST "http://localhost:3000/print" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_TOKEN" \
--data '{"blocks":[{"type":"text","content":"Hello from print-blocks","align":"center"}]}'This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/gian-reto/print-blocks'
If you have feedback or need assistance with the MCP directory API, please join our Discord server