# PassFast MCP

> Remote HTTPS Model Context Protocol server for the full PassFast public API.
> Tools are 1:1 with OpenAPI `operationId`s. This is not a second API.

- Endpoint: https://passfa.st/mcp
- Alias: https://passfa.st/api/mcp
- HTML install: https://passfa.st/docs/mcp
- OpenAPI (only API surface): https://passfa.st/openapi.yaml
- API base (proxied): https://api.passfa.st/functions/v1
- Sign up (get keys): https://passfa.st/signup

Last updated: 2026-09-20

## Transport

Streamable HTTP (current MCP remote convention). POST JSON-RPC to `/mcp`.
The server is stateless — GET SSE sessions are not offered (405). Stdio-only
clients can use `npx mcp-remote https://passfa.st/mcp`.

## Authentication

Same as other remote MCPs: paste a **secret key** once in the client
config. Tools work immediately. **No OAuth**, no PassFast agent account,
no chat UI — the agent is the MCP client (Cursor / Claude / ChatGPT / Codex / Grok).

```
Authorization: Bearer sk_live_YOUR_SECRET_KEY
X-App-Id: YOUR_APP_ID
```

| Header | Required | Notes |
| --- | --- | --- |
| `Authorization` | Yes (except public share tools) | `Bearer sk_live_…` only. `pk_live_` is rejected. The server never logs or echoes the key. |
| `X-App-Id` | Multi-app orgs | Optional for single-app orgs. Per-call override: tool argument `x_app_id`. |

Do not put `sk_live_` keys in browsers or committed config.

## Cursor

`~/.cursor/mcp.json` or project `.cursor/mcp.json`:

```
{
  "mcpServers": {
    "passfast": {
      "url": "https://passfa.st/mcp",
      "headers": {
        "Authorization": "Bearer sk_live_YOUR_SECRET_KEY",
        "X-App-Id": "YOUR_APP_ID"
      }
    }
  }
}
```

## Claude

Streamable HTTP clients:

```
{
  "mcpServers": {
    "passfast": {
      "type": "http",
      "url": "https://passfa.st/mcp",
      "headers": {
        "Authorization": "Bearer sk_live_YOUR_SECRET_KEY",
        "X-App-Id": "YOUR_APP_ID"
      }
    }
  }
}
```

Stdio-only (Claude Desktop) via `mcp-remote`:

```
{
  "mcpServers": {
    "passfast": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://passfa.st/mcp",
        "--header",
        "Authorization: Bearer sk_live_YOUR_SECRET_KEY"
      ]
    }
  }
}
```

## ChatGPT

Custom GPT / connector: URL `https://passfa.st/mcp`, header
`Authorization: Bearer sk_live_YOUR_SECRET_KEY`. Same paste-once secret —
no OAuth.

## Tool groups (key-auth)

Tool names are exact OpenAPI `operationId`s. Do not invent endpoints.

### Passes

generatePass, listPasses, getPass, updatePass, downloadPass, voidPass,
getPassBySerial, updatePassBySerial, downloadPassBySerial, voidPassBySerial

### Templates

createTemplate, listTemplates, getTemplate, updateTemplate, deleteTemplate,
publishTemplate

### Images

uploadImage, listImages, deleteImage, getImageUsage

`uploadImage` takes `purpose` + `file_base64` (Base64 PNG). That maps to the
existing multipart `POST /manage-images` — not a new endpoint.

### Apple certificates

uploadP12Certificate, uploadCertificate, listCertificates, deleteCertificate,
testAppleCertificates

### Google credentials

uploadGoogleCredentials, listGoogleCredentials, deactivateGoogleCredential,
testGoogleConnection

### Organization / apps

getOrganization, updateOrganization, getApp, createApp, updateApp, deleteApp,
getManagedSigningStatus

### Webhooks

testWebhook, listWebhookEvents

### API keys

listApiKeys, createApiKey, revokeApiKey, deleteApiKey

### Share

createShareToken, getSharePassMetadata, downloadSharedPass

Public share tools do not require a key.

## Out of scope for v1 — members / invites (JWT)

These OpenAPI operations authenticate with a **Supabase user JWT**, not an
API key. Key-auth MCP v1 does **not** expose them. Use the dashboard Members
page or the HTTP API with a session JWT.

- listMembers
- inviteMember
- acceptInvitation
- updateMemberRole
- removeMember
- listInvitations
- revokeInvitation

They are omitted from `tools/list` on purpose and documented here so they are
not silently missing.

## Billing and rate limits

MCP does not add spend or a second rate limiter. `generatePass` and other
writes hit the live API:

- First 100 generates free once
- Then $0.015 per active pass / month (Apple+Google = 1)
- Expired passes bill until void or delete
- Card required after the free allowance (`402` / `free_limit_reached`)
- API `429` is returned as a tool error (including `Retry-After` when present)

## Typical agent flow

1. `listTemplates` — find a published template
2. `generatePass` — `wallet_type: "both"`
3. `getPass` / `downloadPass`
4. `createShareToken` — public link + QR

## Errors

Tool errors include the HTTP status and the API JSON body. Missing
`Authorization` on a keyed tool returns a clear message pointing at this page.

## Links

- HTML: https://passfa.st/docs/mcp
- Docs index: https://passfa.st/docs
- Docs markdown: https://passfa.st/docs.md
- API markdown: https://passfa.st/api.md
- OpenAPI: https://passfa.st/openapi.yaml
- AI index: https://passfa.st/llms.txt
