# Retry AI sign design job exports (`retry_ai_sign_design_job_exports`)

Retry the failed EPS or Illustrator-compatible PDF conversions of a delivered AI sign design job. A retry is free: it uses no credit, does not change the charge, and does not run the AI sign designer again. Each job has a small number of free retries, reported as export_retries_remaining. Requires ai_sign_designs:write, supports dry_run, and requires an idempotency_key for an actual retry.

- Source URL: https://www.signcustomiser.com/help/mcp/tools/retry_ai_sign_design_job_exports/
- Markdown URL: https://www.signcustomiser.com/help/mcp/tools/retry_ai_sign_design_job_exports.md
- MCP endpoint: https://mcp.signcustomiser.com
- Required scope: `ai_sign_designs:write`
- Behaviour: write

## Purpose

Repair a failed manufacturing file of a delivered design without buying another design.

## Annotations

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

## Prerequisites

- A delivered job whose eps or illustrator_pdf file has state failed and error.retryable true, from get_ai_sign_design_job.
- A merchant has connected this store and approved the ai_sign_designs:write scope.

## Side effects

- Queues the conversion of each failed requested format again.
- Uses one free export retry of the job. Uses no credit.
- Claims the idempotency_key for at least 24 hours.

## Arguments

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `job_id` | string | yes | The id of a delivered job, from get_ai_sign_design_job. |
| `idempotency_key` | string | unless `dry_run` is true | A client-generated key unique to this logical write, such as a UUID. Required: repeating the call with the same key and the same arguments replays the original result instead of writing twice, and the same key with different arguments is an idempotency_key_conflict. |
| `dry_run` | boolean | no | When true, the retry is checked against the job and its retry budget is checked and nothing is written: the result is the same verdict the apply would have reached, and a problem the apply would have raised comes back as the same tool error. Defaults to false. A dry run claims no key. |

## Result

The job, with the retried files in processing. Read it again with get_ai_sign_design_job. A dry run returns the formats a retry would convert, the retries left and required_units 0.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `request_id` | string | yes |  |
| `store` | object | yes |  |
| `store.id` | integer | yes |  |
| `store.name` | string | yes |  |
| `job` | object | no | The job after the retry started. Absent on a dry run. |
| `job.id` | string | yes |  |
| `job.status` | string | yes | queued, processing, delivered (one credit charged) or failed (no credit charged). Expected to grow: tolerate unknown values. One of: `queued`, `processing`, `delivered`, `failed`. |
| `job.product_family` | string | yes | One of: `neon`, `channel_letter`, `metal_cut_out`. |
| `job.customiser_id` | integer or null | no |  |
| `job.letter_type_id` | integer or null | no |  |
| `job.source_file` | object | yes |  |
| `job.source_file.id` | string | yes |  |
| `job.source_file.media_type` | string or null | no |  |
| `job.source_file.byte_size` | integer or null | no |  |
| `job.source_file.width_px` | integer or null | no |  |
| `job.source_file.height_px` | integer or null | no |  |
| `job.source_file.download_url` | string or null | no |  |
| `job.output_formats` | array of string | yes |  |
| `job.poll_after_seconds` | integer or null | no | While the job runs, how long to wait before reading it again. Null once it is delivered or failed. |
| `job.result` | object or null | no | The delivered design, or null until delivery and for an erased design. Each ready file has a download_url that needs no login and can be given to a manufacturer. |
| `job.result.display_treatment` | string or null | no |  |
| `job.result.files` | object | no |  |
| `job.result.assessed_dimensions` | object or null | no |  |
| `job.result.advisories` | array of object | no |  |
| `job.result.export_retries_remaining` | integer | no |  |
| `job.charge` | object | yes | reserved while the credit is held, charged once the design is delivered, released when the design failed. |
| `job.charge.state` | string | yes | One of: `reserved`, `charged`, `released`. |
| `job.charge.units` | integer | yes |  |
| `job.error` | object or null | no |  |
| `job.error.code` | string | yes |  |
| `job.error.detail` | string | yes |  |
| `job.created_at` | string | yes |  |
| `job.completed_at` | string or null | no |  |
| `idempotent_replay` | boolean | no | True when this call replayed a previously recorded response for the same idempotency_key instead of applying the write again. |
| `dry_run` | boolean | no | Present and true only when dry_run was requested. |
| `valid` | boolean | no | Present only on a dry run, and always true: a failing dry run returns a tool error instead. |
| `verdict` | object | no | Present only on a dry run: the formats a retry would convert, the free retries left, and required_units, which is always 0. |
| `verdict.operation` | string | no |  |
| `verdict.output_formats` | array of string | no |  |
| `verdict.export_retries_remaining` | integer | no |  |
| `verdict.required_units` | integer | no |  |

## Error cases

| Code | Recovery |
| --- | --- |
| `ai_sign_design_erased` | The design was erased. Do not retry. |
| `ai_sign_design_export_not_retryable` | No requested conversion has failed, one still runs, or the design needs manufacturing review. |
| `ai_sign_design_export_retries_exhausted` | The free retries of the job are used. |
| `ai_sign_design_export_retry_limited` | The export was tried too often in a short period. Wait retry_after seconds. |
| `ai_sign_design_not_delivered` | The job has not delivered a design. Poll it first. |
| `insufficient_scope` | The connection was approved without ai_sign_designs:write. |
| `resource_not_found` | The id is unknown or belongs to another store. |

## Example: Retry a failed EPS conversion

Request:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "retry_ai_sign_design_job_exports",
    "arguments": {
      "job_id": "aijob_4k8m2p6r0t3v7x1z5b9d3f7h2j",
      "idempotency_key": "7d9f1b3c-5e7a-4c9e-8b1d-3f5a7c9e1b3d"
    }
  }
}
```

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "structuredContent": {
      "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
      "store": {
        "id": 12,
        "name": "Demo Signs"
      },
      "job": {
        "id": "aijob_4k8m2p6r0t3v7x1z5b9d3f7h2j",
        "status": "delivered",
        "product_family": "neon",
        "customiser_id": null,
        "letter_type_id": null,
        "source_file": {
          "id": "aisrc_9f2c4b7ad13e6058ba41cd4201",
          "media_type": "image/png",
          "byte_size": 482133,
          "width_px": 1600,
          "height_px": 900,
          "download_url": "https://web.signcustomiser.com/ai-design-files/src9x2k7c8f3m5n6p7q8r9s0tabcd"
        },
        "output_formats": [
          "svg",
          "eps",
          "illustrator_pdf"
        ],
        "poll_after_seconds": null,
        "result": {
          "display_treatment": "fill_and_bloom",
          "files": {
            "svg": {
              "state": "ready",
              "purpose": "design",
              "media_type": "image/svg+xml",
              "byte_size": 18432,
              "download_url": "https://web.signcustomiser.com/ai-design-files/svg9x2k7c8f3m5n6p7q8r9s0tabcd",
              "error": null
            },
            "eps": {
              "state": "processing",
              "purpose": "manufacturing_export",
              "media_type": "application/postscript",
              "byte_size": null,
              "download_url": null,
              "error": null
            },
            "illustrator_pdf": {
              "state": "ready",
              "purpose": "manufacturing_export",
              "media_type": "application/pdf",
              "byte_size": 18432,
              "download_url": "https://web.signcustomiser.com/ai-design-files/pdf9x2k7c8f3m5n6p7q8r9s0tabcd",
              "error": null
            },
            "raster_preview": {
              "state": "ready",
              "purpose": "preview",
              "media_type": "image/png",
              "byte_size": 18432,
              "download_url": "https://web.signcustomiser.com/ai-design-files/png9x2k7c8f3m5n6p7q8r9s0tabcd",
              "error": null
            },
            "face_svg": null
          },
          "assessed_dimensions": {
            "width_cm": 50,
            "width_in": 19.69,
            "height_cm": 25,
            "height_in": 9.84,
            "authored_units": {
              "width_cm": "centimetres",
              "height_cm": "centimetres"
            }
          },
          "advisories": [],
          "export_retries_remaining": 2
        },
        "charge": {
          "state": "charged",
          "units": 1
        },
        "error": null,
        "created_at": "2026-10-20T09:31:00Z",
        "completed_at": "2026-10-20T09:33:40Z"
      },
      "idempotent_replay": false
    }
  }
}
```

## Example: A job that has not delivered (error)

Request:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "retry_ai_sign_design_job_exports",
    "arguments": {
      "job_id": "aijob_4k8m2p6r0t3v7x1z5b9d3f7h2j",
      "dry_run": true
    }
  }
}
```

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": true,
    "structuredContent": {
      "error": {
        "code": "ai_sign_design_not_delivered",
        "title": "Design not delivered",
        "detail": "This job has not delivered a design, so it has no exports to retry. Poll the job until status is delivered. A failed design has no exports. Nothing was started.",
        "recovery": "The job has not delivered a design. Read it with get_ai_sign_design_job until status is delivered. A failed design has no files to export."
      }
    }
  }
}
```
