# Get customiser font archive (`get_customiser_font_archive`)

Returns a download link to one zip file that holds the TTF file of every font of one customiser, each named after its font, the same archive as the merchant admin Download all fonts. Fonts without an uploaded file are left out. The link needs no login and works until at least expires_at. A customiser with no font file is refused with no_font_files. Each connection can ask for the archive of one customiser 5 times in 5 minutes. It requires the customisers:read scope and changes no customiser data.

- Source URL: https://www.signcustomiser.com/help/mcp/tools/get_customiser_font_archive/
- Markdown URL: https://www.signcustomiser.com/help/mcp/tools/get_customiser_font_archive.md
- MCP endpoint: https://mcp.signcustomiser.com
- Required scope: `customisers:read`
- Behaviour: read

## Purpose

Give the merchant or a manufacturer every font file of a customiser in one download.

## Annotations

| Hint | Value |
| --- | --- |
| readOnlyHint | true |
| destructiveHint | false |
| idempotentHint | true |
| openWorldHint | false |

## Prerequisites

- A customiser id from list_customisers.
- A merchant has connected this store and approved the customisers:read scope.

## Arguments

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `customiser_id` | integer | yes | The customiser id, from list_customisers. |

## Result

The download link to the zip file and expires_at, the earliest time the link can stop working. Calls reuse one zip until a font is added, changed or deleted.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `request_id` | string | yes |  |
| `store` | object | yes |  |
| `store.id` | integer | yes |  |
| `store.name` | string | yes |  |
| `customiser_id` | integer | yes |  |
| `url` | string | yes | The download link to the zip file. It needs no login. |
| `expires_at` | string | yes | The link works until at least this time, ISO 8601 UTC. After it, call the tool again. |

## Error cases

| Code | Recovery |
| --- | --- |
| `font_archive_in_progress` | Another request is building the same zip. Wait retry_after seconds, then call again. |
| `insufficient_scope` | The connection was approved without customisers:read. |
| `no_font_files` | No font of the customiser has an uploaded TTF file. Attach a font file with attach_customiser_asset first. |
| `rate_limited` | The archive of this customiser was asked for 5 times in 5 minutes. Wait retry_after seconds. |
| `resource_not_found` | No customiser with that id belongs to this store. Call list_customisers to rediscover a valid id. |

## Example: Get the font archive

Request:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_customiser_font_archive",
    "arguments": {
      "customiser_id": 42
    }
  }
}
```

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "structuredContent": {
      "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
      "store": {
        "id": 12,
        "name": "Demo Signs"
      },
      "customiser_id": 42,
      "url": "https://cdn.example.com/fonts-download/customiser-42-Ab12Cd34Ef56Gh78-fonts.zip",
      "expires_at": "2026-11-15T09:00:00Z"
    }
  }
}
```

## Example: A customiser with no font file (error)

Request:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_customiser_font_archive",
    "arguments": {
      "customiser_id": 43
    }
  }
}
```

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": true,
    "structuredContent": {
      "error": {
        "code": "no_font_files",
        "title": "No font files",
        "detail": "This customiser has no font with an uploaded TTF file, so the archive would be empty. Attach a font file first.",
        "recovery": "Attach a TTF file to a font with attach_customiser_asset, then call the tool again."
      }
    }
  }
}
```
