# List integration products (`list_integration_products`)

Lists the products the connected Store has synchronised into Sign Customiser from its selling platform, newest first, with each product id, the customiser it belongs to, its title, its price and comparison price in integer minor units, the Store currency and its image URL. A product title can contain customer-entered sign text. The route accepts no filters, so pagination is the only control. It requires the products:read scope and has no side effects.

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

## Purpose

See what customers have bought or configured, and obtain the product ids get_integration_product takes.

## Annotations

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

## Prerequisites

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

## Arguments

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | integer | no | How many products to return per page, between 1 and 100. Defaults to 20. |
| `cursor` | string | no | The opaque next_cursor value from the previous page. Omit it for the first page. |

## Result

Up to `limit` product rows, newest first, plus the cursor for the next page. Selections and dimensions are a separate per-product read.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `request_id` | string | yes |  |
| `store` | object | yes |  |
| `store.id` | integer | yes |  |
| `store.name` | string | yes |  |
| `products` | array of object | yes | The page of products, newest first. |
| `products[].id` | integer | yes |  |
| `products[].customiser_id` | integer or null | no |  |
| `products[].title` | string or null | no |  |
| `products[].price_amount` | integer or null | no | Integer minor units of currency. |
| `products[].compare_at_amount` | integer or null | no |  |
| `products[].currency` | string or null | no |  |
| `products[].image_url` | string or null | no |  |
| `products[].created_at` | string or null | no |  |
| `products[].updated_at` | string or null | no |  |
| `pagination` | object | yes |  |
| `pagination.has_more` | boolean | yes |  |
| `pagination.next_cursor` | string or null | no |  |

## Error cases

| Code | Recovery |
| --- | --- |
| `insufficient_scope` | The connection was approved without products:read. |
| `invalid_cursor` | The cursor was altered or reused; restart with no cursor. |

## Example: First page of synchronised products

Request:

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

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "structuredContent": {
      "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
      "store": {
        "id": 12,
        "name": "Demo Signs"
      },
      "products": [
        {
          "id": 731,
          "customiser_id": 42,
          "title": "Custom neon sign",
          "price_amount": 12900,
          "compare_at_amount": 14900,
          "currency": "AUD",
          "image_url": "https://cdn.example.com/products/731.png",
          "created_at": "2026-07-18T03:14:15Z",
          "updated_at": "2026-07-18T03:16:10Z"
        }
      ],
      "pagination": {
        "has_more": true,
        "next_cursor": "eyJpZCI6N30"
      }
    }
  }
}
```

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

Request:

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

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": true,
    "structuredContent": {
      "error": {
        "code": "insufficient_scope",
        "title": "Insufficient scope",
        "detail": "The tool [list_integration_products] requires the products: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": [
          "products:read"
        ],
        "granted_scopes": [
          "store:read"
        ]
      }
    }
  }
}
```
