- Brand
- Croisa
- Category
- Content & Design
- Primary Subcategory
- AI Website Builders
Integration details
Description
Create, edit, and host multilingual websites directly through chatting with ChatGPT. Ask ChatGPT to create your pages in your native language, and Croisa can translate them into the languages on your site, with localized URLs and language routing. A visitor who cannot read your site does not become a customer. If you run a restaurant, a salon, a contractor, or any local business where people speak more than one language, a menu, a price list, your hours, and your address in only your language sends everyone else to a competitor they can understand. The next change is the expensive part. A new dish, a new service, a holiday schedule, or a new price makes the other language wrong unless you rewrite it, hire a translator, or keep a second site. You write it once, in the language you already use with ChatGPT. Croisa can update your other site languages from that change. Most owners do not have a web person anymore. The site was built once and the login is gone, or there is no site at all, only photos and a phone number. You should not have to learn a builder or start a website project. Describe the business in the chat. Croisa creates the pages and hosts them. If you already have a site and it is stuck in one language, bring it to Croisa. Make it bilingual, put it on your own domain, and let people contact you in the language they actually read. When someone looks you up in their language, each language has its own URL, and they land on the one that matches them.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- AI Website Builders
- Secondary Subcategories
- None listed
- Brand
- Croisa
- Access
- Account required
- First tracked
- 2026-10-17
- Tool count
- 56
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for Croisa
Get updates when Croisa’s Discoverability Score or category rank changes.
Competing in ChatGPT AI Website Builders
View Category56 tools agents can invoke
Add one optional schema field to a generated CMS collection or singleton. parentPath is omitted for root fields, or uses schema paths like hero or faqItems[] for nested object/list-of-object fields. This v1 only adds optional fields; it does not remove fields, change types/localization, or make existing data required. After adding a field, patch entries/singletons and update any CustomSection template that should render it.
add_data_field
Render a public web page in a real browser and return screenshot evidence for visual reference. Use this before manually recreating or restyling a Croisa page from an external URL, or when you need to inspect layout before calling import_page_from_url. This is the closest automated equivalent of a user attaching desktop/mobile screenshots and saying "make my page like this". The tool returns MCP image content for the model to see, plus structured page metadata: final URL, httpStatus of the main document, title, dimensions, headings, visible text preview, semantic page blocks, links, and image URLs. When httpStatus is 4xx/5xx the result carries a warning because the screenshots show the site's error page, not the requested content. Use screenshots for layout/style and parsed text/assets for copy/structure. For a one-shot import into an existing target page, prefer import_page_from_url instead. For a Croisa-native rebuild, load or create the target page with page tools and apply the result with create_custom_section, edit_preview_page, and patch_custom_section_code as needed.
capture_page_reference
Complete one or more page deletions after the user confirms in the MCP widget. This tool is widget-only. Never call it directly, invent a confirmationToken, or use it to bypass the confirmation UI. The token is short-lived, bound to the authenticated user and exact page selection, and can be consumed only once.
confirm_page_deletion
Create one generated CMS collection entry. values is the semantic editable item object keyed by schema fieldKey names; do not send raw values/localizedValues. An entry has no URL, title, or meta description of its own; content meant to rank in search, such as a blog post or article, belongs on its own page via create_page. Localized string/richText leaves are stored for this locale and queued for translation, while URL/page:<pageId>, money, boolean, number, image, and video values stay shared. Entries created here start public; use hide_data_entry if they should wait for approval. For later edits, read get_data_entry and call patch_data_entry against the returned editableItem using JSON Patch paths like /name or /amenities/0/label.
create_data_entry
Create a new non-home page for an existing website. sourceSlug becomes that locale's public path /{slug} when available (nested paths like services/consulting are fine). sourceLocale is which language is created first—not a URL prefix; the platform does not auto-add /es/ or remove /en/. Other languages get their own slugs asynchronously (e.g. welcome → bienvenido); only the source locale URL is known immediately—if _translationPending is true, do not quote or edit other-locale URLs yet; use preview_website_page per locale later (or recheck altSlugs) once that locale exists. Tell users plain paths by default. Use locale segments in sourceSlug only if the user asks (e.g. en/blogs); patch other locales with edit_preview_page only after their slug is available—slug changes do not copy across locales. New pages use the shared sitewide layout with an empty body; in the source locale only, add sections with create_custom_section() and copy or SEO with edit_preview_page(). Do not create one page per locale. Create one page per blog post, article, or landing topic meant to rank in search: each page gets its own URL, title, and meta description, which a CMS collection list section cannot give its entries.
create_page
Generate a private visitor preview link for a private website. It supports normal visitor interactions, including forms, but does not grant editing or ownership. On a site with more than one language, the link opens in the visitor's browser language when a translated page exists, otherwise in the default language.
generate_private_preview_link
Use this tool when the user wants a new website built and hosted on Croisa. It creates the website with the requested languages and returns a minimal home page scaffold (Navbar + Theme) that is shown to the user in the preview widget, for further iteration with create_custom_section, create_page, and edit_preview_page. Pass every language the site needs in locales and author all content only in defaultLocale: when changes are published, the platform translates them into the other locales and creates localized page slugs, so do not write translation files, duplicate sections per language, or call this tool once per language. Do not use this tool to change an existing Croisa website (call list_websites instead) or to build websites hosted on other platforms.
create_website
Define a generated-ID CMS collection for public website data. First reason about existing generated models with list_data_models or resolve_data_model. Reuse a collection when it is the right source of truth for the user's requested data; create a distinct collection when the user needs separate schema, lifecycle, audience, source of truth, or content scope. Do not store blog posts, articles, or other content meant to rank in search as collection entries: entries get no URL, title, or meta description of their own, so create one page per post with create_page instead (see searchContentRule). If this tool reports similar existing collections, retry with createIntent="confirmed_new_distinct_model" and createReason only when the new collection is genuinely distinct. Collections can back public forms (backendActions write target), public page rendering (dataBindings read binding), manual/agent-authored entries, or any combination — inspect describe_data_model usage for existing formWrite and read bindings before creating another model. Public form scalar targets must be nonlocalized string/richText/url/number/boolean. For uploads, use a nonlocalized asset field for one stable {assetId} reference or list with items.type="asset" for multiple values. Every asset field requires normalized assetPolicy: kinds image/video/file/audio, optional allowedMimeTypes and maxBytes, and exposure private (default) or publicWhenEntryVisible. The collection policy is an upper bound that a form action cannot broaden. Asset exposure, collection entry visibility, and page dataBindings are separate controls. displayName/description and field label/helpText are stored as localized UI metadata. Field objects require fieldKey and type. Supported types: string, richText, number, boolean, url, money, asset, image, video, object, list. Existing image/video fields remain compatible with src/url objects and may also carry managed assetId references. Never store S3 bucket/key data or public rendition URLs as an authored collection value; those resolve from the asset record. localized=true is allowed only on string/richText. For object/list values, put localized=true only on nested string/richText leaves. Media fields cannot be localized; use localized sibling fields for alt/caption/title. Templates must use stable fieldKey/schema paths, never labels/helpText.
define_data_collection
Define a generated-ID CMS singleton for one-off public website data. First reason about existing generated models with list_data_models or resolve_data_model. Reuse a singleton when it is the right source of truth for the user's requested data; create a distinct singleton when the user needs separate schema, lifecycle, audience, source of truth, or content scope. If this tool reports similar existing singletons, retry with createIntent="confirmed_new_distinct_model" and createReason only when the new singleton is genuinely distinct. displayName/description and field label/helpText are stored as localized UI metadata for the provided locale, then flattened in tool/API responses. Field objects require fieldKey and type. fieldKey must start with a letter or underscore and use only letters, numbers, and underscores. Supported types: string, richText, number, boolean, url, money, image, video, object, list. Use string for normal text. Use richText when the content value itself needs limited formatting, inline links, or markup that must translate as one unit; richText is sanitized on read and should render with standard Handlebars triple braces only when HTML output is intended. Use url for href/link fields; values may be external URLs or internal Croisa page tokens like page:<pageId>. URL/page tokens are resolved on read and must not set localized=true; pair url fields with localized string/richText labels when link text changes by locale. Use money values as {amountMinor, currency}; image/video values as objects with src or url. localized=true means auto-translate and is allowed only on string/richText fields. For object/list values, define nested fields/items and put localized=true only on nested string/richText leaf fields. Media fields cannot be localized; use localized sibling fields for alt/caption/title. Templates must use stable fieldKey/schema paths, never labels/helpText.
define_data_singleton
Permanently delete a whole collection, for example when the owner says "delete the newsletter list": the collection itself, every entry with its form submission record and uploaded files (the same cleanup as delete_data_entry), its email alert rules and their delivery records. This cannot be undone. The first call deletes nothing and returns confirmation_required with a summary (entryCount, the alert rules, and the sections that use the collection); tell the owner what will be removed, and after they confirm call again with confirm=true. It refuses with collection_in_use while any published page or unpublished draft has a section that binds the collection or one of its entries, or a form that writes to it; remove those sections or forms first (edit_preview_page), publish the pages, then call again. Alert emails already delivered stay in their recipients' inboxes. A large collection may need more than one confirmed call: when the result has complete=false, call again with confirm=true to finish. Use hide_data_entry or delete_data_entry when the owner only wants some entries gone.
delete_data_collection
Permanently delete one collection entry, for example a customer record the owner wants erased (GDPR erasure). Unlike hide_data_entry this cannot be undone. It removes the entry, its order index, the form submission record that created it, the side-effect email events and deliveries about it, and the private uploaded files (and public copies) attached to it; alert emails already delivered stay in their recipients' inboxes, so tell the owner to delete those by hand. Ask the owner to confirm first, then call again with confirm=true. Unlike hide_data_entry, it does not block when CustomSections bind this entry directly; it deletes and returns a referenceWarning naming those bindings. A replay of the same form submission within 7 days is answered idempotently without re-creating the record. Use hide_data_entry instead when the owner only wants the item off the public site. A repeated call for an entry that is already gone returns success with alreadyDeleted=true; if a call fails part way, call it again to finish the cleanup. After deleting a person's data, don't repeat their details in later replies.
delete_data_entry
Use this tool to retrieve the full HTML/CSS/JS payload, dataBindings, and backendActions for a specific `CustomSection` on the current page. Pass the same `websiteId`, `pageId`, and `locale` you used with preview_website_page, and provide `componentId` as the section's `config.id` or as a positional address `sections/N` (page body), `layout/beforeChildren/N` (header) or `layout/afterChildren/N` (footer), where N is the section's index as listed by preview_website_page. If no CustomSection matches, the response lists the page's CustomSection inventory (componentId, location, index, description) and says when the page body has no sections, so retry with one of those ids instead of re-reading the page. After reviewing the payload, edit source with `patch_custom_section_code(...)` and edit description/dataBindings/backendActions with `edit_preview_page`. Form-backed sections expose backendActions and target.collectionId; read submitted rows with query_data_entries(collectionId, sort="newest"). formFieldIssues lists form inputs the action does not declare (their values are dropped), declared fields with no input, and textareas without a maxlength within the per-value limit; formMappingIssues lists mappings whose targetField is not a current field of the collection. The response includes per-field hashes; pass the relevant hash back as `expectedHash` so stale edits fail safely instead of overwriting newer changes.
describe_custom_component
Describe one generated CMS collection or singleton by dataId. Returns schema fields, template fields, allowed operations, counts, and CustomSection dataBinding references so agents can safely decide whether to edit values, add optional fields, reorder entries, or update templates. A collection also returns sideEffects (its email rules, in the shape set_data_side_effects takes), sideEffectsRevision (null before the first save), sideEffectsAvailable (the accepted on values and recipient kinds) and, when a rule has a problem such as being off (disabled), a missing field or a paused or bounced recipient, sideEffectIssues. formMappingIssues lists form mappings whose targetField is not a current field key (renamed, removed or missing; missing fails every submission). A collection also returns dataPageUrl and dataPageAccess. dataPageUrl is a view-only page of the entries in the owner's Croisa dashboard (dataPageAccess is view_only): give it to the owner for reading only; approving (show_data_entry), hiding, editing and deleting happen only through you, so never tell the owner to approve or edit there, and never write that into alert emails. References are published-only unless currentPageId and currentLocale are passed; with both, results also include actual draft references plus effective current-page references for the scoped editing surface.
describe_data_model
Use this tool to inspect the allowed configuration knobs for any schema-driven component (Hero, Navbar, Services, etc.). Call it silently before editing `/meta/pageSchema/.../config/variantConfig/*` so you know the valid enum strings, boolean switches, and numeric ranges the frontend accepts. Pass the `componentName` exactly as it appears in the `preview_website_page` response (the `/meta/pageSchema/sections[].component` string, e.g., `"Navbar"`). Likewise, use the variant literal from `/meta/pageSchema/sections[].config.variant` if you pass `variantName`. Schema-driven components are intentionally bounded: their configs are the only supported way to influence layout, spacing, typography, and micro-interactions. Many components inherit color/typography from the global business theme, while others expose local style/color controls. Treat the returned `fields` as the source of truth for what this variant supports. Use the component knobs (and alternate variants) to hit the user’s requested look first, but if the request clearly calls for brand-wide palette or font changes, adjust `/business/theme/...` via `describe_theme_presets()` instead of forcing ad-hoc styling. Always try to satisfy the user’s request via these knobs first—iterate with them, tweak fields, or even switch to another built-in variant if it better expresses their intent and is available. Only when you’ve exhausted the available variants/fields and the user still needs something fundamentally different should you offer to replace (or augment) the section with a `CustomSection`, which gives full HTML/CSS control. - When you already know the user wants to tweak the variant currently rendered in `pageSchema`, pass its exact `variantName` so you immediately get the knobs for that variant. - If the user hints at a bigger layout/style change (or you simply want to explore alternatives), omit `variantName` (or pass a different one) to inspect the other options surfaced in `availableVariants`. Use the returned list to decide whether to switch variants or stick with the current one and adjust its fields. Typical flow: 1. Identify the component type you need to adjust (e.g., componentName `"Navbar"` with variant `"DynamicNavbar"`). 2. Call `describe_static_component_presets(componentName, variantName)` to inspect that variant’s knobs, or omit `variantName` to browse the other variants listed in `availableVariants`. 3. Review the `fields` array to see each field's allowed values and whether it is required. 4. Apply the change via `edit_preview_page`, targeting `/meta/pageSchema/.../config/variantConfig/<field>`.
describe_static_component_presets
Use this tool for theme editing decisions. Use this silently before changing `/business/theme/...` to match user intent. When a user requests stylistic website changes (e.g., "make it more serious," "I want something playful," "warmer colors"), call this tool to review the palette and font options. Base your decision primarily on the `primaryHsl`, `secondaryHsl`, and `accentHsl` triplets—use hue to judge warmth/coolness, saturation for intensity, and lightness for how bright or moody the palette will feel. Treat the preset `name` as an identifier, not a style guarantee. Font pairings are returned as strings in the format `display_font_name-body_font_name` (e.g., `libre_baskerville-source_sans_3`); so you can align typography with the user's request based on your knowledge of the fonts available. You do not need to show the user this list or ask them to pick—just use your judgment to select the preset that fits their request, then apply it via `edit_preview_page` by replacing any/all of these as needed: - `/business/theme/colorPairingId`: Use a preset ID OR set to `"custom"` and provide `customPairing`. - `/business/theme/fontPairingId` - `/business/theme/borderStyle` - `/business/theme/customPairing`: Required if colorPairingId is "custom". Must be `{ "primaryHsl": "0 0% 0%", "secondaryHsl": "...", "accentHsl": "..." }`. The user will see the result in the live preview and can refine/publish from there with you in the conversation. Example workflow: - User: "I want my website to look more serious" - You: Call preview_website_page if not already called/in-context of current conversation to load the page draft and see the current theme - You: Call `describe_theme_presets()` → notice `cool-grays` has cooler, lower-saturation HSL values (`210 22% 49%`, `213 27% 35%`) and the `libre_baskerville-source_sans_3` pairing is a balanced serif/sans combo suitable for professional brands - You: Patch `/business/theme/colorPairingId` to "cool-grays" and `/business/theme/fontPairingId` to "libre_baskerville-source_sans_3" - User sees the preview and can request further tweaks if needed The user can also request specific colors in which case you can use them to patch `/business/theme/customPairing` as needed.
describe_theme_presets
Canonical source-edit tool for CustomSection `html`, `css`, and `js`. Call describe_custom_component(...) first to retrieve current source and hashes, then send one or more atomic edits. Hashes are per section: pages generated from the same template can still have different hashes, so never reuse an expectedHash from another page or section. componentId accepts the config.id or a positional address `sections/N`, `layout/beforeChildren/N` (header) or `layout/afterChildren/N` (footer); a miss returns the page's CustomSection inventory. sectionCopy is flat and exposed as {{copy.key}}. New user-facing text must use normal copy tokens with matching /page/copy values. Copy values may contain supported links and formatting; the platform automatically normalizes rich copy in HTML text nodes, so special brace syntax is not required. Attribute tokens remain escaped. Do not hardcode translatable labels in HTML, but write form option values (<option value> and radio or checkbox value) as fixed text in the site's default language so every language stores the same value; an HTML edit saves copy-token option values as that fixed text automatically, which also repairs a section flagged with option_value_differs_by_language. Legacy flat and triple-brace templates remain compatible. For JavaScript, send real line breaks and keep translatable UI text in HTML data attributes. Backend forms must use backendActions and croisa.submitAction rather than raw fetch calls. To wire a new form, add its copy values with edit_preview_page, then patch the source here to call croisa.submitAction("<actionId>", { form }) and show success only when result.ok is true (accepted while the section declares no backendActions), then declare backendActions.<actionId> with edit_preview_page; a declaration that no source uses yet is rejected. Normalized edits that are byte-identical to the current source return a no-op without creating a draft version or touched path. In a multi-field batch, only fields whose final hashes changed are persisted. VIDEO HTML: type is not a <video> attribute and will be removed. For one unverified source, usually omit type. Preserve accurate type attributes on nested <source> elements when intentionally distinguishing multiple fallback formats. A container MIME such as video/quicktime does not verify codec compatibility. Allowed operations inside each edit: - replace_once: Requires {"op": "replace_once", "find": "string to find", "replace": "new string"}. - insert_before: Requires {"op": "insert_before", "find": "anchor string", "replace": "new string to insert"}. - insert_after: Requires {"op": "insert_after", "find": "anchor string", "replace": "new string to insert"}. - delete_once: Requires {"op": "delete_once", "find": "string to remove"}. - replace_field: Requires {"op": "replace_field", "replace": "the entire new content for the field"}. CRITICAL: For replace_once, insert_before, insert_after, and replace_field, use the key `replace` for the new content. All operations except replace_field require a `find` key to locate the target string. Example edits payload: [ { "field": "html", "expectedHash": "...", "operations": [ { "op": "replace_once", "find": "<h1>Old Title</h1>", "replace": "<h1>New Title</h1>" } ] } ] If your HTML introduces new {{tokens}}, update /page/copy/<componentId>/... via edit_preview_page before retrying. Hardcoded external http(s) image/asset URLs are non-blockingly lint-checked after save; prefer exact media URLs returned by request_image_upload or process_image, or call inspect_resource() before embedding third-party links. Do not manually transform image URLs for optimization, resizing, format conversion, or CDN variants; the platform automatically optimizes and caches supported raster images on the fly at render time.
patch_custom_section_code
Use this tool to make edits to EXISTING content on a website page. Changes persist in draft state and are not live until published. After edits, call publish_preview_changes when the owner asked for a change and did not say draft, preview or 'not yet'; ask first only when the owner asked for a draft, or when publishing would remove or replace a live page or section. Publish your own changes. If the draft also holds changes you didn't make in this conversation, tell the owner what else would go live and ask first. The platform is based on a modular approach consisting of config controlled and custom (html,css,js) components. For new AI-built sections that need editable repeatable or singleton data, use generic data tools plus CustomSection dataBindings. For public forms that collect visitor input, persist to a collection via CustomSection backendActions (formSubmission) — inspect existing collections first with list_data_models or resolve_data_model; do not assume a new collection is needed. Keep the three exposure controls separate: startsPublic (legacy submissionPolicy) sets whether new entries start public, assetPolicy.exposure controls whether eligible bytes may receive a public rendition when an entry is public, and dataBindings independently control whether any page reads that collection. startsPublic never creates or chooses a page. USER CONTEXT: Assume a busy, non-technical user unless stated otherwise. You're the expert—apply sensible changes for vague requests, explain your reasoning, and iterate as needed. MANDATORY TECHNICAL GUIDELINES: - LOCALE COPY RULE: Author user-facing copy in the specified locale. Separate supported locales represent localized versions; do not combine languages within one locale unless the user explicitly requests bilingual or mixed-language copy. - LOCALE PROPAGATION RULE: Treat this as authoring in ONE working locale only. For normal content and structural edits (copy, SEO, sections, pageSchema, business data), edit only the current locale draft. Do NOT duplicate the same change across other locales as the platform handles localization/propagation after publish. Separate per-locale edits are only for explicit locale-specific overrides requested by the user, or for localizedUrlSlug edits which are always locale-scoped. - NEW CUSTOM SECTIONS: Use create_custom_section() to add new sections with HTML/CSS. - Internal page navigation links MUST use `page:<pageId>` href tokens (example: `page:page-1772128355479`). Do NOT hardcode locale/slug paths like `/services` or `/es/servicios`. - URL EXPLANATIONS: Each locale has its own slug; do not tell users the platform auto-adds /es/ or removes /en/. Prefer plain paths (/welcome, /bienvenido). Slug patches apply only to the current locale—use preview_website_page for another locale before quoting or editing its URL. - NESTED SLUGS: Slash-separated paths are supported (services/consulting stays nested). - Theme changes: call describe_theme_presets() FIRST, then patch /business/theme/* - Site favicon: patch `/business/faviconImage/src` with the uploaded image URL; use an empty string to clear it. This is sitewide, while `/meta/pageSchema/socialImage/src` is per-page. Changes stay in draft until publish_preview_changes. - Component configs: call describe_static_component_presets() BEFORE patching /meta/pageSchema/.../config/variantConfig/* - CustomSection edits: html/css/js source edits are blocked here; call describe_custom_component() first, then patch_custom_section_code() for source changes. edit_preview_page supports CustomSection description/dataBindings/backendActions edits plus structural move/remove/reorder operations. For dataBindings, use generated collection/singleton/entry IDs and data.alias... template paths; a collection binding takes optional sort "display" (default) or "newest" (use "newest" for form-fed lists such as reviews or messages, never a reverse in section JS). For backendActions, use kind="formSubmission", purpose for the business intent, required target={collectionId:"col_..."}, and startsPublic=false (default) or true for the starting exposure of new entries (legacy alias submissionPolicy="moderated" or "autoPublish"). Asset-backed fields use type asset/image/video/file/audio and an assetPolicy that cannot broaden the target collection asset policy; maxBytes cannot exceed 5 GiB. Uploads are private by default and collection values carry stable assetId references, never S3 keys. The declaration is the server-enforced contract; the section owns 100% of the form UX. Submit from the section JS with croisa.submitAction("<actionId>", { form }) (or { fields }), which uploads files first and then submits asset references. Render your own loading/success/error states from SECTION_COPY. Do NOT write a raw fetch. publish_preview_changes before live public submission works. Read stored submissions with query_data_entries(target.collectionId, sort="newest"), and use review_form_asset(websiteId, assetId) to inspect private uploads in chat. I18N RULE: Never hardcode dynamic text in JS; put translatable text in HTML data-* attrs with copy tokens, or read SECTION_COPY/SECTION_DATA/SECTION_RUNTIME in JS. - Section structure: Whole-section move/remove/reorder targets /meta/pageSchema/sections/{index} (page body), /meta/pageSchema/layout/beforeChildren/{index} (header), or /meta/pageSchema/layout/afterChildren/{index} (footer). This is separate from copy/config field edits. For reordering, prefer move (e.g. {"op":"move","from":"/meta/pageSchema/sections/0","path":"/meta/pageSchema/sections/1"}) over replace — it preserves the full section object, including CustomSection html/css/js, without re-fetching it. Nested field move/copy is rejected; duplicate sections with create_custom_section(), not copy ops. On pages with layoutSource="sitewide", set layoutEditScope before moving/removing header/footer sections or editing layout-owned /page/copy/* (navbar, footer, etc.). Section indexes shift, so identify a section by its sectionId rather than its index alone: before a remove, add {"op":"test","path":"/meta/pageSchema/sections/{index}/config/id","value":"<sectionId>"} (built-in sections have no id; test /component instead), then check the id, type and label of each entry in _removedSections before publishing. - Business address updates: `/business/formattedAddress` is a special validated path. Send it as a standalone single-operation patch only. Do NOT patch `/business/addressComponents`, `/business/lat`, `/business/lng`, `/business/location`, or `/business/googleMapsUrl` directly; those are managed by the validated address flow. Do NOT patch `/business/placeId` or `/business/googlePlaceId` directly either; those are internal read-only identifiers, not normal address-edit fields. - Immediate business fields: `/business/phone`, `/business/openingHours`, `/business/showHours`, and `/business/timeFormat` are applied immediately to live business metadata. Send those `/business/*` edits as a standalone request only, and do not expect `publish_preview_changes()` to apply them later from draft state. - Business phone updates: `/business/phone` must include an international country code (for example `+1 555 123 4567`). If the user gives a local-only phone number, ask for the country code before calling this tool. - GBP-linked clear confirmation: if clearing `/business/formattedAddress`, `/business/phone`, or `/business/openingHours` for a site linked to Google Business Profile, first tell the user this will save locally and attempt to clear the same value on Google too. Only retry with `confirmGbpClear=true` after the user confirms. - Hours edits (business.openingHours): • Schema: array of periods {open: {day: 0-6, time: "HHMM"}, close?: {day: 0-6, time: "HHMM"}}. • Closed day: omit periods for that day. Entirely closed: use []. • 24/7: single period with open day=0, time="0000" and no close. • Split/overnight: multiple periods allowed; use next-day close for overnight (e.g., open day=2 time="1600", close day=3 time="0100"). • Do not remove openingHours; use [] instead. Empty strings are invalid; times must be 4-digit HHMM. Response includes _draftStatus, _draftTouchedPaths, _draftCurrentVersion for state tracking. Layout ownership: Pages can use a sitewide layout (`pageSchema.layoutSource="sitewide"`) or a page-local layout (`"page"`). `layoutSource` is a strict contract: only `"sitewide"` and `"page"` are valid; values like `"website"` are invalid and will be rejected. When editing layout-owned paths on a sitewide page, set: - layoutEditScope='sitewide' to edit the shared sitewide layout - layoutEditScope='detach' to fork the current effective layout into this page first - layoutEditScope='auto' (default) rejects ambiguous layout edits
edit_preview_page
Find CustomSection dataBindings that reference generated CMS data. Use before hiding a directly bound entry or changing a model schema. For an entry, pass collectionId and entryId. For a model, pass dataId or collectionId/singletonId; a collection also returns sideEffectReferences (referenceType sideEffect), the side effects and the root fieldKeys their messages, conditions and recipients read. formMappingIssues lists form mappings whose targetField is not a current field key (renamed, removed or missing; missing fails every submission). References are published-only unless currentPageId and currentLocale are passed; with both, results also include actual draft references plus effective current-page references for the scoped editing surface.
find_data_references
Read one generated CMS collection entry. By default the entry is returned whether public or not, so non-public rows such as form submissions listed by query_data_entries can be read and then edited with patch_data_entry; check public (true = stored visibility "visible", false = "hidden") and pass includeHidden=false to treat non-public entries as not found. item is the locale-resolved render shape exposed to CustomSection templates and may include provenance {source, actionId, purpose, submittedLocale} for form-created rows; submittedLocale is the visitor's language, while item.locale is only the language the values are shown in. editableItem is the authoring shape for patch_data_entry: fieldKey values only, page links still stored as page:<pageId>, and no computed fields. missingOptionalFields lists optional dotted schema paths absent from editableItem; convert them to JSON Pointer paths before initializing with JSON Patch add operations, e.g. details.caption -> /details/caption.
get_data_entry
Read a generated CMS singleton. item is the locale-resolved render shape exposed to CustomSection templates, including resolved page links and computed display helpers such as money.formatted. editableItem is the authoring shape for patch_data_singleton: fieldKey values only, page links still stored as page:<pageId>, and no computed fields. missingOptionalFields lists optional dotted schema paths absent from editableItem; convert them to JSON Pointer paths before initializing with JSON Patch add operations, e.g. details.caption -> /details/caption. Use baseRevision with patch_data_singleton to avoid stale writes.
get_data_singleton
Make one collection entry not public (stored visibility hidden), so the public website no longer shows it; it stays readable and editable through the tools. Use for user requests like remove/take down/hide this card/team member/product. This is reversible with show_data_entry and does not delete content. If the entry is directly bound by a CustomSection, the tool blocks unless force=true and returns affected references. If this returns a baseRevision mismatch, call get_data_entry for the same entry and retry with the fresh baseRevision before reporting success.
hide_data_entry
Import a public web page from an external URL into an existing Croisa page. Captures the rendered DOM and CSS in a real browser, stores it as one imported CustomSection, replaces the target page body, and detaches the page from the shared sitewide layout so imported header/footer visuals do not affect other pages. Use for "mirror this URL onto this page" requests after choosing the target website, existing pageId, and locale. The result is a fidelity-first visual snapshot that can later be edited like any CustomSection; read structuredContent._considerations (and _detectedForms when present) for snapshot-specific follow-up discovered during import. For language-sensitive migrations, call capture_page_reference first when the user has not specified the target locale; if the source language is not enabled, use manage_languages before importing.
import_page_from_url
Inspect a public URL so the agent can understand an external resource. Use this before rebuilding, copying, comparing, or referencing external pages, images, PDFs, or text resources. The tool returns MCP content blocks for model-visible data, including image content when the URL is an image small enough to return directly. Images are shown to the model at most 1600 px on the long edge; structuredContent keeps the original width, height and byteLength, and modelImage describes the copy the model sees. Only JPEG, PNG, GIF and WebP are sent as image content; other raster types (AVIF, BMP, TIFF, ICO) are converted to PNG or JPEG, or left out with a warning when they cannot be decoded. An SVG comes back as its markup in text (vector markup, not a rendered image), with width, height and viewBox in structuredContent. structuredContent always carries httpStatus; an HTTP 4xx/5xx answer is an error with error_code "http_error". When the URL ends in an image extension but the server returned an HTML page or text, the result sets kindMismatch true with a warning: treat that link as broken or blocked, not as the image.
inspect_resource
Read the side-effect email delivery log, newest first: one row per email with the time it was triggered, the collection (dataId), side effect and entry that caused it, whether it was a test, the masked recipient, replyTo (the masked Reply-To address when the email had one, with replyToSource default when it is the customer's email used because the rule sets no replyTo, or null with replyToNote saying why a rule's Reply-To was left out, for example customer email missing), the message locale, and its status (queued, sending, sent, delivered, bounced, complained, failed, skipped or rate_limited) with a plain reason. A rule that is off, or whose when an entry does not meet, leaves one skipped row per entry with reason rule_disabled or when_not_matched. editorPreview true marks an entry the owner sent from the editor preview; its email subject starts with a preview-test prefix. Rows are kept for 30 days. Delivered means the recipient's mail server accepted the email, not that it reached the inbox, and statuses can take a few minutes to appear after sent.
list_side_effect_deliveries
List generated CMS collections and singletons for a website. Use this when deciding whether to reuse, edit, bind, or create data models. Results include human displayName/description next to generated IDs, visible/hidden entry counts, template fields, and CustomSection usage summaries so agents can reason about the right source of truth; unless includeCounts=false, each collection also has dataPageUrl and dataPageAccess. dataPageUrl is a view-only page of the entries in the owner's Croisa dashboard (dataPageAccess is view_only): give it to the owner for reading only; approving (show_data_entry), hiding, editing and deleting happen only through you, so never tell the owner to approve or edit there, and never write that into alert emails. Usage is published-only unless currentPageId and currentLocale are passed; with both, results also include actual draft references plus effective current-page references for the scoped editing surface. Call describe_data_model for full schema and reference details. Pass includeCounts=false for a fast schema-only listing without entry counts or usage summaries.
list_data_models
Use this tool to inspect draft history for undo/redo planning. By default (`scope='auto'`) it returns merged action history across the page, shared-layout, and website-settings streams. Pass `scope='page'`, `scope='sitewide'`, or `scope='website'` to inspect one raw history stream directly. This tool returns metadata only (not renderable page content), so bare error responses are acceptable.
list_draft_versions
Use this tool to list all pages for a website. Returns a flat, agent-friendly canonical page index with localized variants and preview args.
list_all_pages_for_website
Use this tool to access up to 100 websites owned by a user. This is the entry point to the platform tools as most operations require a websiteId to be selected first. Supports optional pagination: provide `limit` (<=100) and the `lastEvaluatedKey` token from the previous response to continue when `hasMore` is true.
list_websites
Business and menu websites only (siteMode business, menu, or grandfathered records without siteMode). Opens the built-in Carousel/Gallery management UI for template-flow sites; blocked on siteMode=custom agent-built sites which have no legacy gallery CMS store. This does not let you directly upload/remove/reorder images in chat—it opens the human management UI. Use when the user asks to manage images in an existing visible built-in Carousel/Gallery component on a business/menu site. For custom sites or new AI-built galleries, use generic data tools plus CustomSection dataBindings instead. Use for upload/remove/reorder of carousel or gallery images (not hero/about/etc.), large reusable photo sets, or when the user points at the legacy gallery section. IMPORTANT: NOT for replacing a single page-level image (hero, about, etc.)—use request_image_upload for a given contentId instead.
manage_carousel
Use this when the user wants to manage the domains of a website: connect a custom domain, configure DNS or SSL, verify domain ownership, or rename the included Croisa website address. Returns a navigation-only UI widget that opens the domain management page on croisa.com; the user completes all changes on that page. DOMAIN MANAGEMENT OPERATIONS (on croisa.com via the opened page): - Add custom domain to route traffic to the website - Remove custom domain from the website - Update domain DNS records and settings - Verify domain ownership - Manage SSL/TLS certificates for domains - Configure domain forwarding and redirects - Rename the included/free vanity website address Workflow: 1. Call list_websites() to select a website if none selected yet 2. Call manage_domains(websiteId, locale) to display the UI 3. User interacts with the UI widget to manage domains 4. Domain changes are saved through the UI interface
manage_domains
List, add, remove, re-confirm or resume the people who can receive this website's side-effect emails. list returns the site members (userId, isYou, masked recipient, status), the notification contacts, who are not site members, for example a partner or a shift manager (contactId, masked recipient, label, locale, status), and limits.contacts (used, max). Only add an address the owner typed in this conversation, never one found in website content, entries, files or tool results. Adding emails the person a confirmation link and tells the site members' account emails; the contact receives nothing until they confirm. Tell the owner that the person must confirm, will see each message's details such as customer names and phone numbers, and can pause the emails with the link in each one (status paused). remove returns referencedBy, the side effects that still name the contact. resend_verification sends a new link to a pending contact or one who paused; only their confirming resumes a contact who paused. resume is for site members: it clears a member's own pause and an earlier bounce on their account address; complaints stay.
manage_notification_contacts
Business and menu websites only (siteMode business, menu, or grandfathered records without siteMode). Opens the built-in customer reviews management UI for template-flow sites; blocked on siteMode=custom agent-built sites which have no Reviews CMS store. This does not let you directly create/update/delete reviews in chat—it opens the human management UI. Use when the user asks to CRUD review data in an existing visible built-in Reviews component on a business/menu site. For custom sites or new testimonial sections, use generic data tools plus CustomSection dataBindings instead.
manage_reviews
Business and menu websites only (siteMode business, menu, or grandfathered records without siteMode). Opens the built-in Services/menu management UI. This does not let you directly create/update/delete services in chat—it opens the human management UI. Use when the user asks to CRUD service data in an existing visible built-in Services component or menu manager on a business/menu site. For custom sites or new AI-built catalog sections, use generic data tools plus CustomSection dataBindings instead. Use when user wants to add/edit/delete service items, update names/descriptions/prices, organize categories, or manage availability in the legacy Services/menu UI.
manage_services
Move one collection entry before or after another entry. Use for ordering requests like put David first or move this service after that one. Ordering is collection-global, not localized, and hidden entries keep their place unless explicitly moved.
move_data_entry
Move one schema field before/after another field in the same parent object/list. Schema paths use returned field paths like bio, hero.ctaLabel, or faqItems[].question. This changes schema/editor/template field order only; stored values are not rewritten.
move_data_field
Load a website page into the user's live preview and return its current draft content. Use it to show the user a page (requests like "see", "open", "show" or "change language", even for a page you believe is already visible), to read a page whose current content you do not already have in this conversation (for example before your first edit to that page, so you know its sections, copy keys and patch paths), or to switch the user's preview to another page or locale. It creates a saved working draft if none exists; it does not publish the page. It is NOT required before every edit: edit_preview_page, create_custom_section, patch_custom_section_code, create_page, import_page_from_url, revert_preview_page_version, redo_preview_page_version and publish_preview_changes each create the draft if needed, mount the page in the user's preview and return the resulting draft state themselves, so after such a tool succeeds, keep working from its result instead of calling this tool again. Custom section source hashes come from describe_custom_component and draft version ids from list_draft_versions, not from this tool. It is idempotent, so calling it again is safe when the user asks to see or refresh a page. When a follow-up message says the user tapped a link inside the preview, call this tool with the arguments it names instead of answering with URLs; the user expects the page to appear inside the conversation. RELATED TOOLS: edit_preview_page() applies JSON Patch edits (see its docstring for what is editable vs what needs management tools); revert_preview_page_version() / redo_preview_page_version() / list_draft_versions() navigate ordered draft history (merged page + shared actions on sitewide pages); publish_preview_changes() pushes the draft to production and triggers translations. RETURNED DATA: - structuredContent: Page data organized by /page, /meta, /business - _draftStatus: 'clean' or 'dirty' - indicates if there are unpublished changes - _draftTouchedPaths: List of modified paths since last publish - _draftCurrentVersion, _draftCurrentVersionNumber, _draftLatestVersionNumber: Version tracking - fallbackFromLocale: Present when the requested locale had no page, so the copy shown is in another language; translationPending (true while that translation is still being built) or translationFailed, and fallbackNote, say why
preview_website_page
Use this tool to publish the current draft for a page to production. Typical workflow: 1. Call preview_website_page() to load or create the working draft 2. Apply one or more edit_preview_page() calls to modify copy, meta, or business data 3. Check that _draftStatus is 'dirty' (indicates unpublished changes) 4. Publish when the owner asked for a change to their site and did not say draft, preview or 'not yet'; owners who say add, change, rename or 'make it work' expect it live. Ask first only when the owner asked for a draft, or when publishing would remove or replace a live page or section. Publish your own changes. If the draft also holds changes you didn't make in this conversation, tell the owner what else would go live and ask first. Important notes for the model: - ALWAYS check _draftStatus before calling: should be 'dirty' (has unpublished changes). If 'clean', there's nothing to publish. - An existing live page can publish shared drafts even if it has no page draft yet; its clean page baseline is initialized from live content. - If _draftStatus is 'clean' and _draftTouchedPaths is empty, the tool will return a no-op response (nothing to publish). - Publishing marks the draft as clean, copies its data to the production items for the specified website/page/language, and triggers translation tasks for other locales if localized body/meta content changed. - If a localizedUrlSlug was claimed by another page/locale after the draft was edited, publish returns a slug conflict and leaves the draft dirty so you can choose a new slug and retry. - DEFAULT MULTILINGUAL RULE: For normal content and structure changes, author once in the active locale and publish once. Do NOT manually repeat the same edit/create flow across locales; the platform handles localization/propagation for you. - IMPORTANT: To protect SEO, publishing localizedUrlSlug changes NEVER automatically translates or propagates slugs to other locales. If a slug edit must be global, you MUST manually edit/publish the slug for each remaining locale. - For other content (copy, SEO meta, sections, page structure), do not manually repeat edit/publish per locale unless the user explicitly asks for locale-specific manual overrides; otherwise the platform handles this automatically. - The tool returns a success message plus metadata indicating whether translation follow-up is needed. Link to the published page when reporting success; primaryDomain is only the site's hostname, not a page-specific link. - _published says what went live: pageId, locale, the draft paths, and sitewide=true when business settings or the shared layout (every page and language) were published too. - When shareUrl is present, use it for a link that selects the visitor's browser language when a translation exists. To link to the exact published language, use the same URL without the croisa_lang=auto query parameter. These links show published content. - After publishing, additional edits require calling edit_preview_page again; the draft will start in a clean state. - Immediate business fields like `/business/phone`, `/business/openingHours`, `/business/showHours`, and `/business/timeFormat` are not published from draft state. They must already have been applied via the standalone immediate business edit flow. - Structured content includes `_draftStatus`, `_draftCurrentVersion`, and `_draftCurrentVersionNumber` to confirm the published state.
publish_preview_changes
Read locale-resolved entries from a generated CMS collection by generated collectionId. By default entries are returned whether public or not, so non-public rows such as form submissions created by CustomSection backendActions are included; every item carries public true/false (with the stored visibility "visible"/"hidden"), so check it before telling the user what is live, and pass includeHidden=false to list only public entries. Entries come in display order by default (the order menus, galleries and reorder_data_entries use), which is oldest first for form-created collections. For form submissions such as orders, bookings, enquiries and messages, pass sort="newest" so the most recently created entries come first, and add since=<ISO-8601 timestamp> to return only entries created after that moment (for example "any new orders since yesterday" or since the createdAt of the last order you already reported); use the default display order for content like menus, products, team members and galleries. Count new submissions from the returned items and count, and keep paging with cursor while it is non-null instead of guessing; with sort="newest" or since the response also reports skippedHiddenCount (rows left out because they are not public, only when includeHidden=false) and scanLimitReached (true when the call stopped at its read cap before the end), so an empty or short page with a non-null cursor does not mean there are no more entries. Form-created items include createdAt and provenance {source, actionId, purpose, submittedLocale, editorPreview} when present; submittedLocale is the visitor's language, while an item's locale is only the language its values are shown in, and editorPreview true marks a test the owner sent from the editor preview, not a customer. createdAt is UTC; report createdAtLocal to the owner (the same moment in timeZone, the business's local time zone). timeZoneSource says where timeZone came from: business (its address), account (the owner's sign-in zone, because the business has no address; it can be wrong, so ask for the business's city before relying on it) or utc. For "today" or other day ranges, use the business's local day from timeZone in the results, not the chat user's or browser's zone: for example since is that day's midnight in timeZone converted to UTC; then report createdAtLocal. dataPageUrl is a view-only page of the entries in the owner's Croisa dashboard (dataPageAccess is view_only): give it to the owner for reading only; approving (show_data_entry), hiding, editing and deleting happen only through you, so never tell the owner to approve or edit there, and never write that into alert emails. Do not patch /items/0/... from this paginated result; select a specific entryId, call get_data_entry, then patch_data_entry against editableItem.
query_data_entries
Use this tool to step forward to the next draft snapshot when the user requests a redo. The tool creates the draft from live content if none exists, so no prior preview_website_page() call is needed. Always call list_draft_versions() first to satisfy the prerequisite check and avoid a no-op. The default list call returns merged page, shared-layout, and website-settings action history. Without `versionId`, the tool advances the pointer by one. Provide `versionId` to jump to a specific newer snapshot (e.g., one listed in structuredContent). If the pointer is already at the latest version, report that there is nothing to redo. Structured content includes `_draftStatus`, `_draftTouchedPaths`, `_draftCurrentVersion`, `_draftCurrentVersionNumber`, and `_draftLatestVersionNumber` for planning follow-up actions.
redo_preview_page_version
Remove one schema field and purge stored values/localized values at that schema path. This is destructive. If the model is bound by CustomSections, or side effects of the collection read the field, the tool blocks unless force=true and returns the affected references and sideEffectIds so templates and side effects can be updated first or immediately after; a forced removal also returns the resulting sideEffectIssues. formMappings lists each form mapping of a root collection field and its result: a field that a published form fills cannot be removed, even with force, until that input and its mapping are removed from the section and published (value_dropped: the value would be silently lost; uploads_fail: submissions with a file would fail); a draft-only mapping does not block, so remove it before publishing.
remove_data_field
Use this to change the stored key. For the name the owner sees, change the label with update_data_model_metadata and the form copy with edit_preview_page. Rename one schema field and migrate stored values/localized values at the same schema path. Schema paths use returned field paths like bio, hero.ctaLabel, or faqItems[].question. Returned templateFieldsBefore/After and references tell you which CustomSection templates may need source edits. Side effects that read a renamed root field are rewritten to the new key and listed in sideEffectsUpdated; sideEffectsNotUpdated lists any that could not be rewritten, and for a nested field the side effects that read its root field, since only root fields are rewritten. Forms already published with the old key of a root collection field keep working, since the old key resolves to the new one; formMappings lists each form mapping of the field with its result, and formMappingGuidance says what to update. Only the key changes: labelNote names the label and wording that keep the old name, sideEffectTextMentions lists alert subjects and messages that spell out the field's label, and sideEffectsRevision is the collection's current revision for the next set_data_side_effects.
rename_data_field
Reorder collection entries by entryId. The provided orderedEntryIds are placed first in that order; omitted entries keep their prior relative order after them. Do not use paginated item indexes as identifiers.
reorder_data_entries
Use this tool when you need the user to upload media (image by default, optionally video). This tool mounts an ephemeral file-picker UI that only persists for the current turn - it disappears as soon as the user sends their next message, regardless of content. Two outcomes: 1) User uploads and URL(s) appear in their next message for you to use with edit_preview_page, OR 2) User responds with text instead (clarification, correction, or unrelated topic) and the file picker is gone. IMPORTANT: If the user's response indicates they still want to upload (e.g., they corrected which section/image they meant, asked a clarifying question about the upload, or simply haven't uploaded yet), you MUST call this tool again to re-mount the file picker - it does not persist across turns. Chat paperclip attachments also produce CDN URLs you can patch the same way. For membership card logos, pass the uploaded URL to set_membership_wallet_branding instead of edit_preview_page.
request_image_upload
Use this tool when the user explicitly wants to delete one or more whole pages. It does not remove individual sections or layout blocks; use edit_preview_page for section-level structural removal. Pass pageId for one page or pageIds for multiple pages. This tool is read-only: it inspects the pages, checks whether deletion is allowed, and returns one confirmation payload for the CMS UI or an MCP widget. It does NOT delete anything by itself. Actual deletion only happens after the user confirms in the UI. Never call this tool repeatedly to simulate a bulk delete. Args: websiteId: Website identifier that owns the page. pageId: The canonical page identifier to inspect when deleting one page. Omit this when using pageIds. locale: Preferred locale to use for the confirmation summary and fallback preview target. pageIds: Canonical page identifiers to inspect and delete together. Use this for two or more pages, with a maximum of 25.
request_page_deletion
Resolve existing generated CMS models for an intended purpose such as "products", "services", "team", "testimonials", "contact submissions", "newsletter signups", or "lead capture". Blog posts and articles meant to rank in search are pages made with create_page, not collection entries. Use this before define_data_collection/define_data_singleton or before binding data into CustomSections. Returns ranked candidates with generated IDs, human display names, entry counts, template fields, CustomSection usage, and match evidence. Usage is published-only unless currentPageId and currentLocale are passed; with both, results also include actual draft references plus effective current-page references for the scoped editing surface. Reuse candidates only when they are the right source of truth; create a distinct model when the user needs separate schema, lifecycle, audience, or content scope.
resolve_data_model
Privately inspect one managed asset referenced by a website form submission. Use query_data_entries or get_data_entry (both include non-public entries by default) to find assetId values, then call this to see an uploaded file in chat, for example before making its entry public with show_data_entry. Small supported images are returned as model-visible MCP image content. Every ready asset also receives a reviewUrl, a short https://www.croisa.com link that opens images, video, audio, and document downloads: anyone holding it can open the file until it expires (expiresInSeconds, default 300 seconds, at most 900, shorter values become 60). Give this link to the owner in this chat when they want to see the file; never put it on a page, in a public message, or send it to anyone else. Inspecting never publishes the asset or changes the entry. Uploaded files are signature-checked but are not malware/CDR scanned.
review_form_asset
Send a real test email of a saved side effect now, marked as a test, to its site member and confirmed contact recipients only. A test ignores when and enabled: wouldMatch (with failedCondition when false) tells whether the entry used meets when, and warnings flags a rule that is off. A real entry gives the most realistic test; values that read as fake (made-up names, example.com addresses, notes such as please ignore) do not show what the owner will receive. Mail providers can file alerts from a new sender in Junk or Spam, so a test missing from the inbox is often there, and marking it as not junk or adding its sender to contacts keeps later alerts in that inbox. Tests count toward the site's daily test limit; the result has each delivery with its masked recipient, locale and status, replyTo (the masked Reply-To address, with replyToSource default when the rule sets no replyTo and it is the customer's email from the form's one email input; or null with replyToNote saying why there is none, for example customer email missing, or a test entry that no form sent; absent when the rule sets no replyTo and the entry's form does not have exactly one email input, so replies to such alerts are not delivered), a summary, testsUsedToday and testsLimitPerDay (both count emails, one per recipient, not test runs). list_side_effect_deliveries shows later status changes.
send_test_side_effect
Create or replace the full semantic value object for a generated CMS singleton. values is keyed by schema fieldKey names; do not send raw values/localizedValues. Use this to initialize or intentionally replace the whole singleton. For normal edits, read get_data_singleton and call patch_data_singleton against editableItem with JSON Patch paths like /headline or /faqs/0/answer.
set_data_singleton
Use this tool when the user wants to invite someone else to edit, create content for, or collaborate on their website. This tool returns an interactive UI for creating a private, single-use invitation link for a trusted person. The recipient continues with their own email and becomes a co-owner with full editing access. The existing owner remains a co-owner, and accepting this invitation does not transfer website billing.
share_website_access
Make one collection entry public (stored visibility visible), so the public website can show it. Use when the user wants a non-public entry, such as a form submission that started not public, on the site or asks to bring back an item; query_data_entries includes non-public entries by default. Call review_form_asset for each managed assetId that the user wants to inspect first. Before making the entry public, managed assets whose current schema and upload policy explicitly allow publicWhenEntryVisible receive a public delivery rendition; private assets remain private and resolve as null in public data. Form-created entries sit last in display order, so a list bound with a limit may not show this one; to show it first, also call move_data_entry with beforeEntryId set to the current first entry.
show_data_entry
Croisa ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Croisa's ChatGPT Plugin 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 Croisa alternatives on ChatGPT?
As of 2026-11-02, Croisa competes with AgentBuild, Allo Christian, AVSBL Website Builder, B12 Website Generator, Beste, CR Servers AI Connect, Dazzly, Drivethrough and 30 more 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.