publ betaReference (MCP guide)
Open publ console

channels_list — read the account's channel directory

[Migration map](../reference/tool-name-migration.md).

# channels_list — read the account's channel directory

Read one page of channels belonging to the connected account. Use the returned `channelCode` to select a target and its `revision` when preparing an archive change. This is an account data read; `screens_list` instead searches static workflow inventory.

Current response compatibility follows the [source channel-code fallback](../reference/README.md#current-channel-directory-alias-compatibility), including explicit null legacy fields. It does not change inputs, normalized revisions or task recovery.

## Input

| Field | Type | Required | Default and constraints |
| --- | --- | --- | --- |
| `page` | integer | No | `1`; from 1 through 9,007,199,254,740,991. |
| `limit` | integer | No | `15`; from 1 through 100. |
| `markChannelAs` | enum string | No | `RUNNING`; choose `RUNNING` or `NO_INTEREST`. |
| `installedPAppCodes` | string array | No | At most 50 distinct feature codes, each matching `^[A-Za-z0-9_]+$`. Omitted or empty means no feature filter. |

The object is strict: it accepts no title search, sort, account ID, or channel selector. `null` is invalid.

```json
{"page":1,"limit":15,"markChannelAs":"RUNNING"}
```

Use only feature codes established by the relevant source/options. The response lists channels, not all installed features on each channel.

## Inputs

| Field | Required here | Contract |
| --- | --- | --- |
| `page` | No | integer; maximum 10000; greater than 0; default `1` |
| `limit` | No | `15` or `30` or `50` or `100`; default `15` |
| `markChannelAs` | No | `RUNNING`, `NO_INTEREST`; default `RUNNING`; RUNNING lists channels in use, NO_INTEREST archived channels. |

## Result

A verified page returns `status:success`, `code:CHANNEL_DIRECTORY`, `taskType:channel-directory`, and the following fields through the [common MCP wrapper](../reference/results.md):

| Field | Meaning |
| --- | --- |
| `channels` | Current page of normalized channel rows; see below. |
| `pagination` | `page`, `limit`, and filtered `total`. |
| `nextPage` | The next page number, or `null` when this filtered list has no later page. |
| `filters` | Applied `markChannelAs` and `installedPAppCodes` (an empty array when omitted). |
| `environment` | Adapter environment label. |
| `verification` | `confirmed:true`, `method:account_channel_list`, `channelAuthenticationVerified:false`. |
| `consoleUrl` | Exact supported list selection, or an explicitly broader parent list in non-demo results; see below. |
| `nextStep`, `note` | Target selection and credential limitations. |

Each channel has `id`, `channelCode`, `title`, `baseCurrency` (`KRW` or `USD`), `currentPlan`, `markChannelAs`, `status`, `isDeactivated`, `credentialPresent`, and `revision`. Legacy `primitiveInvitationCode` is normalized into `channelCode` if the latter is absent or empty. The legacy field is not returned separately.

`RUNNING` and `NO_INTEREST` describe directory classification. A channel can appear without that credential.

The 64-character revision hashes the normalized directory fields excluding `credentialPresent`. Copy it without recomputing it. A separate credential change does not change this directory revision.

## Pagination and verification

Follow `nextPage` with the same limit and filters. The expected page size is `min(limit, max(0, total - (page - 1) * limit))`. Wrong pagination, a wrong archive classification, duplicate IDs/codes, or an unexpected short/empty/oversized page produces `CHANNEL_DIRECTORY_UNVERIFIED`. A genuine zero total or page beyond the total can return an empty list successfully.

Pages from separate calls are not an atomic account snapshot. Do not report an incomplete or unverified page as proof that a channel is absent. The archive workflow performs its own full-directory reads and revision checks.

## Access, effects, and failures

The HTTP adapter uses the account bearer for `GET /seller/api/v2/channels`, with page, limit, classification, and optional comma-separated feature codes. It does not require a channel token for each row. It performs no directory write, credential refresh, shared current-channel switch, analytics event, or job creation. `channel-directory` classifies this read result and is **not** an accepted recovery task type.

Authentication, credential permissions/environment, connection locking, HTTP failures, and malformed data can stop the read. Follow the actual failure and repair the relevant connection before reading again; `AUTH_REQUIRED` is a human-action result. Do not collect credentials in conversation.

In hosted mode this tool belongs to an account resource. The subsequent [channel context read](publ_channel_context_get.md) requires a separately authorized selected-channel resource; the list result's generic `nextStep` does not grant that access. Consult [scoped discovery](publ_screens_list.md#hosted-resource-scope) on the actual connection.

Implementation: `src/channel-directory.ts`, `src/publ-http.ts::readChannelDirectory`, and registration in `src/server.ts`.

## Exact channel-list destination

The response's `selection` preserves the normalized API request; `filters` and
`pagination` keep their existing meanings. `consoleView` contains `exactMatch`,
`page`, `limit`, `markChannelAs` and `omitted`. It describes the browser destination,
not a replacement for the API selection.

The original AllChannels screen accepts page sizes 15, 30, 50 and 100 and reads
`page`, `limit` and `markChannelAs`. Without installed-feature filters, the single
URL preserves that exact selection, using the central console origin. If the API
request uses another valid size or nonempty `installedPAppCodes`, the URL opens
the same archive classification at page 1 with 15 rows. `consoleView.exactMatch`
is false, `omitted` identifies `installedPAppCodes` where applicable and
`pagination`, and navigation labels this as a broader parent list. The API result
still contains the originally requested page/filter. The bridge never fabricates
an unsupported UI filter query or claims that this broader list is the same result.

An empty out-of-range API page retains the existing successful-read contract and its requested page when representable; it is not evidence the account is empty.