mcpField
P
PrintGo

PrintGo

本地服务
github.com/Nishkalkashyap生产力13 周前更新

关于 PrintGo

PrintGo 是供 AI 助手通过 MCP 操作本机打印机的服务,可列出打印机、打印文件并跟踪或取消打印任务。它支持 PDF、图像、文本、Markdown 和 HTML,并可通过 Cloudflare 隧道远程访问或在本机使用 stdio。

主要功能

  1. 01列出打印机并查看能力与状态
  2. 02打印 PDF、图像和纯文本
  3. 03渲染并打印 Markdown 与 HTML
  4. 04查询或取消打印任务
  5. 05设置份数、纸张、方向及单双面

适用场景

  1. 01将在线 PDF 或图像发送到本机打印机
  2. 02打印 Markdown 笔记或 HTML 内容
  3. 03检查打印队列并取消已提交的任务

MCP 相关

PrintGo 是 MCP 服务,向客户端提供打印机查询、打印提交及任务状态管理工具。支持 Streamable HTTP 和本机 stdio 连接。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"nishkalkashyap-printgo": {
"command": "npx",
"args": [
"-y",
"printgo"
]
}
}
}
启动命令npx -y printgo

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmprintgo0.2.0

工具

7

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

PrintGo-MCP

PrintGo 可让 AI 助手使用你电脑上的打印机进行打印。它是一个 MCP 服务:MCP 客户端连接后,助手便可以列出你的打印机,向它们发送 PDF、图像、文本、Markdown 或 HTML,并在之后查看打印作业。

PrintGo 在连接打印机的电脑上运行,并通过 Cloudflare 隧道对外提供服务,因此你的助手可以从任何地方访问它:无论是云端 Agent、另一台笔记本电脑,还是同一台电脑。

所需条件

  • Node.js 22.12 或更高版本。
  • macOS、Linux 或 Windows,以及操作系统已识别的打印机。PrintGo 不会安装驱动程序,而是使用你已有的打印系统:
    • macOS 和 Linux 使用 CUPS(lp、lpstat、lpoptions 和 cancel 命令)。
    • Windows 使用 PowerShell 和 SumatraPDF。PrintGo 会先将所有内容转换为 PDF 再进行打印,因此每个打印作业都需要 SumatraPDF,而不仅仅是 PDF 作业。SumatraPDF 应位于你的 PATH 中,也可以通过 --sumatra-pdf <path> 指定其路径。
  • 只有在需要打印 Markdown 或 HTML 时,才需要 Chrome 或 Chromium。如果两者都没有,printgo install-browser 会下载一个浏览器。要使用特定浏览器,请传入 --chrome <path> 或设置 PRINTGO_CHROME_PATH。

开始使用

安装 CLI:

npm install -g printgo

然后启动:

printgo start

这会在后台启动 PrintGo 和 Cloudflare 隧道,然后输出 MCP URL 和密码。将该 URL 添加到你的 MCP 客户端,并通过 Authorization: Bearer <password> 标头发送密码。你的客户端需要支持 MCP 的 Streamable HTTP 传输;不支持较旧的 SSE 传输。

密码会在首次运行 start 时生成,之后会重复使用。请将它视为打印机的密钥:任何持有它的人都可以打印,也可以取消 PrintGo 提交的作业。流量会经过 Cloudflare。

PrintGo 需要 cloudflared 来建立隧道。如果找不到它,PrintGo 会在从 GitHub 下载官方版本前征求你的同意。传入 --yes 可跳过询问(没有终端可供回答时需要使用此选项),或传入 --no-download 以直接失败。如果 cloudflared 位于不常见的位置,请传入 --cloudflared <path>。

如果你不想全局安装,也可以使用 npx printgo <command>。该软件包还会安装一个 printgo-mcp 命令,功能相同,只是名称不同。

管理服务
printgo status
printgo stop
printgo restart

restart 会沿用上次 start 时的设置。如果出现问题,后台服务的日志位于 ~/.printgo/daemon.log。

默认情况下,PrintGo 会使用 Cloudflare Quick Tunnel,无需 Cloudflare 账户,但每次 PrintGo 启动时 URL 都会变化。如果你在 Cloudflare 上有域名,也可以为 PrintGo 指定一个固定地址:

printgo stop
printgo start --custom-domain-with-cf printer.example.com

如果 cloudflared 尚未登录你的 Cloudflare 账户,系统会打开浏览器供你登录。随后,PrintGo 会在你的账户中创建一个隧道(或重用之前创建的隧道),并为该主机名添加 DNS 记录。它不会覆盖已存在的 DNS 记录。

自定义域名设置会被保存,因此后续调用 start 和 restart 时会沿用这些设置。传入 --quick 可在某次运行中使用 Quick Tunnel。你也可以连接已有隧道,或使用 Cloudflare 控制面板中的令牌;printgo start --help 列出了所有选项。如果通过脚本调用 start、stop、status 或 restart,可以添加 --json。

仅本地运行,不使用隧道

如果 MCP 客户端与打印机位于同一台电脑上,你可以跳过隧道,让客户端直接通过 stdio 启动 PrintGo:

{
  "mcpServers": {
    "printgo": {
      "command": "printgo",
      "args": ["stdio"]
    }
  }
}

在此模式下,无需运行 printgo start。客户端会在需要时启动 PrintGo,并在完成后将其关闭;整个过程不涉及密码或 Cloudflare。

助手可以做什么

PrintGo 为助手提供七种工具:

工具功能
listPrinters列出计算机上已设置的打印机
getPrinterCapabilities显示打印机驱动程序支持的选项
checkPrinterStatus显示打印机的当前状态,例如空闲或正在打印
sendPrintCommand从 HTTPS URL 打印 PDF、PNG、JPEG 或纯文本文件
printMarkup渲染 Markdown 或 HTML 并打印
getPrintJobStatus查询 PrintGo 提交的作业状态
cancelPrintJob取消 PrintGo 提交的作业

打印时,助手可以选择份数(最多 100 份)、页码范围、纸张尺寸、方向、单面或双面、彩色或黑白,以及是否将内容适配到页面大小。

以下几点值得了解:

  • 文件来自 URL,而非你的磁盘。 助手会传入一个公开的 HTTPS 链接,由 PrintGo 下载。签名链接也可使用。包括通过重定向访问的本地文件路径和私有网络地址都会被拒绝,因此提示词无法诱使 PrintGo 打印你计算机或本地网络上的内容。下载大小上限为 10 MiB。
  • 请链接到文件本身。 sendPrintCommand 需要直接下载链接,而非用于显示文件的网页。要打印 HTML,请使用 printMarkup。
  • Markdown 和 HTML 可以内联传入(最多 32 KiB),也可以通过 URL 传入(最多 1 MiB)。PrintGo 会在禁用脚本的无头 Chrome 中渲染它们。它们链接的图片和样式表也必须是公开的 HTTPS URL。
  • 不支持 Word、Excel 和其他 Office 文件。 请先将它们转换为 PDF。PrintGo 会根据文件扩展名或服务器的内容类型判断 URL 指向的是否为文本;如果无法判断,请设置 assetType: 'text'。
  • 重试不会重复打印。 每个打印请求都带有一个 idempotencyKey。如果助手使用相同的键和参数重试,PrintGo 会返回原作业,而不会再次打印。使用相同的键但参数不同会报错。使用新键则会创建新的打印作业。
  • 作业状态仅反映打印队列中的情况。 打印机不会报告纸张是否实际打印出来。在 macOS 和 Linux 上,completed 表示作业已离开队列;作业在 PrintGo 之外失败或被取消时,也会出现这种情况。在 Windows 上,已离开队列的作业会显示为 unknown。

PrintGo 将状态保存在何处

PrintGo 会将所有内容保存在 ~/.printgo 中:远程密码、隧道设置、作业历史记录、幂等键、日志,以及它下载的任何 cloudflared 或 Chrome。你可以通过 --state-dir、PRINTGO_HOME 环境变量或 SDK 中的 stateDir 选项,将其指向其他位置。

如果你同时运行多个 PrintGo 服务,例如后台服务和 stdio 服务,请为每个服务指定单独的目录,以免它们的作业历史记录相互干扰。

将其用作库

你也可以在自己的 Node 代码中使用同一个软件包:

npm install printgo
连接 PrintGo 服务

connectPrinter 会提供一个类型化客户端,因此你可以像调用普通函数一样调用这些工具:

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();
}

除开发期间的 localhost 外,URL 必须使用 HTTPS。

若要通过 stdio 与本地服务通信,请改为传入 { transport: new StdioClientTransport({ command, args }) },并从 @modelcontextprotocol/client/stdio 导入 StdioClientTransport。客户端会为你打开并关闭传输连接。

自行运行服务

从自己的进程通过 stdio 提供服务:

import { servePrinterStdio } from 'printgo';

const server = servePrinterStdio();
// It closes by itself when stdin ends, or you can call: await server.close();

如果需要更多控制,可以选择以下两种较底层的方式:

  • createPrinterMcpServer(options?) 会返回一个尚未连接到任何对象的 MCP 服务,因此你可以为它连接自己的传输方式。
  • createPrinterHttpServer({ password, ...options }) 会返回一个 HTTP 服务,提供 listen()、close() 和 setPublicURL()。它会在 /mcp 提供 MCP 服务,只监听 127.0.0.1,并要求密码至少包含 32 个字符。如果你将它置于自己的代理之后,请使用公开地址调用 setPublicURL();其他主机名的请求都会被拒绝。

这两种方式都不会启动隧道。它们都接受 stateDir、adapter、assetDownloader、sumatraPdfPath 和 browserExecutablePath。如果你提供自己的 assetDownloader,就需要自行负责 PrintGo 的 URL、大小和超时检查,因此请确保你的实现也进行了同样的检查。

通过代码管理隧道

托管命令位于单独的入口点:

import { start, stop, status, restart } from 'printgo/hosting';

const connection = await start({ downloadCloudflared: true });
// connection.mcpConnectionURL, connection.password

此处也会导出 configureCloudflare 和 ensureCloudflared。

开发 PrintGo

从克隆此仓库开始:

npm install
npm test
npm run typecheck

npm test 会先进行构建。测试使用虚拟打印机和虚拟 cloudflared,因此不会打印任何内容,也不会连接 Cloudflare。Markdown 和 HTML 渲染测试需要本地安装 Chrome 或 Chromium;如果没有,则会跳过这些测试。设置 REQUIRE_CHROMIUM_TESTS=1 可将此情况改为测试失败。

npm run smoke:tunnel 会启动真实的 Quick Tunnel,并检查经过身份验证的 MCP 客户端能否通过它访问 PrintGo,不会打印任何内容。此操作需要安装 cloudflared;也可以运行 npm run smoke:tunnel -- --yes 让它自行下载。

发布前,运行 npm pack --dry-run 可查看将打包的内容。

许可证

MIT。捆绑的 Noto Sans 字体采用 SIL Open Font License。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。