# List customiser prototypes (`list_customiser_prototypes`)

Lists the starting points a new customiser can be created from: each prototype stable id, its sign category, pricing model, sizing strategy, default styling mode, a one-line description of what it produces, and whether the connected Store plan makes it available. Creating a customiser takes one of these ids, so this is the discovery call that precedes it. The catalogue is complete and returned in one page. It requires the customisers:read scope and has no side effects.

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

## Purpose

Discover which kinds of sign product this Store can create a customiser for, and get the prototype id that creation takes.

## Annotations

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

## Prerequisites

- A merchant has connected this store and approved the customisers:read scope.

## Arguments

This tool takes no arguments.

## Result

The complete prototype catalogue in one page. It is a fixed server-owned list, so its size does not vary with the store.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `request_id` | string | yes |  |
| `store` | object | yes |  |
| `store.id` | integer | yes |  |
| `store.name` | string | yes |  |
| `prototypes` | array of object | yes | The complete prototype catalogue. |
| `prototypes[].id` | string | yes | The stable prototype id a creation call takes. |
| `prototypes[].name` | string | yes |  |
| `prototypes[].description` | string or null | no |  |
| `prototypes[].default_customiser_name` | string or null | no |  |
| `prototypes[].sign_category` | string or null | no | The kind of sign the prototype produces. Expected to grow: tolerate unknown values. |
| `prototypes[].pricing_model` | string | yes | One of: `simple_letter`, `advanced_letter`, `frame_fit`. |
| `prototypes[].sizing_strategy` | string or null | no |  |
| `prototypes[].selection_mode` | string or null | no |  |
| `prototypes[].ai_sign_designer` | boolean or null | no |  |
| `prototypes[].available` | boolean | yes | Whether this Store plan allows a customiser to be created from the prototype. |
| `prototypes[].unavailable_reasons` | array of string | yes | Why the prototype is unavailable, empty when it is available. |
| `pagination` | object | yes | Always reports no further pages: the catalogue is one complete collection. |
| `pagination.has_more` | boolean | yes |  |
| `pagination.next_cursor` | string or null | no |  |

## Error cases

| Code | Recovery |
| --- | --- |
| `insufficient_scope` | The connection was approved without customisers:read. |
| `unknown_parameter` | This route accepts no query parameters, so the tool takes no arguments. |

## Example: Read the prototype catalogue

Request:

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

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "structuredContent": {
      "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
      "store": {
        "id": 12,
        "name": "Demo Signs"
      },
      "prototypes": [
        {
          "id": "neon-frame-fit",
          "name": "Neon Letter Signs - Price per square metre/foot",
          "description": "Neon and Flex LED neon letter signs.",
          "default_customiser_name": "Neon Sign Customiser",
          "sign_category": "neon",
          "pricing_model": "frame_fit",
          "sizing_strategy": null,
          "selection_mode": "per_word",
          "ai_sign_designer": false,
          "available": true,
          "unavailable_reasons": []
        }
      ],
      "pagination": {
        "has_more": false,
        "next_cursor": null
      }
    }
  }
}
```

## Example: A connection without customisers:read (error)

Request:

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

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": true,
    "structuredContent": {
      "error": {
        "code": "insufficient_scope",
        "title": "Insufficient scope",
        "detail": "The tool [list_customiser_prototypes] requires the customisers:read scope, which this connection was not granted.",
        "recovery": "The connection was authorised without the scope this tool needs. Ask the merchant to reconnect the connector and approve the scope named in required_scopes. Do not retry this call.",
        "required_scopes": [
          "customisers:read"
        ],
        "granted_scopes": [
          "store:read"
        ]
      }
    }
  }
}
```
