publ betaReference (MCP guide)
Open publ console

design_menu_layout_get — read a device's menu layout

`selection_metadata_commit` pins the added candidate fields and registered selection guidance. The fbae capture retains its original description and is not a capture of the added metadata. [Migration map](../reference/tool-name-migration.md).

# design_menu_layout_get — read a device's menu layout

Read the current template and Primary/Secondary menu connections for one device, with available templates and menu candidates. Use [design_menu_layout_apply](publ_design_menu_layout_apply.md) to change those connections. This tool does not edit a menu's items, order, names, URLs, logo or login button.

## Input and prerequisites

| Field | Type | Required | Meaning |
| --- | --- | --- | --- |
| `channelCode` | string | Yes | Nonempty selected channel code. |
| `device` | enum string | Yes | `W` desktop web, `M` mobile web, or `A` Android/iOS app. No default. |

```json
{"channelCode":"selected-channel-code","device":"W"}
```

Replace the placeholder using the [directory workflow](../guides/channel-directory.md) or the bound hosted resource. Read each device separately; a desktop revision cannot be used for a mobile change.

The HTTP implementation requires a current connection, selected-channel credential, matching channel response, an OWNER/DELEGATEE account role and an OWNER/DELEGATEE selected-channel role for menu transport. The local role check does not replace server authorization. Hosted calls must use the bound channel. Menu layout uses the configured general API origin; it does not require the separate CHANNEL_ENV origin used by theme/custom-code operations.

## Inputs

| Field | Required here | Contract |
| --- | --- | --- |
| `device` | Yes | `W`, `M`, `A`; W = desktop web, M = mobile web, A = Android/iOS app. |

## Result and selection rules

A successful `MENU_DESIGN` result contains environment, channel, device, the fields below, and `verification:{confirmed:true,method:menu_design_read}`.

| Field | Meaning |
| --- | --- |
| `revision` | Lowercase SHA-256 revision of the current layout. Pass it unchanged to apply for this channel/device. |
| `layout` | Layout `id`, `menuTemplateType`, `primaryMenuId`, and `secondaryMenuId` (number or `null`). |
| `menus` | Recent candidate menu definitions, each with `id`, `channelId` and `title`. These are menu IDs, not menu-item IDs. |
| `templates` | Available recognized templates with `type`, `managementName`, `targetDeviceType`, `device` and `secondaryMenu` support, plus `displayName`, original Korean `consoleLabel`, `description` and `appearance`. |
| `selectionRules` | `currentSlotIdsMayBeRetained:true` and `outOfListIdsCannotMoveSlots:true`. |
| `menuSelectionLimit` | `50`. There is no pagination input on this tool. |
| `menuListMayBeTruncated` | `true` when at least 50 menu rows are returned. It is a limit signal, not an authoritative total. |

The menu query asks for the latest 50 by insertion time descending. A missing candidate does not prove the menu does not exist. An existing out-of-list Primary ID can remain in Primary, and an existing out-of-list Secondary ID can remain in Secondary. An out-of-list ID cannot move to the other slot or be newly selected. Use the returned current IDs to preserve connections during a template-only change.

The revision includes layout ID, channel ID, device, template type and both connection IDs. It excludes menu titles, menu-item structure, template names and the candidate lists. A matching revision does not prove those other values are unchanged or the three reads were an atomic snapshot.

## Template capabilities

The bridge intersects the service's device-specific candidates with this implementation's known capabilities. A type in this table is not selectable unless it is actually returned by get.

| Device | Recognized templates | Secondary support |
| --- | --- | --- |
| `W` | `W1_0001` through `W1_0011` | Supported by `W1_0003`, `W1_0005`, `W1_0008`, `W1_0010`, `W1_0011`; unsupported by the other six. |
| `M` | `M1_0001` through `M1_0005` | Supported by all five. |
| `A` | `A1_0001` | Unsupported. |

Unknown template types are omitted from the selectable template list. A current stored template can still be shown by `layout` even if it is no longer selectable. The result also supplies source-defined choice metadata. `appearance` contains `family`, `primaryMenuPresentation`, `primaryMenuAlignment`, `logoAlignment` and `widthPreset`. For centered desktop text with the console 1400px option, select a returned candidate with `primaryMenuAlignment:"center"` and `widthPreset:"1400px"` (currently `W1_0006`), and use `secondaryMenuId:null`. The full-width centered alternative has `widthPreset:"100%"`. Do not decode `managementName` or its `Fix` suffix. Null appearance values are unspecified or not applicable; they do not mean unlimited or zero. See [selection source and limits](../core/menu-layout-selection.md).

## Requests, failures and verification limits

After channel context is resolved, the adapter issues three GETs under `/seller/api/v1/channel-management/design-preferences`:

| Path suffix | Query |
| --- | --- |
| `/menus` | `sortBy:inserted_at`, `order:DESC`, `limit:50` |
| `/menu-templates` | `targetDeviceType` equal to the requested device |
| `/menu-design-layouts` | `targetDeviceType` equal to the requested device |

Requests use the selected-channel bearer and channel-ID header at the general API origin. They run concurrently and must return the expected envelopes with exactly one layout. The workflow checks the layout, nested menu references and listed menus against the selected channel, and templates/layout against the device. Duplicate menu IDs/template types are rejected. No layout is initialized, created or changed by get.

The wire adapter binds omitted `channelId` fields only on known menu/layout rows and nested menu references to the verified request channel. An explicit null, malformed or foreign ID is rejected with `MENU_CHANNEL_UNVERIFIED`; it is never replaced. Other missing/invalid fields and wrong layout counts fail with `MENU_RESPONSE_UNVERIFIED`, and mismatched device/context fails with `MENU_CONTEXT_MISMATCH`. The adapter checks connection and exact selected-channel token before and after transport. A changed binding returns `MENU_CONTEXT_CHANGED`; do not treat rejected data as an empty menu list.

Authentication, missing credentials, role denial, channel mismatch and upstream failures remain errors. A 404 is not an empty layout. See [common results](../reference/results.md) for wrapper/error conventions.

Readback confirms stored template/connections, not browser appearance, actual app rendering or visitor behavior. Non-demo successful results with a resolved target return one navigation destination and its identical legacy `consoleUrl` alias at the centrally configured `/channels/{encodedChannelCode}/design/menu-design-setting` console URL; the link does not carry a device selection or prove navigation succeeded.