PDFをアップロード
curl で /upload に POST。サーバーは file_id を返し、/tmp に30分保持します。
ヤマトB2クラウドで発行した送り状PDFを、小さなRaspberry Piに繋いだサーマルプリンタへ直接流し込むMCPサーバー。デスクの上で、ラベルだけが、静かに流れ出す。
// print shipping labels from Claude.ai to your WS-420B thermal printer,
// hosted on a 10-gram Raspberry Pi Zero 2 W with WiFi.
Claude.ai に接続した MCP サーバーが、PDFをラスタライズし、ディザ処理で1bit化し、TSPL言語に変換し、USBプリンタに直接書き込みます。業務系の"印刷ボタン"を押す手間が、会話ひとつに置き換わります。
対応送り状は 宅急便(230)・コレクト(241)・タイムサービス(203)・ネコポス・クロネコゆうパケット・クロネコゆうメール の6種類。カスタムサイズも指定可能。
/upload エンドポイントに送信済みの PDF を file_id 指定で印刷します。B2クラウドからDLしたファイルをそのまま食わせる、いちばんシンプルな流れ。
S3 presigned URL、Cloudflare R2、公開URLから直接取得して印刷。業務システムが生成したPDFをストレージに置くだけで連携可能。
現在サーバーに残っているアップロード済みPDFを一覧表示。TTL 30分で自動削除されるので溜まっていきません。
過去の印刷ジョブをSQLiteから取得。ファイル名・送り状種別・ステータス・バイト数・時刻すべて記録。
特定ジョブの状態とエラー内容を取得。completed/failed/printing いずれの場合も詳細が返ります。
実印刷前に slip_type やカスタムサイズの妥当性、プリンタデバイスのアクセス可否を検査。ドライランに最適。
サポートする送り状プリセットと用紙サイズ、使い方の例を返します。未対応品番のリクエストを防ぐ。
PyMuPDFではなく Node.js の pdf-to-img + sharp で1bitディザ化 → 自前のBITMAPパッキング → TSPL出力。Pi Zero 2 Wでも数秒以内。
curl で /upload に POST。サーバーは file_id を返し、/tmp に30分保持します。
Claude から file_id と slip_type を指定。Cloudflare Tunnel 経由で MCP サーバーへ到達。
ラスタライズ → リサイズ → 1bitディザ → MSBファースト パッキング → TSPL BITMAPコマンド生成。
Linuxカーネルのusblpドライバ経由で直接書き込み。WS-420Bが数秒でラベルを吐き出します。
Raspberry Pi Zero 2 W + WS-420B が手元にある前提で、セットアップは以下の3ステップ。はじめての人でも作れるようさらに詳しいガイドも用意しています。
# リポジトリをクローン git clone https://github.com/DaisukeHori/yamato-printer-mcp-server.git cd yamato-printer-mcp-server # セットアップスクリプト実行 (Node.js/依存/systemd/cloudflared 全部込み) sudo ./scripts/setup-pi.sh --longevity
cloudflared tunnel login cloudflared tunnel create yamato-printer cp cloudflared/config.yml.example ~/.cloudflared/config.yml # config.yml のTUNNEL-UUIDを書き換え cloudflared tunnel route dns yamato-printer yamato-printer.yourdomain.com sudo systemctl enable --now cloudflared
# URL を登録するだけ https://yamato-printer.yourdomain.com/mcp?key=<MCP_API_KEY> # 使ってみる (Claude との会話内で) "この送り状PDFを印刷して" (PDFファイル添付) → print_uploaded が呼ばれ、数秒でラベルが出力される
クアッドコア Cortex-A53 (1GHz) + 512MB RAM + WiFi 2.4GHz内蔵。サイズ 65×30mm、10グラム。スイッチサイエンス等で購入可能。
和信テック製 (XprinterのOEM)。USB接続でTSPL/EPL/ZPL対応。203dpi、最大幅108mmでヤマト送り状にピッタリ。
防犯カメラ・ドラレコ用の高耐久 (32GB〜64GB推奨)。24時間365日稼働に耐えるモデルを選ぶと長寿命。
Micro USB の電源アダプタ。データポートは別USBなので、AC/USBから給電すればよい。
Pi Zero のMicro USB データポートとプリンタのUSB-Aを繋ぐためのOTG変換。100円ショップでも入手可。
ヤマトビジネスメンバーズに加入すれば、プリンタ対応の送り状ロールが無料で届きます。
プログラミングもLinuxもやったことない人 を対象にしたガイド。書いてある通りに順番にコピペしていけば、誰でもAIから送り状が印刷できる環境が完成します。各ステップをクリックすると詳細が展開されます。
| 名前 | 値段 | 何に使う |
|---|---|---|
| Raspberry Pi Zero 2 W | 2,500〜3,500円 | コンピュータ本体 |
| microSDカード 32GB (防犯カメラ用) | 1,500〜2,000円 | OSを入れる |
| Micro USB 電源 5V/2.5A | 500〜1,000円 | 電気をあげる |
| Micro USB ⇔ USB-A OTGケーブル | 300〜800円 | プリンタ接続 |
| WS-420B サーマルプリンタ | 8,000〜12,000円 | 印字する装置 |
| 送り状ロール紙 | 無料 | 印刷する紙(ヤマトビジネスメンバーズから取得) |
専用アプリをダウンロード → https://www.raspberrypi.com/software/
自分のPCに合わせて選んでインストール:
Raspberry Pi Zero 2 WRaspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit)「NEXT」→ 必ず「EDIT SETTINGS」をクリック。
GENERAL タブ:
| Set hostname | yamato-printer |
| Username | pi |
| Password | 覚えやすいパスワード(8文字以上) |
| SSID | 家のWiFiの名前 |
| WiFi Password | 家のWiFiパスワード |
| Wireless LAN country | JP |
| Time zone | Asia/Tokyo |
SERVICES タブ: Enable SSH にチェック → "Use password authentication" を選択
「SAVE」→ "Would you like to apply..." で「YES」→ 警告で「YES」→ 5〜10分待つ。
「Write Successful」が出たら完了。SDカードを取り出します。
本体の裏側にスロットがあります。金属端子が見える側を上にして、カチッと音がするまで押し込みます。
Raspberry Pi Zero 2 W には Micro USBポートが2つあります:
緑色のLEDが点滅します。初回起動は3〜5分。気長に待ちましょう。
自分のPCから「おーい、どこー?」と呼びかけます。
Mac / Linux ターミナルで:
Windows コマンドプロンプトで同じく:
返事が来たらIPアドレス (192.168.x.x) をメモ。Ctrl+Cで停止。
初回は yes → パスワード入力(STEP 1-8 で決めたもの)。打ち込んだ文字は画面に表示されないが、打てています。
成功すると:
これが Linux のコマンド画面。ここから全部この画面で作業します。
20〜30分かかります。コーヒー休憩に最適。
完了画面の中に MCP_API_KEY を自動生成しました: ... が出ます。この ... の部分をメモ。あとでClaude.aiの設定で使います。
見逃したら:
SSH接続が切れるので、1〜2分後に再接続:
WS-420B の電源ケーブルをコンセントに挿して電源ON。ロール紙をセット(プリンタ付属説明書に従う)。
OTGケーブルを使って:
以下のような行が出ればOK:
「usblp0」が見えたら成功。
ラベルが1枚出てきたら大成功!「HELLO WS-420B」と印字されています。
PDF→TSPL変換パイプライン全体の動作確認ができます。
ここまでは家のWiFi内からしか使えません。Cloudflare Tunnelで外からもアクセスできるようにします(無料、ルーター設定不要)。
Cloudflareサインアップ でメール登録 → 確認メールのリンクをクリック。
Cloudflare Tunnelには独自ドメインが必要です:
取得したドメインをCloudflareに登録(Cloudflare公式ガイドに従う)。
Cloudflared を選択yamato-printerCloudflare画面に表示されるコマンドをSSH画面で実行:
(eyJh...の部分はCloudflare画面のトークンに置き換え)
Cloudflare画面で「Next」→ Public Hostname設定:
| Subdomain | yamato-printer |
| Domain | 取得したドメイン |
| Type | HTTP |
| URL | localhost:8719 |
ブラウザで:
JSONが表示され "available": true ならOK。
右下の自分のアイコン → 「Settings」→「Connectors」→「Add custom connector」
| Name | YamatoPrinter |
| URL | https://yamato-printer.ドメイン/mcp?key=XXXXX |
XXXXX を STEP 4-4 でメモした MCP_API_KEY に置き換え。
例:
Claude.aiの新チャットで「利用可能なMCPツールを教えて」と聞いて、print_uploaded、print_urlなどが出てきたら成功。
B2クラウドで送り状を作成し、PDFをダウンロード。
Claude.aiチャット画面でクリップボタンからPDFをアップロード。
Claudeが自動的に print_uploaded を呼び出し、数秒後にプリンタからラベルが出てきます。
お疲れ様でした。これで「AIに話しかけて送り状印刷」が完成です。業務で日常的に使うなら、validate_print_optionsやlist_jobsなども試してみてください。
Unable to locate package なら sudo apt update を再実行。
sudo modprobe usblpで手動ロード。
DITHER_THRESHOLD=128 を100や180に調整。ロール紙の裏表確認(熱で黒くなる面が表)。
sudo systemctl status cloudflared で確認。journalctl -u cloudflared -n 50 でログを見る。
MIT License. 203件のテストが通過済み。
クラスA操作・読取10Mリクエスト・エグレス無料のCloudflare Tunnelでどこからでも到達可能。
堀が公開している MCP サーバー群。すべて Claude.ai / Cursor 等から利用可能。
| サーバー | ツール | 説明 |
|---|---|---|
| b2cloud-api | 14 | ヤマト B2クラウド送り状発行 API/MCP |
| cloudflare-mcp | 69 | Cloudflare 統合(Tunnel/DNS/Workers/Pages/R2/KV/SSL/Access) |
| hubspot-ma-mcp | 128 | HubSpot MA(CRM/Marketing/Knowledge Store) |
| msgraph-mcp-server | 48 | Microsoft Graph API(Exchange/Teams/OneDrive/SharePoint) |
| playwright-devtools-mcp | 57 | Playwright + Chrome DevTools(ブラウザ自動化) |
| proxmox-mcp-server | 35 | Proxmox VE 仮想化基盤操作 |
| printer-mcp-server | — | CUPS ネットワークプリンタ制御(Kyocera TASKalfa) |
| yamato-printer-mcp-server ← 今ここ | — | ヤマト送り状サーマルプリンタ(ラズパイ + WS-420B) |
| ssh-mcp-server | 10 | SSH クライアント(セッション管理/非同期コマンド) |
| mac-remote-mcp | 34 | macOS リモート制御(Shell/GUI/ファイル/アプリ) |
| gemini-image-mcp | 4 | Gemini/Imagen 画像生成 |
| runpod-mcp | 36 | RunPod GPU FaaS(Pods/Endpoints/Jobs) |
| firecrawl-mcp | — | Firecrawl セルフホスト Web スクレイピング |
| ad-ops-mcp | 62 | 広告運用自動化(Google Ads/Meta/GBP/X) |