
Security News
OpenCode User Hit with Hostile Backlash After Reporting Free AI Loophole
An OpenCode user faced harassment after reporting a free AI usage loophole, drawing a bitter backlash in a GitHub thread that has since been deleted.
Use your computer's printers through MCP, locally over stdio or remotely through Cloudflare.
The npm package is printgo. Both printgo and printgo-mcp run the same CLI.
Requires Node.js 22.12+ and a printer configured in your operating system:
lp, lpstat, lpoptions, cancel).printgo install-browser if needed.npm install -g printgo
Or run commands without a global install using npx printgo <command>.
After installing, add it to your MCP client:
{
"mcpServers": {
"printgo": {
"command": "printgo",
"args": ["stdio"]
}
}
}
The client starts and stops the process. Local use needs no Cloudflare setup or password.
printgo start
This starts a background server and Cloudflare tunnel. Connect your MCP client to
its printed URL with Authorization: Bearer <password>.
Anyone with that password can print and cancel jobs. Cloudflare proxies the traffic.
The CLI asks before downloading a missing cloudflared. Use --yes to approve
installation in scripts, or --no-download to require an existing copy.
printgo status
printgo stop
printgo restart
# Use a domain you manage through Cloudflare:
printgo start --custom-domain-with-cf printer.example.com
Quick Tunnel URLs change on restart; named tunnel settings are saved.
Use printgo start --help for existing tunnels, token files, and other hosting options.
Use --json for script output.
Install with npm install printgo.
Serve local MCP in your own process:
import { servePrinterStdio } from 'printgo';
servePrinterStdio();
The returned handle has a close() method for shutdown.
For embedding, createPrinterMcpServer(options?) returns an unconnected MCP server.
createPrinterHttpServer({ password, ...options }) provides listen(), close(),
and setPublicURL(). It binds to loopback and requires a secret of at least 32 characters.
Neither starts a tunnel. Both accept stateDir, adapter, assetDownloader,
sumatraPdfPath, and browserExecutablePath. A custom downloader must enforce its
own URL, size, and timeout checks.
Connect to HTTP with the typed client:
import { connectPrinter } from 'printgo';
const printer = await connectPrinter({
mcpConnectionURL: process.env.PRINTER_URL!,
password: process.env.PRINTER_PASSWORD!,
});
try {
const [selected] = await printer.listPrinters();
if (!selected) throw new Error('No printers configured.');
await printer.sendPrintCommand({
printerId: selected.id,
assetUrl: 'https://example.com/invoice.pdf',
settings: { copies: 1, paperSize: 'A4' },
idempotencyKey: 'invoice-123',
});
} finally {
await printer.close();
}
For stdio, pass { transport: new StdioClientTransport({ command, args }) } instead.
Import that transport from @modelcontextprotocol/client/stdio in your application.
The client connects and closes the transport for you.
Hosting is a separate import:
import { start, stop, status, restart } from 'printgo/hosting';
const connection = await start({ downloadCloudflared: true });
That entry point also exports configureCloudflare and ensureCloudflared.
| Tool | Purpose |
|---|---|
listPrinters | List configured printers |
getPrinterCapabilities | Read driver options |
checkPrinterStatus | Check a printer's queue |
sendPrintCommand | Print PDF, PNG, JPEG, or UTF-8 text from an HTTPS URL |
printMarkup | Print Markdown or HTML from content or an HTTPS assetUrl |
getPrintJobStatus | Look up a job created by this server |
cancelPrintJob | Cancel one of those jobs |
idempotencyKey and arguments when retrying. A new key can print another copy.assetType: 'text' for extensionless text. Convert Office documents to PDF first.State is stored in ~/.printgo. Override it with --state-dir, SDK
stateDir, or PRINTGO_HOME. Use a separate directory for each active
server; job history and retry keys are stored there.
From a source checkout:
npm install
npm run build
npm test
npm run typecheck
npm pack --dry-run
Tests use fake printers and tunnels. Rendering tests use a local browser; set
REQUIRE_CHROMIUM_TESTS=1 to fail if none is installed. npm run smoke:tunnel
checks a real Quick Tunnel without printing.
MIT licensed. Bundled Noto Sans uses the SIL Open Font License.
FAQs
Local printer MCP tools with stdio, HTTP, and optional Cloudflare hosting
The npm package printgo receives a total of 30 weekly downloads. As such, printgo popularity was classified as not popular.
We found that printgo demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
An OpenCode user faced harassment after reporting a free AI usage loophole, drawing a bitter backlash in a GitHub thread that has since been deleted.

Threat Research
/Security News
319 browser extensions installed by 13.4 million users hijack searches, capture queries, and collect referral payments from Yahoo and Bing.

Threat Research
Malicious Firefox extensions mimic Phantom, Jupiter, and Bitget wallets to steal recovery phrases and private keys, with one fetching its payload remotely.