Laioutr
Laioutr is the agentic frontend management platform that combines Studio (visual editor), Frontend (performance layer), Orchestr (backend integrations), and Laioutr Cloud (hosting) into a single platform. Developers no longer need to manually maintain integrations, while marketing and content teams can independently design pages, launch campaigns, and manage content via a unified interface - without requiring an engineering ticket for every adjustment.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- AI Website Builders
- Secondary Subcategories
- None listed
- Brand
- Laioutr
- Access
- Account required
- First tracked
- 2026-07-22
- Tool count
- 23
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is visible.
ChatGPT Plugin Discoverability Score
ChatGPT organic discovery is not live yet
Laioutr is tracked in the ChatGPT Plugin registry. Public organic-discovery measurement is not live for ChatGPT yet, so there is no score to publish today.
Get notified when your score goes live
Enter your work email and we’ll notify you when ChatGPT Plugin organic discovery scoring launches.
No spam. Unsubscribe any time.
Competing in ChatGPT AI Website Builders
View CategoryHow the Discoverability Score works
Organic discovery scoring for Laioutr on ChatGPT is not live yet. The score will use measured agent conversations when it launches.
Organic discovery scoring is pending. Your Plugin score will appear on this scale when measurement goes live.
FoundDiagnostic
Whether Claude found your Plugin in connector search. It must be Found before it can reach the picker, but the score counts picker appearances—not search results.
PickedMain score
How often your Plugin appeared in the picker, or Claude invoked it directly, across contested conversations. This percentage is the Discoverability Score; the headline number is rounded.
PositionedDiagnostic
What position your Plugin appeared in when it was shown in the picker. This shows prominence, but it does not affect the score.
23 tools agents can invoke
Append a new item to an array-typed prop on a section or block, addressed by the same `at` + `keyPath` shape as a `studio_set_static_props` write item (here `keyPath` points at the ARRAY field). The new item is seeded with the component schema defaults and its generated id is returned — fill the item afterward with `studio_set_static_props`. **When to use:** Use to add a slide, card, row, or any repeated entry to an array prop. Discover the entity id with `studio_get_page_tree`, the array field name with `studio_get_component_schemas`, and existing item ids via `studio_get_section`. After adding, set the new item's fields with `studio_set_static_props`, using a write item's `keyPath: [["<arrayField>", "<arrayItemId>"], "<field>"]`. **When NOT to use:** Don't use to set a value on an item that already exists — use `studio_set_static_props`. Don't use to add a block to a slot — use `studio_add_block`. Global sections are read-only via this server. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","at":{"sectionId":"b8h2k4m6p0r3t5v7c9d1"},"keyPath":["features"]}` **Response:** `{ arrayItemId, catalogVersion, warnings }` — `arrayItemId` is the new item's stored key; pass it back as `keyPath: [["<arrayField>", arrayItemId], "<field>"]` in a `studio_set_static_props` write item. `catalogVersion` is the component-catalog fingerprint at write time. `INVALID_INPUT` means the `keyPath` did not resolve to an array field. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_add_array_item
Add a block to a slot of an existing section (local or global). The slot must exist on the section's component and the block component must be allowed in that slot — verify both with `studio_get_component_schemas` for the owner section. **When to use:** Use to fill out a section — drop product cards into a hero, add feature tiles into a grid, append a button into a CTA slot. Discover the owner `sectionId` (or `globalSectionId`) and slot names via `studio_get_page_tree` / `studio_get_section`. **When NOT to use:** Don't use to add a whole new section — use `studio_add_section`. Don't use to change props on a block that already exists — use `studio_set_static_props`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","owner":{"sectionId":"b8h2k4m6p0r3t5v7c9d1"},"slot":"items","componentName":"BlockFeatureTile"}` **Response:** `{ blockId, catalogVersion, warnings }` — `blockId` is what subsequent prop tools target; `catalogVersion` is the component-catalog fingerprint at write time. Catalog-related errors carry `detail.catalogVersion` + `detail.refresh.tool` — when either signal changes, re-list with `studio_list_components`. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_add_block
Place an EXISTING global section onto a page-variant container (header/body/footer) as a reference — not a copy. Discover available `globalSectionId` values with `studio_list_global_sections`. This does NOT create a global section; it only references one that already exists. **When to use:** Use to reuse a site-wide header, footer, or any shared section on a page variant. Discovery chain: `studio_list_global_sections` (list) → `studio_add_global_section_reference` (place) → `studio_get_section` with the `globalSectionId` (read its blocks) → `studio_add_block` / `studio_set_static_props` (edit them). **When NOT to use:** Don't use to add a local (page-specific) section — use `studio_add_section`. Don't use to create or edit the global section container itself (creating, detaching, or setting its own props is not exposed) — ask the human to do that in Studio. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","globalSectionId":"d4f6h8k0m2p4r6t8v0x2","at":{"pageVariantId":"a1b2c3d4e5f6g7h8j9k0","location":"header"}}` **Response:** `{ sectionReferenceId, catalogVersion, warnings }` — `sectionReferenceId` is the placement node on the variant (distinct from `globalSectionId`, the global it points at); `catalogVersion` is the component-catalog fingerprint at write time. `CAPABILITY_UNSUPPORTED` means the connected frontend-core lacks `globalSectionReferences` (check `studio_get_capabilities`). Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_add_global_section_reference
Add a new section to a page variant container (header/body/footer) at a chosen position. Look up the `componentName` with `studio_list_components` and its prop shape with `studio_get_component_schemas` before passing `props`. **When to use:** Use to compose or extend a page — add a hero, add a feature grid, drop a CTA. Pre-configure props when the values are known; otherwise add empty and follow up with `studio_set_static_props`. **When NOT to use:** Don't use to add a block inside an existing section — use `studio_add_block`. Don't use to change props on an existing section — use `studio_set_static_props`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","pageVariantId":"a1b2c3d4e5f6g7h8j9k0","location":"body","componentName":"SectionHero"}` **Response:** `{ sectionId, catalogVersion, warnings }` — `sectionId` is what subsequent block/prop tools target; `catalogVersion` is the component-catalog fingerprint at write time. Catalog-related errors carry `detail.catalogVersion` + `detail.refresh.tool` — when either signal changes, re-list with `studio_list_components`. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_add_section
Permanently remove a block from its section slot. Destructive — confirm with the human before issuing on a non-trivial block. **When to use:** Use when explicitly asked to remove a block (cleaning up a section, retiring a feature tile). Discover the `blockId` with `studio_get_page_tree`. **When NOT to use:** Don't use to clear props — use `studio_set_static_props` with a `null` write value. Don't use to hide a block — use `studio_update_block` with a visibility decorator. There is no host-side undo; recovery is via manual snapshots taken before significant edits. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","blockId":"c3e5g7j9l1n3p5r7t9v1"}` **Response:** `{ blockId, catalogVersion, warnings }` — `catalogVersion` is the component-catalog fingerprint at write time. Catalog-related errors carry `detail.catalogVersion` + `detail.refresh.tool`; re-list with `studio_list_components` when either changes. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_delete_block
Permanently remove a section (and every block inside it) from a page variant. Destructive — confirm with the human before issuing on a non-trivial section. **When to use:** Use when explicitly asked to remove a section (rebuilding a page, retiring a feature). Discover the `sectionId` with `studio_get_page_tree` first. **When NOT to use:** Don't use to clear props — use `studio_set_static_props` with a `null` write value. Don't use to hide a section — use `studio_update_section` with a visibility decorator. There is no host-side undo; recovery is via manual snapshots taken before significant edits. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","sectionId":"b8h2k4m6p0r3t5v7c9d1"}` **Response:** `{ sectionId, catalogVersion, warnings }` — `catalogVersion` is the component-catalog fingerprint at write time. Catalog-related errors carry `detail.catalogVersion` + `detail.refresh.tool`; re-list with `studio_list_components` when either changes. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_delete_section
Report whether the project's frontend is reachable and which version-gated frontend-core capabilities it supports. **When to use:** Read before a version-sensitive edit (e.g. global-section references). `frontendReachable: false` is also the pre-flight signal that the component catalog, schemas, style tokens, and all mutations are unavailable right now. **When NOT to use:** Don't use to discover components or props — use `studio_list_components` / `studio_get_component_schemas`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g"}` **Response:** `{ projectId, frontendCoreVersion, frontendReachable, capabilities, thresholds, note? }` — under 1 KB. DEGRADES instead of erroring: when the frontend is down it returns `frontendReachable: false` with an all-false capability set (no `FRONTEND_UNREACHABLE`). Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_get_capabilities
Return the full Studio-shaped usage detail for one or more components in a single call — per component: its prop fields (each tagged `translatable: boolean`), its `ai` usage guidance (purpose, constraints, hints, relationships, supports) when set, and, for a section, its slots with the block names each slot accepts; for a block, the sections it's designed to live in (`belongsIn`). **When to use:** Use to construct valid `props` for `studio_add_section` / `studio_add_block`, pick a `keyPath` for `studio_set_static_props`, check which blocks a slot allows, or read a component's usage guidance. Pass every component you are about to work with in one call (e.g. a section and the blocks that go in its slots) rather than one call per name. Discover the `componentNames` via `studio_list_components` first. **When NOT to use:** Don't use to enumerate components — use `studio_list_components`; pass only the specific names you need, never the whole catalog. The value shapes for complex fields (link/color/media/json) live in the `studio_get_data_model` tool, not here. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","componentNames":["SectionHero","BlockFeatureTile"]}` **Response:** `{ projectId, catalogVersion, schemas: Array<{ componentName, kind, studioLabel, ai?, schema, slots?, belongsIn? }>, notFound: string[] }` — one `schemas` entry per resolved component (`slots` is section-only, `belongsIn` is block-only); `projectId`/`catalogVersion` are hoisted to the root. `notFound` lists requested names absent from the catalog at `catalogVersion` — a typo or catalog drift; re-list with `studio_list_components` and retry them. Duplicate names resolve once. Roughly (name count × 5-25 KB). Requires a reachable frontend; returns `FRONTEND_UNREACHABLE` when the project frontend is down. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_get_component_schemas
Return the Studio data-model primer (markdown): page-types vs pages vs page-variants, sections vs blocks, slots, global sections, static vs translatable props, the complex-prop value shapes (link/color/media/json), and a worked example. Static and project-independent. Delivered as a tool so it loads reliably on every host, including those that can't read MCP resources autonomously. **When to use:** Call this FIRST, once per session, before listing or editing anything — it is the domain context every other tool assumes. Re-read its "Complex prop subtypes" section before writing a link / color / media / json prop with `studio_set_static_props`. **When NOT to use:** Don't use to discover a project's installed components or their schemas — use `studio_list_components` / `studio_get_component_schemas`. This is generic Studio documentation, not project data. **Example call:** `{}` **Response:** `{ markdown }` — the primer as a single markdown string (~24 KB / ~6k tokens). Static; cache it for the session and do not refetch.
studio_get_data_model
Return one page variant's section/block tree — IDs, component names, slot membership. Excludes props by default; pass `includeProps: true` to inline each LOCAL section's full payload in the same call (see below). **When to use:** Use to find a `sectionId` or `blockId` to mutate. Call after `studio_list_pages` to look up `pageVariantId`. To read the props of MANY sections on a page, prefer `includeProps: true` here over a `studio_get_section` per section — one call instead of N. Use a bare `studio_get_section` only for a SINGLE section or a global-section reference. **When NOT to use:** Don't use to enumerate pages — use `studio_list_pages`. Don't set `includeProps` when you only need structure (it can add hundreds of KB). Global-section references are never inlined — read one via `studio_get_section` with its `globalSectionId`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","pageVariantId":"a1b2c3d4e5f6g7h8j9k0","includeProps":true}` **Response:** `{ pageVariantId, pageId, pageType, path, variantLabel, seo, sections, queryCount }`. Structure-only is usually 5-10 KB. `seo` is the variant's `{ title, description, robots? }` where `title`/`description` are the raw `{ <locale>: value }` maps (empty `{}` when unset) — edit them via `studio_update_page_variant`. `queryCount` is the number of queries defined on this page variant (no per-query payload via this server yet). With `includeProps: true`, every LOCAL `sections[<loc>][]` entry additionally carries `payload` — the exact object `studio_get_section` returns for that id (props + its blocks) — growing the response to roughly (section count × 5-25 KB); global-reference entries are unchanged. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_get_page_tree
Read one prop value off a section or block, addressed by the same `at` + `keyPath` shape as a `studio_set_static_props` write item. Returns just the addressed value — the targeted read-before-write counterpart of `studio_get_section` (which returns the whole 5–25 KB section payload). **When to use:** Use to read the current value of a prop before overwriting it with `studio_set_static_props`. Discover the entity id via `studio_get_page_tree`. For a translatable field `value` is the `{ <lang>: value }` map — edit the entries you want and write them back through a `studio_set_static_props` write item's `values` field (a write item's single `value` field writes one value, optionally fanned across `locales`, and does NOT accept the map). For a complex primitive (link/color/media/json) `value` is the subtype-tagged object, which a `studio_set_static_props` write item's `value` accepts directly — see the "Complex prop subtypes" section of the `studio_get_data_model` tool for each shape. `value: null` means there is no stored value at `keyPath` — covering BOTH a never-set prop AND an unknown field/path (this read is storage-direct and schema-unaware, so it cannot tell the two apart; validate field names with `studio_get_component_schemas`). A field that exists but is empty returns its stored value (e.g. `""` for a freshly-created text field), NOT `null`. And `null` means "not set in storage", not "renders nothing" — an unset field still renders its field type fallback, so do not infer the rendered value from `null`. **When NOT to use:** Don't use to read a section's whole prop set — use `studio_get_section`. Don't use to enumerate structure — use `studio_get_page_tree`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","at":{"blockId":"c3e5g7j9l1n3p5r7t9v1"},"keyPath":["cta","label"]}` **Response:** `{ value }` — the prop value at `keyPath` (primitive, subtype-tagged complex object, or `{ <lang>: value }` for a translatable field), or `null` when nothing is stored at `keyPath` — which covers a never-set prop AND an unknown field/path (this read is schema-unaware); a field that exists but is empty returns its stored value (e.g. `""`), not `null`. Typically well under 1 KB. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_get_prop
Return one section's full payload — component name, studio metadata, visibility, props, slots. Resolves either a local section (on a page variant) or a global section by id. **When to use:** Use to read the current value of a prop before deciding how to mutate it with `studio_set_static_props`, or to inspect a complex-primitive prop shape before overwriting it. Discover the `sectionId` via `studio_get_page_tree` first. **When NOT to use:** Don't use to enumerate sections — use `studio_get_page_tree`. Don't use to fetch a component's schema — use `studio_get_component_schemas`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","sectionId":"b8h2k4m6p0r3t5v7c9d1"}` **Response:** `{ sectionId, componentName, studioLabel?, scope: "local"|"global", payload, …plus pageVariantId+location when scope==="local" }` — 5-25 KB depending on props. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_get_section
Return the project's color palette (flattened to a single list) and icon catalog — `{ themeId, colors, icons }`. **When to use:** Use before setting a `color` prop (use a palette entry's `id` as `token` and its `value` as the hex) or an `icon` prop (use an icon `name`). Read the field's type from `studio_get_component_schemas` to know which applies. **When NOT to use:** Don't use to discover components — use `studio_list_components`. There is no media-library discovery; a `media` prop needs a source URL you already have. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g"}` **Response:** `{ themeId, colors: Array<{ id, label?, value, hint?, group? }>, icons: Array<{ name, label? }> }` — a few KB. Requires a reachable frontend; returns `FRONTEND_UNREACHABLE` when the project frontend is down. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_get_style_tokens
List the section and block components installed in this project — a thin `{ name, kind, label, description?, purpose?, tags? }` per entry (`purpose` is the agent-facing one-liner). Pass `kind` to list only sections or only blocks. **When to use:** Use to discover valid `componentName` values before `studio_add_section` / `studio_add_block`. Component names are arbitrary per-project strings (customers install different apps) — never guess them, read them here — then fetch one component's full usage detail (prop fields, slots, `ai` usage fields, `belongsIn`) with `studio_get_component_schemas`. **When NOT to use:** Don't use to read a component's prop fields, slots, or usage guidance — use `studio_get_component_schemas`. Don't use to list reusable global sections — use `studio_list_global_sections`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g"}` **Response:** `{ projectId, catalogVersion, components: Array<{ name, kind: "section"|"block", label, description?, purpose?, tags? }> }` — a few KB. `catalogVersion` is the catalog fingerprint (also surfaced in mutation error `detail.catalogVersion`) — re-list when it changes. Requires a reachable frontend; returns `FRONTEND_UNREACHABLE` when the project frontend is down. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_list_components
List the project's reusable global sections — `{ globalSectionId, componentName, studioLabel?, usageCount }` per entry, ids only, no block contents. **When to use:** Use to discover which global sections exist before placing one with `studio_add_global_section_reference`, then read a global's blocks via `studio_get_section` with its `globalSectionId`. Served straight from Storage — works even when the frontend is unreachable. **When NOT to use:** Don't use to read a global section's blocks — use `studio_get_section`. Don't use to list a project's installed component types — use `studio_list_components`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g"}` **Response:** `{ projectId, globalSections: Array<{ globalSectionId, componentName, studioLabel?, usageCount }> }` — ~1–2 KB. `usageCount` is how many page-variant references point at the global. An empty project returns `globalSections: []`, never an error. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_list_global_sections
List every page in the project with id, type, path, and each variant's `{ id, label }` — no section tree, no props. **When to use:** Use first to inventory pages and grab the `pageVariantId` you need to pass to `studio_get_page_tree` and any page-targeted mutation. **When NOT to use:** Don't use to read a page's structure — use `studio_get_page_tree`. Don't use to read a single section's props — use `studio_get_section`. Page and variant creation are not supported via this server — ask the human to create the page in Studio, then add sections/blocks to it with `studio_add_section`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g"}` **Response:** `{ projectId, pageCount, pages: PageSummary[] }` where `PageSummary = { id, type, path, variantCount, variants: { id, label }[] }` — usually under 2 KB. Each `PageSummary.type` is a stable token defined by the customer's frontend (typical values: `home`, `category`, `product`, `static`). Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_list_pages
List every Laioutr project the signed-in user has access to, across all organizations. Each row carries `mcpEnabled` — when `false`, project-scoped tools will reject calls with `MCP_NOT_ENABLED`. **When to use:** Use first, to find a `projectId` for any other tool. Cheap; no pagination. Re-call only if the human mentions a project that is not in the previous response. **When NOT to use:** Don't use to read a specific project's structure — once you have a `projectId`, switch to `studio_list_pages` / `studio_get_page_tree`. Don't use to enumerate organizations — this tool returns the org context per project already. **Example call:** `{}` **Response:** `{ projectCount, projects: Array<{ id, name, slug, organizationId, organizationName, organizationSlug, mcpEnabled, locales: Array<{ code, name, fallbacks }> }> }` — `locales` are the project's configured languages (the allowed values for `studio_set_static_props.writes[].locales`). Usually well under 5 KB.
project_list
Relocate a block to a LOCAL section's slot, or reorder it within its current slot — preserving the block id and all its props (unlike delete + re-add, which loses both). The destination block component must be allowed in the target slot — verify with `studio_get_component_schemas` for the target section. **When to use:** Use to reposition an existing block: move a CTA into a different section, or change a block's order within a slot (same `to.sectionId` + `to.slot`, different `to.atIndex`). Discover the `blockId` and target `sectionId`/slot with `studio_get_page_tree` / `studio_get_section`. **When NOT to use:** Don't use to add a new block — use `studio_add_block`. Don't use to move a SECTION — use `studio_move_section`. Targets are LOCAL sections only: global sections are read-only via this server, so neither the target nor a block currently INSIDE a global section is accepted (moving one out is rejected with `INVALID_INPUT`). NOTE: a block nested below a global-section *reference* on a page is detected as global only when it resides in the global's own storage; the source guard is best-effort. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","blockId":"c3e5g7j9l1n3p5r7t9v1","to":{"sectionId":"b8h2k4m6p0r3t5v7c9d1","slot":"items"}}` **Response:** `{ blockId, catalogVersion, warnings }` — `blockId` is the moved block (id unchanged). `catalogVersion` is the component-catalog fingerprint at write time. `SLOT_NOT_FOUND` (carries `detail.availableSlots`) means the target slot name does not exist on the section component; `BLOCK_NOT_ALLOWED_IN_SLOT` (carries `detail.catalogVersion` + `detail.refresh.tool`) means the slot exists but the block is not permitted in it. `QUERY_SCOPE_VIOLATION` means the move would orphan or import a query across the global/page boundary. `BLOCK_NOT_FOUND` / `SECTION_NOT_FOUND` mean the source block or target section id did not resolve. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_move_block
Reorder a section within its container, or relocate it between containers (header/body/footer) and between page variants — preserving the section (and, for a global-section reference, its link to the global). Works for a LOCAL section OR a global-section reference placed on a page. **When to use:** Use to reposition an existing section: reorder it in its container (same variant + `location`, new `to.atIndex`), move it from body to header/footer, or move it onto another page variant (`to.pageVariantId`). Moving a global-section *reference* around a page is allowed — it edits the PAGE, not the global. Discover the `sectionId` and target variant/container with `studio_get_page_tree` / `studio_list_pages`. **When NOT to use:** Don't use to add a new section — use `studio_add_section`. Don't use to move a BLOCK — use `studio_move_block`. A query-bound (dynamic) LOCAL section cannot be moved to a different page variant (`QUERY_SCOPE_VIOLATION`): its page-scoped query would be orphaned. Reorders and same-page relocations are always fine; references move freely across pages. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","sectionId":"b8h2k4m6p0r3t5v7c9d1","to":{"location":"header","atIndex":0}}` **Response:** `{ sectionId, catalogVersion, warnings }` — `sectionId` is the moved section (id unchanged). `catalogVersion` is the component-catalog fingerprint at write time. `QUERY_SCOPE_VIOLATION` means a cross-page move would orphan the section's page query. `SECTION_NOT_FOUND` / `PAGE_VARIANT_NOT_FOUND` mean the source section or target variant id did not resolve. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_move_section
Write 1–50 static prop values on sections or blocks (local or inside a global section) in ONE atomic mutation. Each item in `writes` is a self-contained write: `at` + `keyPath` address the prop, and exactly one of `value` (one value, optionally fanned to several `locales`) or `values` (a per-locale map writing DIFFERENT text per locale) carries the payload. Mixed targets are fine — different sections/blocks, across page variants, in one call. The global section container itself cannot be targeted — only blocks within it, via their `blockId`. For complex primitives (link/color/media/json) build the subtype-tagged object documented in the "Complex prop subtypes" section of the `studio_get_data_model` tool, and read the current shape via `studio_get_prop` / `studio_get_section` before overwriting. **When to use:** Use to fill in copy, images, links, colors — any static values on existing entities. BATCH related edits: conceptually "set the props of this page" is ONE call, not one call per prop. Discover entity ids with `studio_get_page_tree`, inspect current props via `studio_get_section`, and read each field's `translatable` flag with `studio_get_component_schemas`: when `true`, pass the SAME value to several locales via `value` + `locales`, or DIFFERENT text per locale via the `values` map (which `studio_get_prop` returns ready to edit); when `false` `locales`/`values` are optional. `values` merges (only listed locales change; a `null` entry clears just that locale). Duplicate targets in one batch apply in order, last one wins. **When NOT to use:** Don't use to write a value bound to a query result — not yet available via this server (ask the human to wire it up in Studio). Don't use to rename or hide an entity — use `studio_update_section` / `studio_update_block`. Cap is 50 writes per call; split larger jobs across calls. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","writes":[{"at":{"blockId":"c3e5g7j9l1n3p5r7t9v1"},"keyPath":["cta","label"],"value":"Shop now","locales":["en","de"]},{"at":{"sectionId":"b8h2k4m6p0r3t5v7c9d1"},"keyPath":["heading"],"values":{"en":"Sale","de":"Angebot"}}]}` **Response:** `{ results, catalogVersion, warnings }` — `results` is index-aligned with `writes`, each `{ writtenLocales, warnings }`; `catalogVersion` is the component-catalog fingerprint at write time (once per batch); `warnings` is snapshot-level. On failure the whole batch is rejected atomically: the message is prefixed `writes[<i>]:` and `detail.itemIndex` (0-based) names the bad item. Catalog-drift errors (`COMPONENT_NOT_FOUND` / `BLOCK_NOT_ALLOWED_IN_SLOT`) carry `detail.catalogVersion` + `detail.refresh.tool`; locale errors (`MISSING_LOCALES` / `INVALID_LOCALES`) carry `detail.allowed` (the project locales). Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_set_static_props
Update a block's studio metadata (label), visibility decorator, or rules. Pass only the top-level keys (`studio`, `visibility`, `rules`) you want to touch — omitted keys are preserved. `visibility` and `rules` are absolute-state: each provided object replaces the stored one in full. `studio` is shallow-merged: the studio keys you provide overwrite their stored values, other studio keys are preserved. **When to use:** Use to rename a block in the layer tree, change its visibility condition, or update its rules. Discover the `blockId` with `studio_get_page_tree`. **When NOT to use:** Don't use to change component props — use `studio_set_static_props`. Don't use to remove the block — use `studio_delete_block`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","blockId":"c3e5g7j9l1n3p5r7t9v1","data":{"studio":{"label":"Primary CTA"}}}` **Response:** `{ blockId, catalogVersion, warnings }` — `catalogVersion` is the component-catalog fingerprint at write time. Catalog-related errors carry `detail.catalogVersion` + `detail.refresh.tool`; re-list with `studio_list_components` when either changes. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_update_block
Update a page variant's SEO metadata (`title`, `description`) and/or its Studio layer-tree `label`. SEO fields are localized via the same `value` / `values` / `locales` contract as a `studio_set_static_props` write item (always translatable), and merge per-locale — writing `en` never clobbers an existing `de`. Pass the fields under `data`; omitted keys are preserved. This edits PAGE-level metadata; it does not touch section/block props. **When to use:** Use to set or rewrite a page's SEO title/description, or to rename a variant in the layer tree. Read the current values first from `studio_get_page_tree` (its `seo` block returns the `{ <locale>: value }` maps ready to edit). SEO is stored PER VARIANT — on a localized site, update each locale's variant (or pass every locale via `values`). **When NOT to use:** Don't use to edit a section or block's component props — use `studio_set_static_props`. Page and variant creation are not supported — ask the human to create them in Studio. Setting `robots` is not yet exposed. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","pageVariantId":"a1b2c3d4e5f6g7h8j9k0","data":{"seo":{"title":{"value":"Best Running Shoes","locales":["en"]},"description":{"values":{"en":"Shop our range.","de":"Entdecke unser Sortiment."}}}}}` **Response:** `{ pageVariantId, writtenLocales, catalogVersion, warnings }` — `writtenLocales` is `{ title?: string[]; description?: string[] }`, the locales written per SEO field touched (absent for a label-only change). `PAGE_VARIANT_NOT_FOUND` means the id did not resolve; `INVALID_LOCALES` / `MISSING_LOCALES` carry `detail.allowed` (the project locales); `INVALID_INPUT` means `data` had no actionable key or a field set both `value` and `values`. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_update_page_variant
Update a section's studio metadata (label) or visibility decorator. Pass the fields under `data` — `data.studio` (label) and/or `data.visibility` — that you want to touch; omitted keys are preserved. `visibility` is absolute-state: the provided object replaces the stored one in full. `studio` is shallow-merged: the studio keys you provide overwrite their stored values, other studio keys are preserved. **When to use:** Use to rename a section in the layer tree or change its visibility conditions. Read the current value with `studio_get_section` first so the overwrite is informed. **When NOT to use:** Don't use to change the section's component props — use `studio_set_static_props`. Don't use to remove a section — use `studio_delete_section`. **Example call:** `{"projectId":"9m4e2mr0ui3e8a215n4g","sectionId":"b8h2k4m6p0r3t5v7c9d1","data":{"studio":{"label":"Above-the-fold hero"}}}` **Response:** `{ sectionId, catalogVersion, warnings }` — `catalogVersion` is the component-catalog fingerprint at write time. Catalog-related errors carry `detail.catalogVersion` + `detail.refresh.tool`; re-list with `studio_list_components` when either changes. Scoped to `projectId`. IDs (sectionId, blockId, pageVariantId, …) from one project are not valid in another.
studio_update_section
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Laioutr alternatives on ChatGPT?
As of 2026-08-14, Laioutr competes with B12 Website Generator, Dazzly, Grapes Studio, Insta Website Builder, Instant Website, Instant Website, Jimdo, Pixelesq, VIXNODE, Web on Demand Website Builder, WebsitePublisher, Wix in ChatGPT AI Website Builders, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.