Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add EthanPany/thermal-mcp --skill thermal-printgit clone --depth 1 https://github.com/EthanPany/thermal-mcpWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/ethanpany/thermal-mcp/thermal-print)<a href="https://agentmods.dev/skills/ethanpany/thermal-mcp/thermal-print"><img src="https://agentmods.dev/badge/skills/ethanpany/thermal-mcp/thermal-print/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/ethanpany/thermal-mcp/thermal-print"><img src="https://agentmods.dev/badge/skills/ethanpany/thermal-mcp/thermal-print.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00060 | $0.02431 |
| Opus 5 | $0.00030 | $0.01215 |
| Sonnet 5 | $0.00012 | $0.00486 |
| Haiku 4.5 | $0.00006 | $0.00243 |
Grade A, and why
thermal-print scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 12d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 142 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Designing for the 58mm thermal printer
You are designing on a strip of paper: 384px wide (1 CSS px = 1 printer dot = 0.125mm), unlimited height, printed at 203dpi in pure 1-bit black & white.
Two paths — pick the right one
- Quick print (notes, lists, todos, plain receipts): call
print_markdown. GFM + syntax-highlighted code fences,mermaiddiagrams, LaTeX math ($...$/$$...$$), task lists, tables, remote images — all supported. Three type-size tiers viasize(see "Type size" below); default tomedium. - Custom design: write an HTML body fragment (no
<html>/<head>), bring your own<style>, iterate withpreview_html→print_html. HTML gives you full control of every font-size — setfont-sizein your own CSS (respect the ≥18px body / ≥20px CJK floors below). - Continuous / log mode (typewriter-style: hourly logs, streaming notes):
print_markdownwithflow: "continuous". Zero top/bottom margins and no trailing feed, so chunks from separate calls join seamlessly into one strip. Rules: send one complete markdown block per call (a fenced code block, a list, a paragraph — never split mid-construct; incomplete chunks are rejected with an error instead of printed). Keep chunks short (1–5 lines), prefix log lines with a mono timestamp;size: "small"is acceptable here since logs are intentionally dense (otherwise prefermedium). The human presses the printer's FEED button after tearing — that IS the margin; no begin/end calls needed.
Workflow (always)
- Write the content.
- Preview — the returned image is the exact 1-bit output that will print. Check: nothing clipped at 384px, text legible, no accidental gray speckle.
- Iterate, then print. Paper is physical — never print unpreviewed content.
Hard physical constraints
- 1-bit output. Photos/gradients are auto-detected and dithered (Atkinson
default;
algorithm: "jarvis"for smoother gradients,"bayer"for a halftone newspaper look). Text must be pure#000on#fff— gray or colored text prints as speckle. Override detection withmode: "text"|"photo". - Type size (
print_markdown): three tiers —large(24px, headlines / very short notes),medium(19px) — the recommended default, use it for almost everything,small(14px, the minimum — ONLY for genuinely dense or long content; it's noticeably harder to read, so never default to it). When in doubt, medium. - Floors: body ≥ 18px, fine print ≥ 16px absolute floor, CJK ≥ 20px (hardware cell is 24×24 dots). Line-height 1.3–1.4 body, 1.1–1.2 headings.
- Rules/borders ≥ 2px — 1px hairlines drop out. Dashed 2px = classic receipt.
- Give rows breathing room. Thermal dot-gain fattens everything ~1px, so
tight vertical stacks bleed into each other. For icon/checkbox + text rows use
display:flex; align-items:center; gap:8px; line-height:1.4and ≥6px between rows — never absolutely-position a checkbox/icon column over the text column. - Network works (remote images load) but every bundled font/icon below is local — prefer them.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 12d ago First seen · 142 lines · 60 tokens per session scan A b2debb66fccb
thermal-print is a skill published in the GitHub repository EthanPany/thermal-mcp (0 stars, last pushed 1mo ago), licensed MIT. It adds 60 tokens to every session and 2,431 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
cad-viewer
Start CAD Viewer and return review links for CAD and robot-description files. Use when visually reviewing .step, .stp, .glb, .stl, .3mf, .dxf, .urdf, .srdf, or .sdf files, especially when handed off from CAD, URDF, SRDF, or SDF generation skills.
solidworks-vibecad
A planning guide for turning natural-language mechanical design requests into structured, parameterized SolidWorks plans that can be reviewed before execution.
FluidCAD-assembly
Building multi-part models in FluidCAD: assemblies, part files, inserting and mating parts, connectors, exposed geometry, part parameters, sub-assemblies, replicated instances, STEP parts, project units, and assembly export. Use this skill whenever the user wants an assembly, a mechanism, a hinge, a slider, several…
add-interfaces
Enrich an existing PartCAD part with connection interfaces and ports (mating metadata) so it can be mated to other parts automatically. Use for /pc:add-interfaces or when the user asks to add interfaces, ports, connectors, or mating information to a part, or to make parts snap/connect/assemble together.
gen-assembly
Generate a PartCAD assembly (an ASSY that composes parts with placement and/or mates) from a description, generating or reusing the component parts and validating the result with the PartCAD CLI. Use for /pc:gen-assembly or when the user asks to generate or create an assembly, mechanism, or multi-part product.
render
Render a PartCAD object or a CAD file to a 2D image - PNG, JPEG, SVG or DXF - from one or many viewing angles (front, back, left, right, top, bottom, iso, or an arbitrary direction), with pc render for an object a package declares or pc adhoc render for a file that belongs to no package. Use for /pc:render or when the…