mcpField
W
walletmcppass: Apple Wallet passes

walletmcppass: Apple Wallet passes

リモート
walletmcppass.com生産性12 週間前に更新
リポジトリ公式サイト

walletmcppass: Apple Wallet passes について

walletmcppass は、AI アシスタントや MCP クライアント向けの Apple Wallet パス生成サービスです。チケット、クーポン、会員カードなどの情報から署名済み `.pkpass` ファイルを作成し、MCP ツールまたは REST API で作成・更新できます。

主な機能

  1. 01搭乗券、イベントチケット、クーポン、カードの作成
  2. 02署名済み `.pkpass` ファイルの生成
  3. 03バーコード形式、色、画像の設定
  4. 04対象パスの更新とデバイスへの通知
  5. 05REST API と有効期限付きダウンロードリンク

活用シーン

  1. 01航空券 PDF から Wallet 搭乗券を作成
  2. 02バーコード付きイベントチケットやクーポンを作成
  3. 03会員カードの項目を変更、またはパスを無効化

MCP 対応

`https://walletmcppass.com/mcp` の Streamable HTTP MCP サーバーは、`create_wallet_pass` と `update_wallet_pass` ツールを提供します。同じパス生成機能は REST API からも利用できます。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://walletmcppass.com/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

ツール

2
パラメーター型必須説明
stylestringはい
posterbooleanいいえ
voidedbooleanいいえ
icon_textanyいいえ
locationsanyいいえ
logo_textanyいいえ
semanticsanyいいえ
updatablebooleanいいえ
icon_colorstringいいえ
info_linksanyいいえ
logo_coloranyいいえ
back_fieldsanyいいえ
descriptionstringはい
label_coloranyいいえ
icon_png_b64anyいいえ
logo_png_b64anyいいえ
max_distanceanyいいえ
transit_typeanyいいえ
footer_fieldsanyいいえ
generate_logobooleanいいえ
header_fieldsanyいいえ
relevant_dateanyいいえ
serial_numberanyいいえ
strip_png_b64anyいいえ
barcode_formatanyいいえ
primary_fieldsanyいいえ
artwork_png_b64anyいいえ
barcode_messageanyいいえ
expiration_dateanyいいえ
semantic_layoutbooleanいいえ
updatable_hoursintegerいいえ
auxiliary_fieldsanyいいえ
background_coloranyいいえ
barcode_alt_textanyいいえ
featured_actionsanyいいえ
foreground_coloranyいいえ
secondary_fieldsanyいいえ
organization_namestringはい
thumbnail_png_b64anyいいえ
background_png_b64anyいいえ
primary_logo_png_b64anyいいえ
secondary_logo_png_b64anyいいえ

詳細

wallet-mcp:Claude、ChatGPT、あらゆるMCPクライアント向けの無料Apple Walletパス生成ツール

Apple Developerアカウントがなくても、PDFの搭乗券、チケット、クーポン、ポイントカードをAIアシスタントから署名済みのApple Walletパス(.pkpass)に変換できます。wallet-mcpは、walletmcppass.comの基盤となるオープンソースサーバーです。create_wallet_passとupdate_wallet_passの2つのツールを備えたMCPサーバーであり、同じパスビルダーをREST APIとしても提供します。

MCPエンドポイントhttps://walletmcppass.com/mcp(Streamable HTTP)
REST APIPOST https://walletmcppass.com/api/passes、PATCH .../api/passes/{serial}
サインイン不要です。アカウントもAPIキーも必要ありません
料金IPアドレスごとに1日30回(作成+更新)まで無料。それを超える場合は、x402でBase上のUSDCを支払って、1回あたり$0.01です
制限無料利用は全体で1日500回。有料利用はIPアドレスごとに1日1,000回、全体で1日10,000回。パスは最大10 MBです
パスの種類搭乗券、イベントチケット、クーポン、ストアカード、汎用(iOS 27のポスターレイアウトにも対応)
対応環境Claude、ChatGPT、Codex、OpenAI Responses API、Claude Code、あらゆるStreamable HTTP MCPクライアント
出力1時間有効なダウンロードリンク。iPhoneで開くと「Apple Walletに追加」が表示されます
更新任意:updatable=Trueのパスは1時間、またはupdatable_hoursを指定すると最大30日間変更でき、インストール済みのパスも更新されます

クイックスタート

Claude(ウェブ、デスクトップ、モバイル。どのプランでも利用でき、Freeではカスタムコネクターを1つ設定できます):Customize → Connectorsを開き、+ Add → Add custom connectorをクリックします。名前にwalletmcppassを入力し、https://walletmcppass.com/mcpを貼り付けて、No sign inを選択し、Addをクリックします。チャットで**+ → Connectors**をクリックし、オンにします。詳しい手順。

ChatGPT:chatgpt.com/pluginsにアクセスし、+ → Add custom MCP serverを選択します。名前にwalletmcppassを入力し、Connectionにhttps://walletmcppass.com/mcpを入力して、認証をなしに設定し、Create as a pluginを選択します。チャットで@と入力し、walletmcppassを選びます。利用可否は、プランとワークスペースの設定によって異なります。詳しい手順。

Codex

codex mcp add walletmcppass --url https://walletmcppass.com/mcp

Claude Code

claude mcp add --transport http walletmcppass https://walletmcppass.com/mcp

OpenAI Responses API

from openai import OpenAI

client = OpenAI()
response = client.responses.create(
    model="gpt-6-astra",
    tools=[{
        "type": "mcp",
        "server_label": "walletmcppass",
        "server_description": "Creates signed Apple Wallet passes.",
        "server_url": "https://walletmcppass.com/mcp",
        "require_approval": "never",
    }],
    input="Make an Apple Wallet coupon for 20% off at Harbor Café, valid until 31 December, with the QR code CAFE20.",
)
print(response.output_text)

その他のMCPクライアント:https://walletmcppass.com/mcpに、ヘッダーなしのリモートStreamable HTTPサーバーを追加します。MCPクライアントをお持ちでない場合は、REST APIをご利用ください。

次のようにパスを依頼します。

  • 「このPDFからApple Walletの搭乗券を作成して。」(PDFを添付)
  • 「クライミングジムの会員カードをWalletパスにして。会員番号は004217、バーコードはCode 128で。」
  • 「金曜の午後9時、Blue Noteのイベントチケットを作成して。座席はB12で、このQRコードのテキストを使って:TICKET-0042。」

PDFの搭乗券をApple Walletに変換

航空会社のPDFまたはスクリーンショットをアシスタントに渡すと、Walletの搭乗券が作成されます。搭乗券は、航空会社が実際に発行したバーコードを使って作成されます。パスにはPDFと同じバーコードデータ(通常はIATA BCBP文字列を格納したPDF417またはAztecコード)が含まれ、保安検査場や搭乗ゲートのスキャナーはこのデータを読み取ります。このサービスは航空券の発行やチェックインを行わず、航空会社にも問い合わせません。また、搭乗ゲートの変更通知も届きません。アシスタントはPDFに印字されたテキストを正確に読み取れますが、バーコード画像は常に読み取れるとは限りません。読み取れない場合は、バーコードスキャナーアプリでスキャンして、テキストを貼り付けてください。

iOS 27の「パスを作成」との比較

iOS 27のWalletでは、iPhoneでカードをスキャンするか、Standard、Membership、Eventのテンプレートに入力できます。これはシンプルなカード1枚に対応する機能です。wallet-mcpでは、さらに次のことができます。

  • 搭乗券、クーポン、ストアカードのレイアウト、AppleのiOS 26のセマンティック搭乗券、iOS 27のポスターレイアウトに対応します。
  • スマートフォンでフォームに入力する代わりに、PDF、メール、または一文から、アシスタントやアプリがパスを作成できます。
  • バーコード形式(QR、PDF417、Aztec、Code 128はすべての環境で、Code 39、Codabar、EAN-13、ITFはiOS 27で対応)、色、ロゴ、画像、パスの裏面のテキストを設定できます。
  • 署名済みの.pkpassファイルを共有したり、iOS 27が動作していないiPhoneに追加したりできます。

プライバシー、利用規約、サポート

walletmcppass.comは独立したプロジェクトであり、Appleとは提携していません。パスの内容はリクエストログに記録されず、パスファイルはリンクの有効期限である1時間が経過すると削除されます。リクエストログに保持されるのは、時刻、IPアドレス、パスのスタイル、組織名のみです。更新可能なパスは、更新可能期間(デフォルトは1時間、最長30日)の間保存され、その後削除されます。質問やバグ報告はこちら:GitHubのイシュー。

このプロジェクトの目的

.pkpassを手作業で作成するには、pass.jsonの作成、アイコンやロゴ画像の生成、すべてのファイルのハッシュ値のマニフェストへの登録、Apple Pass Type ID証明書による署名、フラットな構成でのZIP化が必要です。手間がかかり、間違いやすい作業です(「以下の注意点」を参照)。このプロジェクトでは、こうした一連の処理を1回のMCPツール呼び出しにまとめているため、LLMエージェント(またはそのエージェントを通じたユーザー)がパスの作成を依頼するだけで済みます。

仕組み

1つのプロセス、1つのポートで、次の4つを提供します。

  • MCPエンドポイント(Streamable HTTP)は/mcpにあり、create_wallet_passツールを提供します。
  • REST APIはPOST /api/passesにあり、MCPを使わない呼び出し元にも同じパスビルダーを提供します。ツールとレート制限およびリクエストログを共有します。ログに記録される各リクエストには、どちらを経由したか(source = mcpまたはapi)も記録されます。
  • 使用状況ダッシュボードは/および/api/statsにあり、ローカルのSQLiteログから読み込んだリクエスト数、成功率/エラー率、最近のアクティビティを表示します。ホストされているインスタンスでは、これらの情報は一般公開されません。
  • 有効期間の短いダウンロードリンクは/download/{token}にあり、作成されたパスは、Walletがファイルを認識するために必要な正しいコンテンツタイプapplication/vnd.apple.pkpassで配信されます。リンクは1時間で期限切れとなり、ファイルの更新日時に基づいて削除されるため、クラッシュや再起動によってファイルが残ることはありません。
server.py        MCPServer instance: the tool + custom HTTP routes (REST API, dashboard, stats, downloads)
pass_builder.py  Builds pass.json per style, signs the manifest with openssl smime, zips the .pkpass
image_gen.py     Pillow-based icon/logo generation (colored square + initials / wordmark)
db.py            SQLite request log + per-IP and global daily rate limits
dashboard.html   Static dashboard page, polls /api/stats every 15s
wallet-mcp.service   Example systemd unit (Restart=on-failure, boots enabled)

ツール:create_wallet_pass

title: "Create Apple Wallet pass"、readOnlyHint: false、destructiveHint: falseの注釈が付いています。新しいパスファイルを作成するだけで、それ以外の操作は行いません。

style: "boardingPass" | "eventTicket" | "coupon" | "generic" | "storeCard"
organization_name, description        # required
logo_text, transit_type               # transit_type only applies to boardingPass ("Air" default)
barcode_message, barcode_format       # format name or ordered list, e.g. ["EAN13", "Code128"]; omit message for no barcode
                                       # "QR" (default) | "PDF417" | "Aztec" | "Code128"; iOS 27+: "Code39" | "Codabar" | "EAN13" | "ITF"
                                       # Wallet shows the first listed format the device supports; no fallback is added
barcode_alt_text                      # human-readable text under the barcode
background_color, foreground_color, label_color   # hex "#1a1a19" or "rgb(26, 26, 25)"
relevant_date, expiration_date        # ISO 8601
locations                              # up to 10 of {latitude, longitude, altitude?, relevantText?}: show on the lock screen nearby
max_distance                           # meters; can only shrink Wallet's default radius around each location
voided                                 # stamps the pass VOID
primary_fields, secondary_fields, auxiliary_fields, header_fields, back_fields
                                       # lists of {key?, label?, value}
serial_number                         # auto-generated UUID if omitted
icon_color, icon_text, logo_color     # control the auto-generated art
icon_png_b64, logo_png_b64            # supply your own PNG instead of auto-generated art
generate_logo                          # False = no logo image (e.g. when logo_text alone is enough)

# iOS 27+
poster                                 # Poster Generic layout; style must be generic/storeCard/coupon (kept as fallback)
footer_fields                          # up to 2, poster only
background_png_b64                     # poster background (1035x1515 px); gradient auto-generated if omitted
featured_actions                       # up to 2 of {type, url}, e.g. {"type": "membershipBenefits", "url": "https://..."}

# Semantic tags and layouts
semantics                              # Apple SemanticTags dict, emitted as given; unknown keys and bad types rejected
semantic_layout                        # boardingPass (airline, iOS 26+) -> semanticBoardingPass; eventTicket -> posterEventTicket
                                       # required tags are checked; the classic style stays as the fallback, so keep its fields
info_links                             # top-level event-guide / airline-page links: bagPolicyURL, changeSeatURL, ...

# Extra images (base64 PNG); which one shows depends on style and iOS version, see the tool docstring
primary_logo_png_b64, secondary_logo_png_b64, strip_png_b64, thumbnail_png_b64, artwork_png_b64

{ download_url, expires_in_seconds, serial_number, pass_type_identifier }を返します。ダウンロードリンクの有効期間は1時間です。iPhoneのSafariで開いてください。別のアプリから渡された.pkpassをWalletに追加することはできません。AndroidのGoogle Walletでも同じファイルをインポートできます。

REST API:POST /api/passes

JSON本文には、上記のツールパラメーターとまったく同じ項目を指定します。リクエストモデルは同じ関数シグネチャーから生成されるため、両者の内容が食い違うことはありません。未定義のキーは拒否されます。

curl https://walletmcppass.com/api/passes \
  -H 'Content-Type: application/json' \
  -d '{"style": "generic", "organization_name": "Harbor Climbing Gym", "description": "Day pass",
       "primary_fields": [{"label": "Guest", "value": "Ada L."}], "barcode_message": "DAY-0042"}'
ステータス本文
200ツールと同じ:{ download_url, expires_in_seconds, serial_number, pass_type_identifier }
400本文の形式が不正な場合や型が誤っている場合は{"error": "invalid request", "details": [...]}を、パス自体が無効な場合は{"error": "..."}を返します
402無料利用の上限(IP単位または全体)を超えた場合は、x402のPaymentRequired本文を返します(PAYMENT-REQUIREDヘッダーにもbase64でエンコードした内容が含まれます)。支払いを行って再試行してください。詳細はこちらを参照してください
429支払いが無効な場合に限り、{"error": "rate limit exceeded: ..."}または"service is at its daily request limit ..."を返します
500{"error": "internal error building the pass"}

ツールと同様に、スキーマ検証に失敗した本文はレート制限の適用前に拒否され、ログにも記録されません。パスビルダーのエラーはログに記録され、リクエスト数にも含まれます。

パスの更新:update_wallet_pass / PATCH /api/passes/{serial}

updatable=True を指定してパスを作成します。また、更新可能な期間を指定する場合は、updatable_hours(1~720、デフォルトは1)を指定します。レスポンスには updatable_until と edit_token が追加されます。これはパスを変更する唯一の手段となる秘密のトークンです(アカウントはなく、トークンを持つ人がパスの所有者です)。パスには webServiceURL({PUBLIC_BASE_URL}/passkit)と専用の authenticationToken が含まれるため、追加したすべての iPhone がサーバーに登録されます。

更新では serial_number、edit_token と、作成時のパラメーターを任意の数指定します。指定したパラメーターは保存済みの値を全体ごと置き換えます(フィールドのリストを指定した場合は、リスト全体が置き換えられます)。省略したパラメーターはそのまま保持されます。サーバーはパスに再署名して保存し、登録済みの各デバイスに空の APNs プッシュを送信します。すると Wallet が新しいバージョンを取得します。パスをキャンセルするには voided=True を指定します。フィールドの値が変わると、そのフィールドの changeMessage(例:"You now have %@ points")がロック画面に表示されます。Wallet は key でフィールドを照合するため、値が変わるフィールドには明示的なキーを指定してください。

curl -X PATCH https://walletmcppass.com/api/passes/$SERIAL \
  -H "Authorization: Bearer $EDIT_TOKEN" -H 'Content-Type: application/json' \
  -d '{"primary_fields": [{"key": "points", "label": "Points", "value": "150", "changeMessage": "You now have %@ points"}]}'

レスポンスには作成時のレスポンスに加えて、notified_devices と updatable_until が含まれます(APNs がプッシュを受け付けたデバイス数であり、まだ更新を取得していないデバイスは含みません)。ステータスコードは 200、400、401(ベアラートークンなし)、402、404(シリアル番号が不明、トークンが誤り、または更新可能期間の終了。意図的に同じ応答です)、429 です。更新は作成と同じ日次上限にカウントされます。

注意:

  • 内容が保存されるのは更新可能なパスのみです(passes テーブルに、編集トークンの SHA-256 ハッシュとともに保存されます)。期間は作成時から数えられ、更新しても延長されません。期間が終了すると、パスは直ちに存在しないものとして扱われ、ダウンロード用スイーパーが30秒以内に行とデバイス登録を削除します。Wallet に保存済みのコピーは最後のバージョンのままです。画像 URL は一度だけ取得して PNG として保存されるため、更新時に再取得されることはありません。
  • PassKit Web サービス(/passkit/v1/...)は Apple のプロトコルを実装しています。デバイスの登録と登録解除、変更されたシリアル番号の一覧表示(passesUpdatedSince はパスの整数値の updated 時刻です)、最新のパスの取得(If-Modified-Since によって 304 を返します)、ログ記録に対応しています。各パスに登録できるデバイスは最大100台です。
  • APNs では、venv に HTTP/2 クライアントがないため、パス署名証明書を使用して curl 経由で HTTP/2 を利用します。WALLET_MCP_APNS_URL でエンドポイントを上書きできます。テストではこれを指定して、偽のエンドポイントに接続します。プッシュが 400 または 410 を返した場合、そのデバイスのトークンを削除します。
  • nginx では、/mcp、/download/、= /api/passes に加えて、/passkit/ と /api/passes/ をバックエンドに転送する必要があります。
  • テスト:tests/test_updates.py。

画像 URL

すべての *_png_b64 パラメーターでは、https:// URL も指定できます。image_fetch.py は SSRF 対策を適用して URL から画像を取得します。https のみを許可し、解決されたすべてのアドレスがグローバルにルーティング可能であることを確認します(ループバック、プライベート、リンクローカル、CGNAT/tailnet のアドレスは許可されません)。接続先は確認済みの IP に固定され、リダイレクトも再確認されます(最大3回)。上限は5 MB、2,500万画素、各読み込みにつき10秒です。JPEG、WebP、GIF、ICO は PNG に変換されます。Base64 入力の従来のルールはそのままで、PNG のみが許可されます。

独自のインスタンスをデプロイする

独自の Apple Developer Pass Type ID 証明書が必要です。このリポジトリのpass_builder.pyにある設計用の証明書は含まれておらず、含めることもできません。特定の Apple Developer アカウントに紐づく秘密鍵だからです。インスタンスを立ち上げる手順は次のとおりです。

  1. Apple Developer ポータルで Pass Type ID 証明書を発行し、秘密鍵と署名済み証明書を PEM 形式でエクスポートして、Apple の WWDR G4 中間証明書をダウンロードします。
  2. pass_builder.pyで、SIGNING_DIR/PASSKEY/CERT/WWDRを各ファイルの場所に設定し、PASS_TYPE_IDENTIFIER/TEAM_IDENTIFIERを独自の値に設定します。
  3. Python 環境をセットアップします(このプロジェクトでは、標準的なツール以外にpip/venvを前提としていません)。
    uv venv .venv
    uv pip install --python .venv/bin/python "mcp[cli]" pillow uvicorn starlette "x402[evm,httpx]==2.25.0"
    
  4. 実行します。
    PORT=8400 WALLET_MCP_PUBLIC_URL=https://your-domain/wallet-mcp \
      WALLET_MCP_PUBLIC_HOST=your-domain \
      .venv/bin/python server.py
    
    WALLET_MCP_PUBLIC_HOSTは重要です。MCP SDK では DNS リバインディング保護がデフォルトで有効になっており、リクエストのHostヘッダーが許可リストにない場合、すべてのリクエストが 421 で拒否されます。サーバーへの実際の接続に使われるホスト名を設定してください。
  5. TLS を設定したリバースプロキシ(nginx、Caddy など)を前段に配置し、/mcp、/download/、/api/passesを公開します(プライベートダッシュボードである/と/api/statsは公開しないでください)。nginx を使う場合、Streamable HTTP トランスポートには次の設定が必要です。
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_buffering off;
    proxy_read_timeout 3600s;
    
    バッファリングを無効にしないと、プロキシ経由で SSE ストリームが停止します。
  6. クラッシュや再起動後も稼働するように、プロセススーパーバイザーの下で実行します。このリポジトリのwallet-mcp.serviceは、動作する設定例です(systemd、Restart=on-failure、WantedBy=multi-user.target)。

レート制限

API キーはありません。URL を知っている人なら誰でも、ツールまたは REST API を呼び出せます。db.pyの1日あたりの上限のみで保護されています。呼び出し元 IP ごとに1日30件、保護のため全体で1日500件の無料呼び出し(有料呼び出しは除外)が上限です。MCP と REST の呼び出しは合算してカウントされます(WALLET_MCP_IP_LIMIT/WALLET_MCP_GLOBAL_LIMITで変更できます。WALLET_MCP_DBで SQLite ファイルの場所を変更でき、テストで使用されます)。直接呼び出すのではなく、ホスト型 MCP クライアント(例:claude.ai コネクター)の背後に配置する場合、サーバー側では多くのエンドユーザーが同じ IP に見えることがあるため、呼び出し元ごとの上限で個別に制限できない点に注意してください。その場合、実際に保護の役割を果たすのは全体の上限です。

無料上限を超えた場合の支払い:x402

WALLET_MCP_X402_PAY_TO に Base アドレスを設定すると、無料上限(IP ごとまたは全体)のいずれかを超えた呼び出し元には、拒否される代わりに $0.01 の USDC で呼び出す方法が提示されます。有料の呼び出しは、全体の無料予算にはカウントされません。有料呼び出しには独自の上限があり、IP ごとに 1 日 1,000 回、合計 10,000 回(WALLET_MCP_PAID_IP_LIMIT / WALLET_MCP_PAID_GLOBAL_LIMIT)です。これを超えると、通常の 429 が返されます。この設定がない場合は、従来どおり通常の 429 が返されます。payments.py は x402 SDK を使用します。

  • MCP:拒否された呼び出しは、x402 v2 の PaymentRequired を structuredContent に含むツールエラーです(リソースは mcp://tool/create_wallet_pass または update_wallet_pass)。クライアントは、署名済みの支払い情報を _meta["x402/payment"] に含めて同じ呼び出しを再試行します。その結果には、レシートが _meta["x402/payment-response"] および payment キーとして含まれます。
  • REST:PaymentRequired の本文と PAYMENT-REQUIRED ヘッダーを含む 402 が返されます。クライアントは PAYMENT-SIGNATURE(または従来の X-PAYMENT)ヘッダーを付けて再試行し、PAYMENT-RESPONSE および payment としてレシートを受け取ります。

ファシリテーターは、処理を開始する前に支払いを検証します。パスの構築後、パスを引き渡し、保存、またはプッシュする前に、オンチェーンで決済します。そのため、構築に失敗しても請求されず、決済に失敗した場合(再度 402 が返された場合)は、何も受け取れず、変更もありません。上限に達していないときに送信された支払いは無視され、請求されません。決済が完了した呼び出しは、それぞれ payment_tx とともに記録されます。サーバーが秘密鍵を保持することはありません。USDC は直接、支払い先アドレスに送られます。

環境変数デフォルト
WALLET_MCP_X402_PAY_TO未設定 = 支払い機能はオフ
WALLET_MCP_X402_FACILITATORhttps://facilitator.payai.network(アカウントなしで Base メインネットの決済を実行)
WALLET_MCP_X402_NETWORKeip155:8453(Base メインネット)
WALLET_MCP_X402_PRICE$0.01

Coinbase の CDP ファシリテーターには CDP API キーの認証ヘッダーも必要ですが、まだ組み込まれていません。tests/test_x402.py は、偽のファシリテーターを使用して実行されます。--live を指定すると、PayAI に対して資金のない支払いもメインネットで送信されます。この支払いは残高不足により拒否される必要があります。

容量保護

これらにより、支払いの有無を問わず、どの呼び出し元もサーバーを停止させることができなくなります。

  • 構築されたパスが 10 MB を超える場合、400 で拒否されます(WALLET_MCP_MAX_PASS_KB)。画像がない場合、パスは約 16 KB で、サイズの大部分は画像によるものです。
  • 空きディスク容量が 5 GB 未満の場合、新しいパスの作成または更新はすべて 503 になります(WALLET_MCP_MIN_FREE_DISK_GB)。
  • 同時に実行できるビルドは最大 4 件(BUILD_LIMITER)で、それ以外はキューに入ります。メモリを最も消費する処理は画像のデコードです。
  • wallet-mcp.service の systemd による保護設定:MemoryHigh=1G、MemoryMax=1536M、CPUQuota=200%。ビルドが暴走しても、サーバー全体ではなくこのサービスが OOM によって終了し、再起動されます。

別の cron として動作する使用状況監視機能は、これらのいずれかが発生したとき、systemd がサービスを再起動したとき、または空きディスク容量が 10 GB を下回ったときにメールを送信します。

pass_builder.py または image_gen.py を編集する前に知っておきたい注意点

  • barcodes は pass.json のトップレベルキーであり、boardingPass/eventTicket などと同じ階層にあります。スタイル辞書の中にネストするものではありません。そこにネストしても無視されます。パスは問題なくインストールできますが、カードにバーコードが表示されません。
  • .pkpass ファイルは、Content-Type: application/vnd.apple.pkpass を明示して配信してください。Python の mimetypes モジュールも、ほとんどの静的ファイルサーバーもこの拡張子に対応しておらず、application/octet-stream にフォールバックします。その結果、Wallet(および Mail/ブラウザー)は「Apple Walletに追加」を提示せず、通常のダウンロードとして扱います。
  • フィールドキーは、パス内の各セクションを通じて一意でなければなりません。自動生成キーは以前、各セクションで field0 から始まっていました。iOS はこのようなパスの多くをそのまま拒否します(パスが開きません)が、組み合わせによっては通るため、問題が見えにくくなっていました。現在、キーにはセクションの接頭辞(primary0、secondary0 など)が付き、重複する場合は末尾に文字列が追加されます。
  • Interleaved 2 of 5 バーコードのフォーマット文字列は PKBarcodeFormatITF ではなく、PKBarcodeFormatI2of5 です。WWDC26 の解説記事には誤った記載が複数あります。apple/pass-builder が iOS 27 のキーに関する信頼できる参照先です。
  • Apple のドキュメントと Apple 自身の pass-builder コードでは、搭乗券のタイムゾーンを表すキーの名称が異なります。ドキュメントでは departureLocationTimeZone、コードでは departureAirportTimeZone となっており、目的地についても同様です。どちらも受け付けられ、指定したとおりに出力されるため、両方を送信してください。
  • Apple の Pass Builder バリデーターは、NFC のないポスター形式のイベントチケットをエラーとして報告します。また、ドキュメントには、このデザインはバーコードでの入場を想定していないと記載されています。このデプロイ環境には Apple のエンタイトルメントがないため、これらのパスは従来型のイベントチケットとして表示される場合があります。
  • バーコードの中には(多くの航空会社の搭乗券など)、QR コードではなく Aztec コードを使用しているものがあります。見た目は似ていますが、角にある四角形のファインダーパターンが3つではなく、ブルズアイ型のものが1つあります。実際にエンコードしている内容に合わせて barcode_format を設定してください。

MCP Registry

server.json は、公式MCP Registry に com.walletmcppass/wallet-mcp として登録されたホストインスタンスを記述しています。

ステータス

walletmcppass.com で稼働中です。実行時のデプロイ構成については wallet-mcp.service を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。