# List webhook subscriptions (`list_webhook_subscriptions`)

Lists the connected Store webhook subscriptions with each one id, topic, destination URL and timestamps. Signing secrets are never included: a subscription secret is shown once, at creation, and cannot be read back. Results are paginated. It requires the webhooks:read scope and has no side effects.

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

## Purpose

See where a Store already sends events, and obtain the subscription ids the update and delete tools take.

## Annotations

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

## Prerequisites

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

## Arguments

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | integer | no | How many subscriptions 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` subscriptions plus the cursor for the next page. Never a signing secret.

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `request_id` | string | yes |  |
| `store` | object | yes |  |
| `store.id` | integer | yes |  |
| `store.name` | string | yes |  |
| `subscriptions` | array of object | yes | The page of subscriptions. Never a signing secret. |
| `subscriptions[].id` | integer | yes |  |
| `subscriptions[].topic` | string | yes |  |
| `subscriptions[].url` | string | yes |  |
| `subscriptions[].created_at` | string or null | no |  |
| `subscriptions[].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 webhooks:read. |
| `invalid_cursor` | The cursor was altered or reused; restart with no cursor. |

## Example: The store registered endpoints

Request:

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

Response:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "structuredContent": {
      "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
      "store": {
        "id": 12,
        "name": "Demo Signs"
      },
      "subscriptions": [
        {
          "id": 42,
          "topic": "product:created",
          "url": "https://example.com/webhooks/sign-customiser",
          "created_at": "2026-07-22T00:00:00Z",
          "updated_at": "2026-07-22T00:00:00Z"
        }
      ],
      "pagination": {
        "has_more": false,
        "next_cursor": null
      }
    }
  }
}
```

## Example: A connection holding only webhooks:write (error)

Request:

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

Response:

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