Skip to content

PassFast

by passfa.st · remote · no sign-in to list tools · v1.0.0 · published by st.passfa

Remote HTTPS MCP for Apple + Google Wallet passes. Paste sk_live_ once.

Deletes · 9Final · 1Changes · 21

47 tools: 9 can delete or cancel things, 1 do something that can't be undone, 21 change things and 16 only read.

Scanned Oct 21, 2026

9 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http passfast https://passfa.st/mcp --header 'Authorization: <your-authorization>'

Findings

Matches of fixed checks, with the text they matched.

9 info
Show 3 more findings
  • The input schema at properties.signing_mode.description mentions "credentials".

    Matched text

    inputSchema.properties.signing_mode.description: "...e signing mode. `managed` uses platform credentials; `custom` uses your own."

    What this check looks for
  • The input schema at properties.google_signing_mode.description mentions "credentials".

    Matched text

    inputSchema.properties.google_signing_mode.description: "...e signing mode. `managed` uses platform credentials; `custom` uses your own."

    What this check looks for
  • The description mentions "credentials".

    Matched text

    description: "...urns whether managed (platform) signing credentials are available for Apple and Google wall..."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

47 tools

Deletes or cancels 9Claude Code: deny
  • deactivateGoogleCredentialDeactivate Google credential Deactivates a Google Wallet credential.2 findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "Deactivate Google credential Deactivates a Google Wallet credential..."

      What this check looks for
    • Info

      The input schema at properties.id.description mentions "credential".

      Matched text

      inputSchema.properties.id.description: "Google credential ID."

      What this check looks for
    Description, as the server wrote it
    Deactivate Google credential Deactivates a Google Wallet credential. **Scope:** `certs:manage` Maps to OpenAPI operationId `deactivateGoogleCredential` — DELETE /manage-certs/google/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • deleteApiKeyDelete an API key Permanently deletes an API key.No findings

    Why it is in this group

    • The name "deleteApiKey" says "delete": a word for removing or ending something.
    • The description says "Permanently deletes".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete an API key Permanently deletes an API key. The key **must be revoked first** (via PATCH) before it can be deleted. Attempting to delete an active key returns 400. **Scope:** `org:manage` Maps to OpenAPI operationId `deleteApiKey` — DELETE /manage-keys/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • deleteAppDeactivate an app Deactivates the current app.No findings

    Why it is in this group

    • The name "deleteApp" says "delete": a word for removing or ending something.
    • The description says "permanently delete".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Deactivate an app Deactivates the current app. This does not permanently delete data. **Scope:** `org:manage` Maps to OpenAPI operationId `deleteApp` — DELETE /manage-org/app. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • deleteCertificateDelete a certificate Deletes a certificate.No findings

    Why it is in this group

    • The name "deleteCertificate" says "delete": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete a certificate Deletes a certificate. **Scope:** `certs:manage` Maps to OpenAPI operationId `deleteCertificate` — DELETE /manage-certs/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • deleteImageDelete an image Deletes an image (storage file + DB row).No findings

    Why it is in this group

    • The name "deleteImage" says "delete": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete an image Deletes an image (storage file + DB row). Always succeeds when the image exists. Any template column pointing at this image is silently cleared (the template falls back to no image in that slot — re-attach a new one if needed). Any pass with `strip_image_id` pointing at this image has its override nullified and reverts to the template's strip on next render. Use `GET /manage-images/{id}/usage` first if you need to know the blast radius before deleting. **Scope:** `images:manage` Maps to OpenAPI operationId `deleteImage` — DELETE /manage-images/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • deleteTemplateDelete a template Soft-deletes a template by marking it as archived.No findings

    Why it is in this group

    • The name "deleteTemplate" says "delete": a word for removing or ending something.
    • The description says "permanently delete".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete a template Soft-deletes a template by marking it as archived. Use `permanent=true` to permanently delete the template and its associated data. **Scope:** `templates:manage` Maps to OpenAPI operationId `deleteTemplate` — DELETE /manage-templates/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • revokeApiKeyRevoke an API key Revokes an API key, making it inactive.No findings

    Why it is in this group

    • The name "revokeApiKey" says "revoke": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Revoke an API key Revokes an API key, making it inactive. Revoked keys cannot authenticate. **Scope:** `org:manage` Maps to OpenAPI operationId `revokeApiKey` — PATCH /manage-keys/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • voidPassVoid a pass Marks a pass as invalidated and rebuilds the `.pkpass` file with Apple's `voided: true` flag.No findings

    Why it is in this group

    • The name "voidPass" says "void": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Void a pass Marks a pass as invalidated and rebuilds the `.pkpass` file with Apple's `voided: true` flag. Registered devices are sent push notifications so the pass appears voided immediately in Apple Wallet. Rebuild failure is non-fatal — the pass is still invalidated at the DB level. **Scope:** `passes:manage` Maps to OpenAPI operationId `voidPass` — POST /manage-passes/{id}/void. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • voidPassBySerialVoid a pass by serial number Marks a pass (looked up by serial number) as invalidated and rebuilds the `.pkpass` file with Apple's `voided: true` flag.No findings

    Why it is in this group

    • The name "voidPassBySerial" says "void": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Void a pass by serial number Marks a pass (looked up by serial number) as invalidated and rebuilds the `.pkpass` file with Apple's `voided: true` flag. Registered devices are sent push notifications so the pass appears voided immediately in Apple Wallet. When a serial has both Apple and Google passes, use `?wallet_type=` to select which one (defaults to `apple`). **Scope:** `passes:manage` Maps to OpenAPI operationId `voidPassBySerial` — POST /manage-passes/serial/{serial_number}/void. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
Can't be undone 1Claude Code: ask
  • publishTemplatePublish a template Publishes a draft template, making it available for pass generation.No findings

    Why it is in this group

    • The name "publishTemplate" says "publish": a word for a change that another call does not undo.
    Description, as the server wrote it
    Publish a template Publishes a draft template, making it available for pass generation. Published templates cannot be modified. **Scope:** `templates:manage` Maps to OpenAPI operationId `publishTemplate` — POST /manage-templates/{id}/publish. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
Changes things 21Claude Code: ask
  • batchGeneratePassesBatch generate wallet passes Generate up to 100 wallet passes in one **synchronous** request.No findings

    Why it is in this group

    • The name "batchGeneratePasses" says "generate": a word for a change.
    Description, as the server wrote it
    Batch generate wallet passes Generate up to 100 wallet passes in one **synchronous** request. Each accepted row is one `POST /generate-pass` (same free-100 and card-on-file gates as a single generate). Optional `POST /share-pass/create` per successful row when `create_share_links` is true (default). **Host:** `https://passfa.st/api/passes/batch` (site / Vercel preview). This is not an `api.passfa.st` Edge Function. MCP tool: `batchGeneratePasses` (secret key `sk_live_` only) — same path and body as this operation. **Auth:** `Authorization: Bearer sk_live_…` or `pk_live_…` (scope `passes:create`). A Supabase user JWT is also accepted (dashboard session). Send `X-App-Id` for multi-app orgs and `X-Org-Id` as elsewhere. **Body:** mapped `rows` (same shape the dashboard posts) **or** raw `csv` plus optional `column_map`. Do not send both. **Limits:** more than 100 rows → `400 row_limit_exceeded` **before** any generate. Empty body / empty CSV → `400 empty_batch` or `invalid_csv`. Bad template → `400 invalid_template`. Missing or invalid Bearer → `401 unauthorized`. **Billing:** a row that hits the free-100 / card gate returns the same `402` codes as generate-pass (`free_limit_reached`, `subscription_canceled`, `payment_past_due`). Remaining rows stop. Already-created rows stay. HTTP `402` is returned only when **zero** rows succeeded; a later-row 402 after some successes is HTTP `200` with `stopped_reason` and per-row results. **Partial failures:** other per-row errors (validation, duplicate serial, share-link warning) continue. The response lists every processed row. **Scope:** `passes:create` Maps to OpenAPI operationId `batchGeneratePasses` — POST /passes/batch. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • createApiKeyCreate an API key Creates a new API key.No findings

    Why it is in this group

    • The name "createApiKey" says "create": a word for a change.
    Description, as the server wrote it
    Create an API key Creates a new API key. The response contains `id`, `name`, `key_type`, `key_prefix`, `raw_key`, and `message`. The full raw key is shown only once and cannot be retrieved again. **Scope:** `org:manage` Maps to OpenAPI operationId `createApiKey` — POST /manage-keys. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • createAppCreate a new app Creates a new app within the organization.No findings

    Why it is in this group

    • The name "createApp" says "create": a word for a change.
    Description, as the server wrote it
    Create a new app Creates a new app within the organization. **Scope:** `org:manage` Maps to OpenAPI operationId `createApp` — POST /manage-org/app. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • createShareTokenCreate a share token Creates a public share token for a pass, enabling distribution via URL, QR code, or messaging.No findings

    Why it is in this group

    • The name "createShareToken" says "create": a word for a change.
    Description, as the server wrote it
    Create a share token Creates a public share token for a pass, enabling distribution via URL, QR code, or messaging. The share URL points to a public page where recipients can add the pass to Apple or Google Wallet without logging in. Idempotent — if the pass already has a share token, the existing token is returned (200) instead of creating a new one (201). For dual-wallet passes (same serial number with both Apple and Google), the share token is automatically applied to all sibling passes. **Scope:** `passes:manage` Maps to OpenAPI operationId `createShareToken` — POST /share-pass/create. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • createTemplateCreate a template Creates a new pass template in draft status.No findings

    Why it is in this group

    • The name "createTemplate" says "create": a word for a change.
    Description, as the server wrote it
    Create a template Creates a new pass template in draft status. **Scope:** `templates:manage` Maps to OpenAPI operationId `createTemplate` — POST /manage-templates. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • downloadPassDownload a .pkpass file Downloads the `.pkpass` binary for an active pass.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Download a .pkpass file Downloads the `.pkpass` binary for an active pass. **Scope:** `passes:download` Maps to OpenAPI operationId `downloadPass` — GET /manage-passes/{id}/download. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • downloadPassBySerialDownload a .pkpass file by serial number Downloads the `.pkpass` binary for an active pass looked up by serial number.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Download a .pkpass file by serial number Downloads the `.pkpass` binary for an active pass looked up by serial number. When a serial has both Apple and Google passes, use `?wallet_type=` to select which one (defaults to `apple`). **Scope:** `passes:download` Maps to OpenAPI operationId `downloadPassBySerial` — GET /manage-passes/serial/{serial_number}/download. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • downloadSharedPassDownload shared Apple .pkpass Downloads the Apple `.pkpass` file for a shared pass.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Download shared Apple .pkpass Downloads the Apple `.pkpass` file for a shared pass. No authentication required. Only works for active Apple passes. Maps to OpenAPI operationId `downloadSharedPass` — GET /share-pass/{token}/download. Public endpoint — no API key required. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • generatePassGenerate a wallet pass Generates a wallet pass from a published template.No findings

    Why it is in this group

    • The name "generatePass" says "generate": a word for a change.
    Description, as the server wrote it
    Generate a wallet pass Generates a wallet pass from a published template. For Apple passes (default), returns a signed `.pkpass` binary file directly. For Google passes (`wallet_type: "google"`), returns a JSON object containing a `save_url` that the user can open to add the pass to Google Wallet. When `wallet_type: "both"`, generates both Apple and Google passes in a single call. The response is always JSON with `apple` and `google` keys. Partial success is allowed — if one wallet fails, the other is still returned with a warning. Returns 201 if at least one succeeds. The pass ID is returned in the `X-Pass-Id` response header (for single-wallet). If the app has a validation webhook configured, the webhook is called once before generation (not per wallet type). A webhook rejection returns 403; a webhook error returns 502 (fail-closed). **Scope:** `passes:create` Maps to OpenAPI operationId `generatePass` — POST /generate-pass. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • testAppleCertificatesTest Apple certificates Generates an ephemeral test `.pkpass` file to verify that the uploaded Apple signing certificates are valid and complete.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Test Apple certificates Generates an ephemeral test `.pkpass` file to verify that the uploaded Apple signing certificates are valid and complete. The test pass is not stored — it is returned directly as a binary download. **Scope:** `certs:manage` Maps to OpenAPI operationId `testAppleCertificates` — POST /manage-certs/test. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • testGoogleConnectionTest Google connection Tests the configured Google Wallet credentials by attempting to authenticate with the Google Wallet API.1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "...ion Tests the configured Google Wallet credentials by attempting to authenticate with the..."

      What this check looks for
    Description, as the server wrote it
    Test Google connection Tests the configured Google Wallet credentials by attempting to authenticate with the Google Wallet API. **Scope:** `certs:manage` Maps to OpenAPI operationId `testGoogleConnection` — POST /manage-certs/google/test. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • testWebhookTest the validation webhook Sends a sample validation webhook payload to the configured URL and returns the result.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Test the validation webhook Sends a sample validation webhook payload to the configured URL and returns the result. **Scope:** `org:manage` Maps to OpenAPI operationId `testWebhook` — POST /manage-org/app/test-webhook. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • updateAppUpdate app settings Updates the current app's settings, including webhook configuration.2 findings

    Why it is in this group

    • The name "updateApp" says "update": a word for a change.

    Findings

    • Info

      The input schema at properties.signing_mode.description mentions "credentials".

      Matched text

      inputSchema.properties.signing_mode.description: "...e signing mode. `managed` uses platform credentials; `custom` uses your own."

      What this check looks for
    • Info

      The input schema at properties.google_signing_mode.description mentions "credentials".

      Matched text

      inputSchema.properties.google_signing_mode.description: "...e signing mode. `managed` uses platform credentials; `custom` uses your own."

      What this check looks for
    Description, as the server wrote it
    Update app settings Updates the current app's settings, including webhook configuration. Set `regenerate_webhook_secret` to `true` to generate a new webhook signing secret; the new secret is returned in `webhook_secret_raw` (shown only once). **Scope:** `org:manage` Maps to OpenAPI operationId `updateApp` — PATCH /manage-org/app. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • updateOrganizationUpdate organization settings Updates the current organization's settings, including APNs credentials.1 finding

    Why it is in this group

    • The name "updateOrganization" says "update": a word for a change.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "...organization's settings, including APNs credentials. **Scope:** `org:manage` Maps to Open..."

      What this check looks for
    Description, as the server wrote it
    Update organization settings Updates the current organization's settings, including APNs credentials. **Scope:** `org:manage` Maps to OpenAPI operationId `updateOrganization` — PATCH /manage-org. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • updatePassUpdate a pass Updates the dynamic data of an active pass.No findings

    Why it is in this group

    • The name "updatePass" says "update": a word for a change.
    Description, as the server wrote it
    Update a pass Updates the dynamic data of an active pass. Optionally sends a push notification to registered devices so they fetch the updated pass. At least one of `data`, `expires_at`, `locations`, `relevant_date`, or `max_distance` is required. **Scope:** `passes:manage` Maps to OpenAPI operationId `updatePass` — PATCH /manage-passes/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • updatePassBySerialUpdate a pass by serial number Updates the dynamic data of an active pass looked up by serial number.No findings

    Why it is in this group

    • The name "updatePassBySerial" says "update": a word for a change.
    Description, as the server wrote it
    Update a pass by serial number Updates the dynamic data of an active pass looked up by serial number. Optionally sends a push notification to registered devices. At least one of `data`, `expires_at`, `locations`, `relevant_date`, or `max_distance` is required. When a serial has both Apple and Google passes, use `?wallet_type=` to select which one (defaults to `apple`). **Scope:** `passes:manage` Maps to OpenAPI operationId `updatePassBySerial` — PATCH /manage-passes/serial/{serial_number}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • updateTemplateUpdate a template Updates a draft template.No findings

    Why it is in this group

    • The name "updateTemplate" says "update": a word for a change.
    Description, as the server wrote it
    Update a template Updates a draft template. Published templates cannot be modified. **Scope:** `templates:manage` Maps to OpenAPI operationId `updateTemplate` — PATCH /manage-templates/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • uploadCertificateUpload a single certificate Uploads a single PEM-encoded certificate or key.No findings

    Why it is in this group

    • The name "uploadCertificate" says "upload": a word for a change.
    Description, as the server wrote it
    Upload a single certificate Uploads a single PEM-encoded certificate or key. **Scope:** `certs:manage` Maps to OpenAPI operationId `uploadCertificate` — POST /manage-certs. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • uploadGoogleCredentialsUpload Google credentials Uploads Google service account credentials for Google Wallet pass signing.1 finding

    Why it is in this group

    • The name "uploadGoogleCredentials" says "upload": a word for a change.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "Upload Google credentials Uploads Google service account credent..."

      What this check looks for
    Description, as the server wrote it
    Upload Google credentials Uploads Google service account credentials for Google Wallet pass signing. The service account JSON and issuer ID are stored securely. **Scope:** `certs:manage` Maps to OpenAPI operationId `uploadGoogleCredentials` — POST /manage-certs/google. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • uploadImageUpload an image Uploads an image for use in pass templates or per-pass strip overrides.No findings

    Why it is in this group

    • The name "uploadImage" says "upload": a word for a change.
    Description, as the server wrote it
    Upload an image Uploads an image for use in pass templates or per-pass strip overrides. Send as multipart form data with a `purpose` field and a `file` field containing the PNG image. **Upload behaviour by purpose:** - `strip` — **accumulates**. Each upload creates a new image; the returned `id` can be passed as `strip_image_id` on `POST /v1/passes` or `PATCH /v1/passes/{id}` to give individual passes their own banner. Previous `strip` images are NOT deleted — manage them via `DELETE /v1/images/{id}` when no longer referenced. - All other purposes (`icon`, `logo`, `thumbnail`, `background`, `footer`, and all `_2x`/`_3x` variants) — **replace-on-upload**. Uploading a new image of the same purpose deletes the previous one from storage and DB. These are app-wide template assets, not per-pass. **Scope:** `images:manage` Maps to OpenAPI operationId `uploadImage` — POST /manage-images. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • uploadP12CertificateUpload a .p12 certificate bundle Uploads a PKCS#12 (.p12) bundle containing signer certificate and private key.No findings

    Why it is in this group

    • The name "uploadP12Certificate" says "upload": a word for a change.
    Description, as the server wrote it
    Upload a .p12 certificate bundle Uploads a PKCS#12 (.p12) bundle containing signer certificate and private key. The bundle is decrypted with the provided password, and individual certificates are extracted and stored with AES-256-GCM encryption. **Scope:** `certs:manage` Maps to OpenAPI operationId `uploadP12Certificate` — POST /manage-certs/p12. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
Only reads 16Claude Code: allow
  • getAppGet current app details Returns the current app's settings.No findings

    Why it is in this group

    • The name "getApp" says "get": a word for reading.
    Description, as the server wrote it
    Get current app details Returns the current app's settings. **Scope:** `org:read` Maps to OpenAPI operationId `getApp` — GET /manage-org/app. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • getBatchGenerateLimitsBatch generate limits Public metadata for `POST /passes/batch`.No findings

    Why it is in this group

    • The name "getBatchGenerateLimits" says "get": a word for reading.
    Description, as the server wrote it
    Batch generate limits Public metadata for `POST /passes/batch`. No authentication. Returns the hard row cap (100), sync mode, auth summary, and stable error codes. This path is on the site host (`https://passfa.st/api`), not `https://api.passfa.st/functions/v1`. MCP tool: `getBatchGenerateLimits`. Maps to OpenAPI operationId `getBatchGenerateLimits` — GET /passes/batch. Public endpoint — no API key required. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • getImageUsageGet image usage / reference counts Report how an image is referenced across templates and passes.No findings

    Why it is in this group

    • The name "getImageUsage" says "get": a word for reading.
    Description, as the server wrote it
    Get image usage / reference counts Report how an image is referenced across templates and passes. Useful before DELETE to confirm an image is unused, or to find which templates a shared asset is attached to. - `template_refs` lists every template column (e.g. `strip_image_id`, `icon_image_id`, `google_logo_image_id`) that references this image. - `pass_refs_count` is the number of passes whose per-pass `strip_image_id` points at this image. - `safe_to_delete` is `true` when `total_refs` is 0. **Scope:** `images:manage` Maps to OpenAPI operationId `getImageUsage` — GET /manage-images/{id}/usage. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • getManagedSigningStatusCheck managed signing availability Returns whether managed (platform) signing credentials are available for Apple and Google wallets.1 finding

    Why it is in this group

    • The name "getManagedSigningStatus" says "get": a word for reading.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "...urns whether managed (platform) signing credentials are available for Apple and Google wall..."

      What this check looks for
    Description, as the server wrote it
    Check managed signing availability Returns whether managed (platform) signing credentials are available for Apple and Google wallets. When `apple_ready` or `google_ready` is `true`, apps can use `signing_mode: "managed"` or `google_signing_mode: "managed"` without uploading their own credentials. **Scope:** `org:read` Maps to OpenAPI operationId `getManagedSigningStatus` — GET /manage-org/managed-signing-status. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • getOrganizationGet organization details Returns the current organization's settings.No findings

    Why it is in this group

    • The name "getOrganization" says "get": a word for reading.
    Description, as the server wrote it
    Get organization details Returns the current organization's settings. **Scope:** `org:read` Maps to OpenAPI operationId `getOrganization` — GET /manage-org. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • getPassGet a pass Returns the full details of a single pass.No findings

    Why it is in this group

    • The name "getPass" says "get": a word for reading.
    Description, as the server wrote it
    Get a pass Returns the full details of a single pass. **Scope:** `passes:read` Maps to OpenAPI operationId `getPass` — GET /manage-passes/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • getPassBySerialGet a pass by serial number Returns the full details of a single pass looked up by serial number.No findings

    Why it is in this group

    • The name "getPassBySerial" says "get": a word for reading.
    Description, as the server wrote it
    Get a pass by serial number Returns the full details of a single pass looked up by serial number. When a serial has both Apple and Google passes, use `?wallet_type=` to select which one (defaults to `apple`). **Scope:** `passes:read` Maps to OpenAPI operationId `getPassBySerial` — GET /manage-passes/serial/{serial_number}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • getSharePassMetadataGet shared pass metadata Returns public metadata for a shared pass.No findings

    Why it is in this group

    • The name "getSharePassMetadata" says "get": a word for reading.
    Description, as the server wrote it
    Get shared pass metadata Returns public metadata for a shared pass. No authentication required. Used by the public share page to display wallet buttons and pass info. Maps to OpenAPI operationId `getSharePassMetadata` — GET /share-pass/{token}. Public endpoint — no API key required. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • getTemplateGet a template Returns the full details of a single template.No findings

    Why it is in this group

    • The name "getTemplate" says "get": a word for reading.
    Description, as the server wrote it
    Get a template Returns the full details of a single template. **Scope:** `templates:manage` Maps to OpenAPI operationId `getTemplate` — GET /manage-templates/{id}. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listApiKeysList API keys Returns all API keys for the current organization.No findings

    Why it is in this group

    • The name "listApiKeys" says "list": a word for reading.
    Description, as the server wrote it
    List API keys Returns all API keys for the current organization. **Scope:** `org:manage` Maps to OpenAPI operationId `listApiKeys` — GET /manage-keys. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listCertificatesList certificates Returns all certificates for the current app.No findings

    Why it is in this group

    • The name "listCertificates" says "list": a word for reading.
    Description, as the server wrote it
    List certificates Returns all certificates for the current app. **Scope:** `certs:manage` Maps to OpenAPI operationId `listCertificates` — GET /manage-certs. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listGoogleCredentialsList Google credentials Returns all active Google Wallet credentials for the current app.1 finding

    Why it is in this group

    • The name "listGoogleCredentials" says "list": a word for reading.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "List Google credentials Returns all active Google Wallet crede..."

      What this check looks for
    Description, as the server wrote it
    List Google credentials Returns all active Google Wallet credentials for the current app. **Scope:** `certs:manage` Maps to OpenAPI operationId `listGoogleCredentials` — GET /manage-certs/google. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listImagesList images Returns all images for the current app, including signed preview URLs.No findings

    Why it is in this group

    • The name "listImages" says "list": a word for reading.
    Description, as the server wrote it
    List images Returns all images for the current app, including signed preview URLs. **Scope:** `images:manage` Maps to OpenAPI operationId `listImages` — GET /manage-images. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listPassesList passes Returns a paginated list of passes for the current app.No findings

    Why it is in this group

    • The name "listPasses" says "list": a word for reading.
    Description, as the server wrote it
    List passes Returns a paginated list of passes for the current app. **Scope:** `passes:read` Maps to OpenAPI operationId `listPasses` — GET /manage-passes. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listTemplatesList templates Returns all templates for the current app.No findings

    Why it is in this group

    • The name "listTemplates" says "list": a word for reading.
    Description, as the server wrote it
    List templates Returns all templates for the current app. By default returns non-archived templates. Set `archived=true` to return only archived templates. **Scope:** `templates:manage` Maps to OpenAPI operationId `listTemplates` — GET /manage-templates. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listWebhookEventsList webhook events Returns a paginated list of webhook event delivery records for the current app.No findings

    Why it is in this group

    • The name "listWebhookEvents" says "list": a word for reading.
    Description, as the server wrote it
    List webhook events Returns a paginated list of webhook event delivery records for the current app. **Scope:** `org:read` Maps to OpenAPI operationId `listWebhookEvents` — GET /manage-org/webhook-events. Same PassFast HTTP API, billing, and rate limits. Do not invent other paths.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http passfast https://passfa.st/mcp --header 'Authorization: <your-authorization>'

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__passfast__getBatchGenerateLimits",
      "mcp__passfast__listPasses",
      "mcp__passfast__getPass",
      "mcp__passfast__getPassBySerial",
      "mcp__passfast__listTemplates",
      "mcp__passfast__getTemplate",
      "mcp__passfast__listImages",
      "mcp__passfast__getImageUsage",
      "mcp__passfast__listCertificates",
      "mcp__passfast__listGoogleCredentials",
      "mcp__passfast__getOrganization",
      "mcp__passfast__getApp",
      "mcp__passfast__getManagedSigningStatus",
      "mcp__passfast__listWebhookEvents",
      "mcp__passfast__listApiKeys",
      "mcp__passfast__getSharePassMetadata"
    ],
    "ask": [
      "mcp__passfast__generatePass",
      "mcp__passfast__batchGeneratePasses",
      "mcp__passfast__updatePass",
      "mcp__passfast__updatePassBySerial",
      "mcp__passfast__downloadPassBySerial",
      "mcp__passfast__downloadPass",
      "mcp__passfast__createTemplate",
      "mcp__passfast__updateTemplate",
      "mcp__passfast__publishTemplate",
      "mcp__passfast__uploadImage",
      "mcp__passfast__uploadP12Certificate",
      "mcp__passfast__uploadCertificate",
      "mcp__passfast__uploadGoogleCredentials",
      "mcp__passfast__testGoogleConnection",
      "mcp__passfast__testAppleCertificates",
      "mcp__passfast__updateOrganization",
      "mcp__passfast__createApp",
      "mcp__passfast__updateApp",
      "mcp__passfast__testWebhook",
      "mcp__passfast__createApiKey",
      "mcp__passfast__createShareToken",
      "mcp__passfast__downloadSharedPass"
    ],
    "deny": [
      "mcp__passfast__voidPassBySerial",
      "mcp__passfast__voidPass",
      "mcp__passfast__deleteTemplate",
      "mcp__passfast__deleteImage",
      "mcp__passfast__deleteCertificate",
      "mcp__passfast__deactivateGoogleCredential",
      "mcp__passfast__deleteApp",
      "mcp__passfast__revokeApiKey",
      "mcp__passfast__deleteApiKey"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as passfast. Review it before you use it.