mcpField
P
Printix

Printix

本地服务
github.com云与基础设施02 周前更新

关于 Printix

Printix 是面向 AI 助手和 MSP 的 Cloud Print API MCP 服务,可读取打印机、站点、工作站、用户及群组信息。它按租户凭据获取访问令牌和租户 ID,并将用户与群组操作限制为只读。

主要功能

  1. 01查询打印机和打印队列
  2. 02查询站点与工作站
  3. 03只读查询用户和群组
  4. 04按租户凭据获取 OAuth 令牌
  5. 05stdio 与 HTTP 传输模式

适用场景

  1. 01检查客户租户的打印队列与设备
  2. 02查看站点和工作站监控信息
  3. 03查询租户用户及群组

MCP 相关

该服务通过 MCP 工具提供 Printix Cloud Print API 的租户、打印机、站点、工作站、用户和群组查询能力。可通过 stdio 或 HTTP 接入 MCP 客户端。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"wyre-ai-printix": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"PRINTIX_CLIENT_ID",
"-e",
"PRINTIX_CLIENT_SECRET",
"-e",
"MCP_TRANSPORT",
"-e",
"AUTH_MODE",
"-e",
"LOG_LEVEL",
"ghcr.io/wyre-ai/printix-mcp:v1.0.1"
],
"env": {
"PRINTIX_CLIENT_ID": "<PRINTIX_CLIENT_ID>",
"PRINTIX_CLIENT_SECRET": "<PRINTIX_CLIENT_SECRET>",
"MCP_TRANSPORT": "<MCP_TRANSPORT>",
"AUTH_MODE": "<AUTH_MODE>",
"LOG_LEVEL": "<LOG_LEVEL>"
}
}
}
}
启动命令docker run -i --rm -e PRINTIX_CLIENT_ID -e PRINTIX_CLIENT_SECRET -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-ai/printix-mcp:v1.0.1
需要配置的环境变量
PRINTIX_CLIENT_IDPrintix client ID, issued per-tenant through the Printix Administrator dashboard.
PRINTIX_CLIENT_SECRET密钥Printix client secret paired with the client ID.
MCP_TRANSPORTTransport mode for the server. Set to 'stdio' for local CLI use; the image defaults to 'http' for gateway hosting.
AUTH_MODE密钥Credential source: 'env' reads vars locally, 'gateway' expects header injection from the WYRE MCP Gateway.
LOG_LEVELLog verbosity: debug, info, warn, error

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

安装包
ocighcr.io/wyre-ai/printix-mcp:v1.0.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Printix MCP 服务

面向 AI 助手和 WYRE Conduit 网关的 MCP 服务,用于访问 Printix Cloud Print API(现隶属于 Tungsten Automation),支持查询打印机/队列、站点、工作站,以及只读查询用户/群组。

身份验证

Printix 按租户签发一对 client_id/client_secret,可通过 Printix Administrator 控制面板获取。WYRE 级别没有统一的集成凭据;每个由 MSP 管理的客户租户都需提供自己的凭据对,并且每个租户一次只能有一对凭据处于有效状态(签发新凭据会使之前的凭据失效)。

这对凭据会通过 POST https://auth.printix.net/oauth/token 交换为有效期较短(约 1 小时)的 OAuth 访问令牌(grant_type=client_credentials,client_id/client_secret 放在表单正文中)。本服务会在内部处理这项交换,并在令牌过期或被拒绝时以相同方式重新进行身份验证——Printix 不支持刷新令牌(已于 2024-12-17 移除;文档将此前的刷新令牌方案描述为“非标准 OAuth2”)。

调用方只需提供以下两个长期有效的值,无需提供短期访问令牌。

Printix Cloud Print API 中的每个资源都位于租户路径下(/cloudprint/tenants/{tenantId}/...)。本服务会针对每对凭据调用 API 根路径一次,以解析租户 ID(GET /cloudprint 是文档所述的 HATEOAS 入口点,会“返回可访问租户的链接列表”),并将其与访问令牌一同缓存。

配置

复制 .env.example,并设置以下变量。

环境变量描述
PRINTIX_CLIENT_ID从 Printix Administrator 控制面板获取的客户端 ID。供 stdio 使用,也供 AUTH_MODE=env 时的 HTTP 使用。
PRINTIX_CLIENT_SECRET与客户端 ID 配对的客户端密钥。供 stdio 使用,也供 AUTH_MODE=env 时的 HTTP 使用。
MCP_TRANSPORTstdio(默认)或 http。
AUTH_MODEenv(默认;读取 PRINTIX_*)或 gateway(每个请求通过 X-Printix-Client-ID 和 X-Printix-Client-Secret 传入凭据,且绝不会回退到环境变量)。Docker 镜像和 Compose 文件默认使用 gateway。
CONDUIT_S2S_SECRET启动 HTTP 传输所必需。用于根据 /mcp 上的 X-Gateway-S2S 进行验证的 HMAC 密钥。使用 openssl rand -hex 32 生成。如果该值为空或是已知占位符(例如 replace-with-a-real-secret),进程会记录错误并以非零状态码退出。此值绝不会写入日志。未设置时,Compose 不会启动。
MCP_ALLOW_INSECURE_DEV仅用于本地开发;设置为 1 才能在不设置 CONDUIT_S2S_SECRET 的情况下启动 HTTP。进程会记录警告,不会验证 X-Gateway-S2S,并且只绑定到 127.0.0.1。非环回地址的 MCP_HTTP_HOST(包括 0.0.0.0)会被忽略,并记录此覆盖操作。已知的占位符密钥仍会被拒绝。
MCP_HTTP_HOST设置了有效的 CONDUIT_S2S_SECRET 时使用的绑定地址。未设置时默认为 127.0.0.1。容器镜像设置为 0.0.0.0。未设置密钥时,监听器会强制绑定到 127.0.0.1。
MCP_HTTP_PORTHTTP 端口。默认为 8080。
LOG_LEVELdebug | info(默认)| warn | error。

/health 无需身份验证,也不会读取凭据。stdio 传输不使用 CONDUIT_S2S_SECRET。

HTTP 身份验证

使用 MCP_TRANSPORT=http 和真实的 CONDUIT_S2S_SECRET 时,每个 /mcp 请求都必须包含 X-Gateway-S2S。校验逻辑位于 src/s2s-verify.ts 中的 verifyS2sHeader:标头值的格式为 t=<unix seconds>,v1=<hex>,其中 hex 是以 CONDUIT_S2S_SECRET 为密钥、对字面字符串 t=<unix seconds> 计算得出的 HMAC-SHA256(64 位小写十六进制字符)。时间戳必须与服务器时钟相差不超过 300 秒。缺少标头或标头无效时,会返回 HTTP 401,且在此之前不会读取供应商凭据。

TS=$(date +%s)
SIG=$(printf 't=%s' "$TS" | openssl dgst -sha256 -hmac "$CONDUIT_S2S_SECRET" -hex | awk '{print $NF}')
curl -sS http://127.0.0.1:8080/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H "X-Gateway-S2S: t=${TS},v1=${SIG}" \
  -H 'X-Printix-Client-ID: your-client-id' \
  -H 'X-Printix-Client-Secret: your-client-secret' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

在 AUTH_MODE=gateway 模式下,/mcp 还要求提供 X-Printix-Client-ID 和 X-Printix-Client-Secret。这些标头是该请求唯一的凭据来源。请求缺少任一标头时会返回 401,且不会回退使用进程环境中的 PRINTIX_CLIENT_ID / PRINTIX_CLIENT_SECRET。

在 AUTH_MODE=env(单租户 HTTP)模式下,/mcp 仍要求有效的 X-Gateway-S2S 标头。供应商凭据来自 PRINTIX_CLIENT_ID 和 PRINTIX_CLIENT_SECRET。

工具

租户
  • printix_get_tenant - 获取此凭据对所属的租户(租户 ID 及其 API 根链接)。
打印机 / 队列
  • printix_list_printers - 列出打印队列/打印机,可按需筛选并分页。
  • printix_get_printer - 获取单个打印机/队列及其属性/功能。
站点
  • printix_list_sites - 分页列出站点(实体位置)。
  • printix_get_site - 获取单个站点的详细信息。
工作站
  • printix_list_workstations - 分页列出工作站监控数据。
  • printix_get_workstation - 获取单个工作站的详细信息。
用户(只读)
  • printix_list_users - 列出用户,可按查询/角色筛选并分页。
  • printix_get_user - 按 ID 查找单个用户。
组(只读)
  • printix_list_groups - 分页列出/搜索组。
  • printix_get_group - 获取单个组的详细信息。

范围

这是一个 v1 功能集,涵盖 Printix Cloud Print API 中面向 MSP 的机群监控/管理价值,不涉及终端用户打印作业工作流。目前明确不在范围内的内容:

  • 打印作业(提交/检索/删除)- 属于终端用户打印工作流,不属于 MSP 管理价值。
  • 卡片(注册/搜索/删除)- 小众的身份验证卡功能。
  • 网络和SNMP 配置- 配置工作量大、风险较高的写入功能。
  • 用户和组变更(创建/删除)- 会产生实际的账户管理影响(许可、移除访问权限);用户和组均仅开放读取(列表/获取)。之后值得单独审慎决策。

一旦明确存在 MSP 工作流需求,可在后续添加这些功能。

此服务基于 Cloud Print API(printix.github.io)构建,而非范围更窄的 Partner API(printix.bitbucket.io);后者面向租户配置,而非日常机群管理。

开发

npm install
npm run build
npm test
npm run lint   # tsc --noEmit

# HTTP refuses to start until CONDUIT_S2S_SECRET is set
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" npm run start:http

Docker

镜像在容器内监听 0.0.0.0(MCP_HTTP_HOST),并默认使用 AUTH_MODE=gateway。将端口发布到回环地址,并传入 S2S 密钥。在 gateway 模式下,Printix 凭据通过每个请求的标头传入,不会从环境中读取。

# Generate the secret first: openssl rand -hex 32
docker build -t printix-mcp .
docker run \
  -e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
  -p 127.0.0.1:8080:8080 \
  printix-mcp

如果未设置 CONDUIT_S2S_SECRET,Compose 将拒绝启动。仓库中提供的服务使用 gateway 模式:它不会设置 PRINTIX_CLIENT_ID 或 PRINTIX_CLIENT_SECRET,也不使用 env_file,因此项目 .env 无法向容器注入静态供应商凭据。它将端口发布到 127.0.0.1:8080:8080。

CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up

单租户 HTTP(AUTH_MODE=env)仍要求 S2S 密钥,然后使用 PRINTIX_CLIENT_ID 和 PRINTIX_CLIENT_SECRET。不要将其用于 gateway Compose 服务。

docker run \
  -e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
  -e AUTH_MODE=env \
  -e PRINTIX_CLIENT_ID=your-client-id \
  -e PRINTIX_CLIENT_SECRET=your-client-secret \
  -p 127.0.0.1:8080:8080 \
  printix-mcp

不带密钥的本地 HTTP 仅用于开发。它只绑定 127.0.0.1(若设置了更宽泛的 MCP_HTTP_HOST,则会覆盖该设置并记录日志),并会记录警告:

MCP_ALLOW_INSECURE_DEV=1 npm run start:http

评论

支持 Markdown

第一次接触 MCP?

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

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