The Frontic Tools MCP server connects AI coding assistants directly to your Frontic projects, letting you build storefronts and configure your Frontic API from your IDE. Pair it with the Frontic Docs MCP server so the agent can also answer “how does X work?” questions without leaving the editor.
Connect your favorite AI coding assistants directly to your Frontic Commerce projects through secure OAuth authentication. Build a frontend AND the corresponding Frontic API - all from your coding agent or IDE of choice.
Claude Code
Full project management and content creation workflows
Claude Desktop
Interactive Frontic operations from your desktop
Cursor
Integrated development experience with AI assistance
The MCP server provides tools across these categories:
Project & Resource Discovery
Browse projects, list each resource kind, inspect storage records, and preview Fetch API responses
Blocks, Listings, Pages & Trees
Create and manage blocks, listings, pages, and menu trees that define your API
Storage Management
Create Data Storages, then add, rename, and remove top-level fields
Project Configuration
Explore domains, scopes, regions, and locales
Browse Data
Search storage records and raw feed records
Integrations
Inspect connected integrations and their feed schemas before mapping
Data Syncs & Value Composer
Create data syncs, configure field mappings, and preview composer operations
Context Documents
Manage skills, rules, guides, and other context documents
Shopware Insights
Read the promotions and sales channels of a connected Shopware store
Swap cursor for claude, windsurf, vscode, or codex. The CLI prompts whether to install Frontic Tools, Frontic Docs, or both - the recommended default is both. See the Frontic CLI reference for full options.If you’d rather edit the config yourself, drop this entry into your client’s MCP config file:
The first time you connect, you’ll be prompted to authenticate via OAuth. The token carries your Frontic account’s permissions - whatever role you have on a project, the MCP can do on that project, and nothing more.
Most tools are a step in a chain, and the chain is what gets work done. These four cover
almost everything people build through the MCP server.
Build a backend from zero
list_projects to find the project, then create_storage for the Data Storage
and update_storage to add its fields. Wrap it in a Detail Block
with create_block, expose a collection with create_listing, and route it with
create_page. Finish with preview_fetch_response to see exactly what the frontend
will receive.
Map a feed into a storage
list_integrations to find the connected system, then get_integration_feed for the
flat field list in dot-path notation. Shape the storage to match, then create_data_sync -
which creates the sync shell only. Call get_data_sync for the field tree, map the
fields with update_data_sync_value_configs, and dry-run the result with
preview_composer_record before anything is persisted. Verify with search_storage_records
once the sync has run.
Build a navigation menu
list_storages for the source data and list_blocks to find an item block worth
reusing - multiple Menu Trees can share one. create_tree
builds the hierarchy, update_tree narrows it with query conditions.
Debug what the frontend receives
preview_fetch_response for the served payload, search_storage_records for the
stored values behind it - filtered by scope, region, and locale to see contextualized
output. When you need a storage’s real keys and slugs rather than a search,
list_storage_record_examples returns up to five records with their system fields.
Every tool declares whether it only reads, as an MCP annotation. Clients that act on those
annotations can run the reading tools without stopping to ask and keep prompting for the
rest; for clients that want it spelled out, the allow-list below does the same thing
explicitly.
May do
Tools
Reads only
every get_*, list_*, search_*, and preview_* tool
Writes
every create_* tool, and the update_* tools that change configuration
Destroys data
delete_resource, update_storage
The preview_* tools count as reads because all three are dry-runs - they show you the
transformed value or the API response without persisting anything.update_storage sits with delete_resource because its field operations include deleting a
field, and deleting a field takes the stored values with it. Adding and renaming fields is
safe; removing one is not reversible.
Auto-approve the read-only tools in Claude Code
Add to .claude/settings.json in your project. Everything not listed still prompts:
Browse all your Frontic projects with their names, IDs, data types, and configured locales. Use it when you don’t already know which project you’re working against - once a project is selected, the resource tools take its ID directly.
Output format: ‘content’ (default) returns project data directly in the response, ‘resource’ returns MCP resource URIs that can be fetched separately. Use ‘content’ in most cases.
One of: resource, content
Get a sample Fetch API response for a block, listing, tree, or page - exactly what the frontend receives when calling the Frontic API. Useful for understanding the response shape before building your frontend.
Resource type to get the example for. Can be “block”, “listing”, “tree” or “page”. If you pass the wrong type for a given name, the tool will auto-correct to match the resource’s actual mode.
One of: block, listing, tree, page
The type name of the block, listing, or tree (e.g., ‘ProductCard’, ‘CategoryListing’, ‘CategoryNavigation’). Use list_blocks, list_listings or list_trees to find available names if unsure. Not needed for pages - use the slug parameter instead.
JSON object with entry point parameters. For blocks: {“key”: “<record-uuid>”} (omit to return any result). For listings: depends on configuration, e.g., {“categoryId”: “<id>”} - most listings require at least one parameter. For trees: optional {“key”: “<record-uuid>”} to start from a subtree, {“depth”: <n>} to limit depth (1-20). Use list_storage_record_examples to find real record IDs.
Entity type: “block” for content components, “listing” for listings, “page” for website pages, “storage” for data storages “tree” for trees
One of: block, listing, page, storage, tree
The name of the block. IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Product Card’, ‘Hero Banner’, ‘Cart Summary’). Never use PascalCase or concatenated words - the platform derives the URL slug and API type name from this value, and incorrect casing breaks namespacing.
If the storage used in storageId is of type “commerce”, you can choose to retrieve product variants from this block. This will determine the fetchMode for this block. It will make the block return variant records. The default is to return product records.
Optional array of field operations. Each field can have “add” or “delete” operation, allowing mixed operations in a single call. Omit this parameter if you only want to change the active status.
The type of field to add. Required for “add” operations. Options: “field” (storage-based), “block” (nested block), “resultList”, “variantList”, “productPrice” (only possible for blocks with fetchMode=product), “pageRoute”
One of: field, block, resultList, variantList, productPrice, pageRoute
The name of the listing. IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Product List’, ‘Category Grid’, ‘Search Results’). Never use PascalCase or concatenated words - the platform derives the URL slug and API type name from this value.
Choose if the listing should return only the first result or all results. Use “first” for single item searches, “all” for listing multiple items (e.g. product listings in categories).
One of: all, first
Configure all aspects of an existing listing: search fields, filter fields, sort fields, parameters, query conditions, search settings, and pagination.
The operation for this field: “add” to add a new field, “update” to modify an existing field, “delete” to remove an existing field
One of: add, update, delete
Required for “add” operations. Source of the field: “blockField” (from listing’s nested block) or “storageField” (from storage referenced in storageId). Always prefer block fields over storage fields.
One of: blockField, storageField
Required for simple comparison conditions. The comparison operator. Omit for pure group conditions.
One of: like, notLike, equals, notEquals, gt, gte, lt, lte
Array of nested conditions for complex AND/OR logic. Required for pure group conditions. Each rule follows the same structure and can itself be either a simple condition or a group.
The name of the page (max 100 characters). IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Product Detail’, ‘Category Page’). Never use PascalCase or concatenated words.
The path in the slug block field referenced in slugBlockFieldId, if it is a composite field (e.g., “label” if the slugBlockFieldId references the composite field “cover” and the full path would be “cover.label”). Leave empty for simple fields.
Strategy for handling URL conflicts: “suffix” adds the conflict suffix to make URLs unique, “discard” skips records with conflicting URLs. Defaults to “suffix”.
One of: suffix, discard
Only required for urlConflictStrategy=“suffix”. The ID of the block field to use as suffix when URL conflicts occur (e.g., when multiple items would generate the same URL slug). It often makes sense to use a unique identifier for the item, like a unique id or product-number etc.
Only relevant for urlConflictStrategy=“suffix”. The path in the URL conflict suffix block field referenced in urlConflictSuffixBlockFieldId, if it is a composite field (e.g., “label” if the slugBlockFieldId references the composite field “cover” and the full path would be “cover.label”). Leave empty for simple fields.
Behavior when a source record is deleted: “temporaryRedirect” (302), “permanentRedirect” (301), “notFound” (404), or “delete” (removes the page URL completely). Defaults to “notFound”.
One of: temporaryRedirect, permanentRedirect, notFound, delete
Optional: The path in the slug block field, if it is a composite field (e.g., “label” for “cover.label”). Use empty string "" for simple fields. Only provide if you want to change it.
Optional: The ID of the block field to use as suffix when URL conflicts occur. Required if you set urlConflictStrategy to “suffix”. It often makes sense to use a unique identifier like a product number.
Optional: The path in the URL conflict suffix block field, if it is a composite field. Use empty string "" for simple fields. Only provide if you want to change it.
Optional: Strategy for handling URL conflicts: “suffix” adds the conflict suffix to make URLs unique, “discard” skips records with conflicting URLs. Set to null to clear the value. If set to “suffix”, you must also provide urlConflictSuffixBlockFieldId.
Optional: Behavior when a source record is deleted: “temporaryRedirect” (302), “permanentRedirect” (301), “notFound” (404), or “delete” (removes the page URL completely). Set to null to clear the value.
Create a Menu Tree - a hierarchical collection of records (navigation menus, category trees, support article hierarchies). Each tree references a connected Data Storage and a Detail Block that defines the node shape. Multiple trees can share the same block; the agent prefers reusing an existing block over creating a new one.
The name of the tree. IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Category Menu’, ‘Footer Navigation’, ‘Support Links’). Never use PascalCase or concatenated words - the platform derives the URL slug and API type name from this value.
Configure an existing tree’s query conditions - the business-logic filters that narrow which records the tree includes. Use it after create_tree to make a tree more specific.
Required for simple comparison conditions. The comparison operator. Omit for pure group conditions.
One of: like, notLike, equals, notEquals, gt, gte, lt, lte
Array of nested conditions for complex AND/OR logic. Required for pure group conditions. Each rule follows the same structure and can itself be either a simple condition or a group.
The name of the storage. IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Products’, ‘Blog Articles’, ‘Brands’). Never use PascalCase or concatenated words.
Storage type. Use “default” for regular content/reference data and “commerce” for product catalog data with commerce-specific default fields.
One of: default, commerce
Update an existing Data Storage by adding, renaming, or removing top-level fields. Removing a field deletes the values stored in it, which is why this tool is marked as destroying data. Field type is fixed at creation - to change a field’s type you delete and recreate it.Multiple operations can be batched in a single call and run sequentially, so a later operation can target a field added or renamed earlier in the same call.The tool works on top-level fields only - nested sub-fields of composite types aren’t editable through this tool. To create a new storage from scratch through MCP, use create_storage.
Data type key for “add” operations, e.g. “string”, “integer”, “boolean”, or a custom composite type key. If relation is provided and type is omitted, “any” is used automatically.
Explore the context hierarchy of your project. get_project returns the whole configuration in one call: the project, its scopes with their regions and locales, and its domains with each domain’s scope, region, and locale resolved into names rather than left as IDs. The list_* tools enumerate one resource kind at a time.
Domains map a scope, region, and locale combination to URL routing.
Scopes are data segmentation layers (e.g., B2B vs B2C). Every project has at least the default public scope. A scoped field can return different values per scope - for example, true in scope A and false in scope B.
Regions are subdivisions of a scope (e.g., EU, US, APAC). Each region holds a currency and one or more locales, determining which prices to show.
Locales determine which translation to return for translatable fields. If a field is set as translatable, the response value matches the translation for that locale. list_locales is the complete list: a locale that no region exposes appears there and not in get_project.
How one project is configured, in a single call: the project itself, its scopes with their regions and locales, and its domains with each domain’s scope, region, and locale resolved into names and keys rather than left as IDs. Start here when you already know which project you are working on, and reach for list_projects only when you do not.fetchApi carries the hostname and the version token that addresses this environment. Send the token as the fs-version header on Fetch API calls: without it the Fetch API serves the public environment. environments lists the project’s other stages, each with its own version token, and a stage only carries a token when one is set - the public environment has none, because sending no fs-version header is how a caller reaches it.list_locales remains the complete locale list. A locale that no region exposes appears there and not here.
List up to five example records from a storage, each carrying the system fields the record has (key, active, parentKey, position, plus price and options on Products storages). Use it to learn a storage’s real shape - slugs, keys, field values - before writing query conditions against it.
ID of the storage to read - usually the one connected to the block, listing or page. list_blocks, list_listings, list_trees and list_pages show each resource’s storageId.
Storage fields to return next to the system fields, e.g. [“slug”] for a page or [“categoryId”] for a listing parameter. Only records with a value in every one of them are returned. System fields come with every example.
Search records in a storage to see the transformed values blocks and listings serve to the frontend. Useful for verifying data after a sync, debugging unexpected output, or pulling a realistic sample for a composer dry-run with preview_composer_value or preview_composer_record. Filter by scope, region, and locale to see contextualized values like scoped pricing or translated content.By default records[] contains bare payload objects - exactly what the user stored, no wrapper. Pass includeMetadata: true to get each record wrapped with its id, sourceId, parentSourceId, createdAt, and updatedAt. Opt in when you need to know when a record was updated/created or walk parent–child relationships in a follow-up call.metadata.parentSourceId is the storage-tree parent - distinct from any parentKey a user happens to have inside their own payload. That namespacing is why metadata is opt-in rather than always-on.availableFilters and metaSearchResult (pagination + total count) are always returned alongside records[], regardless of includeMetadata.Omit conditions entirely to return all records.
Filter conditions. Pass an and or or array of {field, operator, value} items - NOT a field-keyed object. Example: {“and”: [{“field”: “slug”, “operator”: “like”, “value”: “polizei”}]}. The field-keyed shape {“slug”: {“like”: ”…”}} is silently ignored by the backend and returns all records.
Include storage metadata (id, sourceId, parentSourceId, createdAt, updatedAt) on each record. Default false returns the bare payload - what the user actually stored - under records[]. Opt in when you need to reference a record by its sourceId, parentSourceId, or id, e.g. for follow-up tool calls or debugging tree relationships.
Search feed records from an integration to see the connector-normalized data before the composer transforms it. Every commerce platform names fields differently (Shopify: flat keys; Shopware: dot-notation; commercetools: deeply nested objects), so inspecting an actual feed record is the only reliable way to know what’s available and how it’s shaped.Same metadata contract as search_storage_records: bare payloads by default, full envelope (id, sourceId, parentSourceId, createdAt, updatedAt) when you pass includeMetadata: true. availableFilters and metaSearchResult are always returned.
Filter by a specific record source ID to find a single record. Finds a parent record unless variants is set. Use this for targeted lookups when you know the record identifier.
Filter by parent record source ID to find its variants (e.g., all variants of a main product). Only applicable to feeds with parent-child relationships. Implies a variant search.
Commerce feeds only: true makes sourceId look up a variant record instead of a parent. Not needed when filtering by parentSourceId, which always searches variants.
Include storage metadata (id, sourceId, parentSourceId, createdAt, updatedAt) on each record. Default false returns the bare payload - what the user actually stored - under records[]. Opt in when you need to reference a record by its sourceId, parentSourceId, or id, e.g. for follow-up tool calls or debugging tree relationships.
Discover and inspect connected source systems and their feed schemas. The typical workflow is list_integrations → pick a feed → get_integration_feed → use the field paths in update_data_sync_value_configs or composer previews.Integrations belong to the Team rather than to a single project, so both tools here take no project and return the same results wherever you are working. The same holds for search_feed_records in Browse Data, which reads a feed rather than a storage.
Connected source systems with their channels and a compact feed inventory (id and name). Integrations belong to the Team, so this takes no project and returns the same list whichever project you are working in.Takes no parameters.
Get the full schema for a single integration feed by feed ID. Returns the integration metadata, feed metadata (including type, token, urls, methods, configurations, and refreshSupported), and a flat field list in dot-path notation with types - for example, title (string), manufacturer (object), manufacturer.name (string). The flat representation is what you copy into composer configs.If the feed ID isn’t found, the tool returns the list of available feed IDs across the Team’s integrations so the agent can recover without a separate discovery call.
Create a data sync shell that connects one integration feed to one storage with a name, feed, storage, and optional scope/channel/locale mappings. New data syncs are enabled on creation; call get_data_sync, then update_data_sync_value_configs, to configure field value mappings
List of field-level config replacements. Each entry replaces one target field config by fieldId, without requiring the caller to pass all data sync fields.
Full replacement config for this field only. Valid examples: {“source”:“data-field”,“field”:“name”}, {“source”:“static”,“value”:“Default”}, {“source”:“composed”,“composition”:{“type”:“object”,“properties”:{“label”:{“source”:“data-field”,“field”:“manufacturer.name”}}}}.
Include intermediate transformation steps in the response for troubleshooting composition chains. Useful when a multi-step composition produces unexpected results and you need to see which operation went wrong.
Object mapping storage field names/keys to value-composer configs, e.g. {“title”:{“source”:“data-field”,“field”:“name”},“seoTitle”:{“source”:“static”,“value”:“Fallback”},“manufacturer”:{“source”:“composed”,“composition”:{“type”:“object”,“properties”:{“label”:{“source”:“data-field”,“field”:“manufacturer.name”}}}}}.
Include intermediate transformation steps in the response for troubleshooting composition chains. Useful when a multi-step composition produces unexpected results and you need to see which operation went wrong.
Set the document status. “active” makes it available to agents, “draft” hides it, “inactive” disables it. Omit to keep the current status unchanged.
One of: active, draft, inactive
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Frontic Docs","description":"Frontic - an AI platform for shipping shopping experiences in a fraction of the time, with double the fun.","colors":{"primary":"#a855f7","light":"#c084fc","dark":"#8b5cf6"},"logo":{"light":"https://mintcdn.com/frontic/QEEg-J3fIyHJ_Wyh/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=QEEg-J3fIyHJ_Wyh\u0026q=85\u0026s=36391b9f3546193a73f97d7b6ee40463","dark":"https://mintcdn.com/frontic/QEEg-J3fIyHJ_Wyh/logo/logo-dark.svg?fit=max\u0026auto=format\u0026n=QEEg-J3fIyHJ_Wyh\u0026q=85\u0026s=704f0d073af32f152eab7ab9e4229a9b"},"favicon":"https://mintcdn.com/frontic/QEEg-J3fIyHJ_Wyh/logo/light.svg?fit=max\u0026auto=format\u0026n=QEEg-J3fIyHJ_Wyh\u0026q=85\u0026s=add2ba40542c32e89fccea55bbd2afbd","api":{"playground":{"display":"interactive"},"mdx":{"auth":{"method":"key","name":"Authorization"},"server":"https://ingest-{integration-id}.frontic.com"}},"appearance":{"default":"dark","strict":false},"navbar":{"links":[{"href":"mailto:support@frontic.com","label":"Support"},{"href":"https://www.frontic.com","label":"Website"}],"primary":{"type":"button","label":"Log In","href":"https://app.frontic.com"}},"footer":{"socials":{"github":"https://github.com/frontic","linkedin":"https://www.linkedin.com/company/102853312"},"links":[{"header":"Resources","items":[{"label":"Changelog","href":"https://frontic.com/changelog"},{"label":"Status","href":"https://status.frontic.com"}]},{"header":"Company","items":[{"label":"Website","href":"https://www.frontic.com"},{"label":"Support","href":"mailto:support@frontic.com"}]}]},"search":{"prompt":"Search Frontic docs..."},"styling":{"codeblocks":{"theme":"css-variables"},"latex":false},"integrations":{"posthog":{"apiKey":"phc_4DuVaMwZYdzCq7HW2hyorMIALyLvxWvC2STOIk8z1lr","apiHost":"https://eu.posthog.com"}},"contextual":{"options":["copy","chatgpt","claude","mcp","cursor"],"display":"header"},"navigation":{"global":{},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"frontic","hasAudioNarration":false,"actualSubdomain":"frontic","customDomains":["docs.frontic.com"],"gitSource":{"type":"github","owner":"frontic","repo":"docs","deployBranch":"main","isPrivate":true,"contentDirectory":"","mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae7c42deeb506b36f78cabb","collectionId":"1bbaa1b1-930b-4c2d-b260-45171d33ed14","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae7c42deeb506b36f78cabb"},"feedback":{"agentFeedback":true},"entitlements":{},"buildId":"6ae7c42deeb506b36f78cabb","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Documentation","count":52},{"language":"default","tag":"Connectors","count":24},{"language":"default","tag":"Reference","count":24},{"language":"default","tag":"Fetch API","count":9},{"language":"default","tag":"Build in Frontic","count":8},{"language":"default","tag":"Context Base","count":7},{"language":"default","tag":"Essentials","count":7},{"language":"default","tag":"Project Settings","count":7},{"language":"default","tag":"Ingest API","count":6},{"language":"default","tag":"API Builder","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@keyframes glow-float-1{0%,to{transform:translate(0,0) scale(1)}50%{transform:translate(30px,20px) scale(1.1)}}@keyframes glow-float-2{0%,to{transform:translate(0,0) scale(1)}50%{transform:translate(-20px,30px) scale(1.15)}}@keyframes glow-float-3{0%,to{transform:translate(0,0) scale(1)}50%{transform:translate(20px,-20px) scale(1.05)}}:root{--frontic-purple:#a042ff;--frontic-purple-secondary:#784dcb;--frontic-purple-light:#c084fc;--frontic-violet:#8b5cf6;--frontic-dark-bg:#131117}html.dark{background:#0a0a0f}html.dark body{background:0 0}html.dark body::after,html.dark body::before,html.dark::before{content:\"\";position:fixed;border-radius:50%;filter:blur(112px);opacity:.5;pointer-events:none;z-index:-1}html.dark body::before{top:-10%;left:10%;width:600px;height:600px;background:radial-gradient(circle,rgba(160,66,255,.4) 0,transparent 70%);animation:glow-float-1 8s ease-in-out infinite}html.dark body::after{top:30%;right:5%;width:500px;height:500px;background:radial-gradient(circle,rgba(120,77,203,.35) 0,transparent 70%);animation:glow-float-2 10s ease-in-out infinite}html.dark::before{bottom:10%;left:30%;width:400px;height:400px;background:radial-gradient(circle,rgba(168,85,247,.25) 0,transparent 70%);animation:glow-float-3 9s ease-in-out infinite}html:not(.dark){background:#fafafa;--mint-background:#faf5ff;--mint-foreground:#111827;--mint-color-text:#111827;--mint-color-background:#faf5ff;--mint-token-constant:#7c3aed;--mint-token-string:#059669;--mint-token-comment:#9ca3af;--mint-token-keyword:#a855f7;--mint-token-parameter:#6366f1;--mint-token-function:#8b5cf6;--mint-token-string-expression:#059669;--mint-token-punctuation:#6b7280;--mint-token-link:#a855f7}html:not(.dark) body{background:0 0}html:not(.dark) body::after,html:not(.dark) body::before{content:\"\";position:fixed;border-radius:50%;filter:blur(100px);pointer-events:none;z-index:-1}html:not(.dark) body::before{top:-10%;left:10%;width:600px;height:600px;background:radial-gradient(circle,rgba(160,66,255,.15) 0,transparent 70%);animation:glow-float-1 8s ease-in-out infinite}html:not(.dark) body::after{top:40%;right:5%;width:500px;height:500px;background:radial-gradient(circle,rgba(120,77,203,.12) 0,transparent 70%);animation:glow-float-2 10s ease-in-out infinite}.prose,[class*=content],body,main,nav:not([class*=top]){background:0 0!important}html.dark #sidebar{background:linear-gradient(180deg,rgba(160,66,255,.03) 0,transparent 100%)!important}#sidebar,#sidebar-content{box-shadow:none!important}html.dark header,html.dark nav{border-bottom-color:rgba(160,66,255,.1)!important}html.dark .code-group{border-top:1px solid rgba(160,66,255,.15)!important;border-radius:8px!important}html:not(.dark) .code-group{border:1px solid rgba(160,66,255,.1)!important;border-radius:8px!important;background-color:#faf5ff!important;color:#111827!important}pre{border:0!important}html.dark{--mint-background:#1a1625;--mint-foreground:#e5e7eb;--mint-color-text:#e5e7eb;--mint-color-background:#1a1625;--mint-token-constant:#c4b5fd;--mint-token-string:#6ee7b7;--mint-token-comment:#6b7280;--mint-token-keyword:#c084fc;--mint-token-parameter:#a5b4fc;--mint-token-function:#a78bfa;--mint-token-string-expression:#6ee7b7;--mint-token-punctuation:#9ca3af;--mint-token-link:#c084fc}html:not(.dark) :not(pre)>code{background-color:rgba(160,66,255,.08)!important;color:#6b21a8!important}html:not(.dark) .code-group [role=tab][aria-selected=true],html:not(.dark) .codeblock-dark [role=tab][aria-selected=true],html:not(.dark) button[aria-label*=opy] svg{color:#7c3aed!important}html:not(.dark) .code-group [role=tab]{color:#6b7280!important}html:not(.dark) .code-group [role=tab]:hover>div:first-child{background-color:rgba(160,66,255,.1)!important;color:#7c3aed!important}html:not(.dark) .code-group [role=tab][aria-selected=true]>div:last-child{background-color:#7c3aed!important}html:not(.dark) .codeblock-dark,html:not(.dark) .codeblock-dark [data-component-part=code-block-root]{background-color:#faf5ff!important;color:#111827!important}html:not(.dark) .codeblock-dark [data-fade-overlay=true]{--fade-color-light:#faf5ff!important;--fade-color-dark:#faf5ff!important}[role=listbox],[role=menu],[role=tooltip]{background-color:#fff!important;color:#1f2937!important;border:1px solid rgba(160,66,255,.15);border-radius:8px;box-shadow:0 12px 28px -8px rgba(0,0,0,.18);backdrop-filter:blur(8px)}html.dark [role=listbox],html.dark [role=menu],html.dark [role=tooltip]{background-color:#1a1625!important;color:#e5e7eb!important;border-color:rgba(160,66,255,.25);box-shadow:0 12px 28px -8px rgba(0,0,0,.6)}[role=tooltip] *{color:inherit!important}[class*=navbar]::after,[class*=sidebar]::after,[class*=sidebar]::before,[class*=topbar]::after,header::after,nav[class*=side]::after,nav[class*=side]::before,nav[class*=top]::after{background:0 0!important;background-image:none!important;background-color:transparent!important;display:none!important}[class*=sidebar]>div:first-child{background:0 0!important;background-color:transparent!important;background-image:none!important}#sidebar-content .sticky.top-0{background:0 0!important;background-image:none!important;background-color:transparent!important}[data-nav-tag=Preview]{color:#2563eb!important;background-color:rgba(37,99,235,.1)!important}html.dark [data-nav-tag=Preview]{color:#60a5fa!important;background-color:rgba(96,165,250,.15)!important}[data-nav-tag=New]{color:#16a34a!important;background-color:rgba(22,163,74,.1)!important}html.dark [data-nav-tag=New]{color:#4ade80!important;background-color:rgba(74,222,128,.15)!important}"}],"page":{"pagePath":"reference/mcp/frontic-tools","slug":"/reference/mcp/frontic-tools","pageMetadata":{"title":"Frontic Tools","icon":"microchip-ai","description":null,"href":"/reference/mcp/frontic-tools"},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,Card,CardGroup,CodeBlock,CodeGroup,Expandable,Frame,Heading,Info,OptimizedImage,ParamField,Prompt,Step,Steps,Table}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!Prompt)_missingMdxReference(`Prompt`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Frontic Tools`}),` MCP server connects AI coding assistants directly to your Frontic projects, letting you build storefronts and configure your Frontic API from your IDE. Pair it with the `,_jsx(_components.a,{href:`/reference/mcp/frontic-docs`,children:`Frontic Docs`}),` MCP server so the agent can also answer “how does X work?” questions without leaving the editor.`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/frontic/34vlQbUxJTTktEkF/images/hero-mcp.png?fit=max\u0026auto=format\u0026n=34vlQbUxJTTktEkF\u0026q=85\u0026s=be3cd285767b47d3b78a25ae4d9fb853`,alt:`Frontic MCP Server Hero`,\"data-og-width\":`2400`,width:`2400`,\"data-og-height\":`1354`,height:`1354`,\"data-path\":`images/hero-mcp.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/frontic/34vlQbUxJTTktEkF/images/hero-mcp.png?w=280\u0026fit=max\u0026auto=format\u0026n=34vlQbUxJTTktEkF\u0026q=85\u0026s=e36d851f69c2471d5b2adda0a393ef7e 280w, https://mintcdn.com/frontic/34vlQbUxJTTktEkF/images/hero-mcp.png?w=560\u0026fit=max\u0026auto=format\u0026n=34vlQbUxJTTktEkF\u0026q=85\u0026s=108c544e4236c7b42a44d2705d342a46 560w, https://mintcdn.com/frontic/34vlQbUxJTTktEkF/images/hero-mcp.png?w=840\u0026fit=max\u0026auto=format\u0026n=34vlQbUxJTTktEkF\u0026q=85\u0026s=9ec6c8c0fc82b0621fbf7d3efcdc73e3 840w, https://mintcdn.com/frontic/34vlQbUxJTTktEkF/images/hero-mcp.png?w=1100\u0026fit=max\u0026auto=format\u0026n=34vlQbUxJTTktEkF\u0026q=85\u0026s=df61c5af70f53ada66679d5fe462463f 1100w, https://mintcdn.com/frontic/34vlQbUxJTTktEkF/images/hero-mcp.png?w=1650\u0026fit=max\u0026auto=format\u0026n=34vlQbUxJTTktEkF\u0026q=85\u0026s=7fbef769e6f299f397f1931896e6999e 1650w, https://mintcdn.com/frontic/34vlQbUxJTTktEkF/images/hero-mcp.png?w=2500\u0026fit=max\u0026auto=format\u0026n=34vlQbUxJTTktEkF\u0026q=85\u0026s=2054ce15eefd32271be443f5caee5a51 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsx(_components.p,{children:`Connect your favorite AI coding assistants directly to your Frontic Commerce projects through secure OAuth authentication. Build a frontend AND the corresponding Frontic API - all from your coding agent or IDE of choice.`}),`\n`,_jsxs(CardGroup,{cols:3,children:[_jsx(Card,{title:`Claude Code`,icon:`terminal`,children:_jsx(_components.p,{children:`Full project management and content creation workflows`})}),_jsx(Card,{title:`Claude Desktop`,icon:`desktop`,children:_jsx(_components.p,{children:`Interactive Frontic operations from your desktop`})}),_jsx(Card,{title:`Cursor`,icon:`i-cursor`,children:_jsx(_components.p,{children:`Integrated development experience with AI assistance`})})]}),`\n`,_jsx(_components.p,{children:`The MCP server provides tools across these categories:`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Project \u0026 Resource Discovery`,icon:`folder-open`,children:_jsx(_components.p,{children:`Browse projects, list each resource kind, inspect storage records, and preview Fetch API responses`})}),_jsx(Card,{title:`Blocks, Listings, Pages \u0026 Trees`,icon:`pen-ruler`,children:_jsx(_components.p,{children:`Create and manage blocks, listings, pages, and menu trees that define your API`})}),_jsx(Card,{title:`Storage Management`,icon:`database`,children:_jsx(_components.p,{children:`Create Data Storages, then add, rename, and remove top-level fields`})}),_jsx(Card,{title:`Project Configuration`,icon:`sliders`,children:_jsx(_components.p,{children:`Explore domains, scopes, regions, and locales`})}),_jsx(Card,{title:`Browse Data`,icon:`magnifying-glass`,children:_jsx(_components.p,{children:`Search storage records and raw feed records`})}),_jsx(Card,{title:`Integrations`,icon:`plug`,children:_jsx(_components.p,{children:`Inspect connected integrations and their feed schemas before mapping`})}),_jsx(Card,{title:`Data Syncs \u0026 Value Composer`,icon:`arrows-rotate`,children:_jsx(_components.p,{children:`Create data syncs, configure field mappings, and preview composer operations`})}),_jsx(Card,{title:`Context Documents`,icon:`file-lines`,children:_jsx(_components.p,{children:`Manage skills, rules, guides, and other context documents`})}),_jsx(Card,{title:`Shopware Insights`,icon:`cart-shopping`,children:_jsx(_components.p,{children:`Read the promotions and sales channels of a connected Shopware store`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`setup`,children:`Setup`}),`\n`,_jsx(_components.p,{children:`The fastest path is the CLI - pick your package manager:`}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`frontic`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-function, #0068d6)`,\"--shiki-dark\":`var(--mint-token-function, #0068d6)`},children:`frontic`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` mcp`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` init`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` --client`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` cursor`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`pnpm`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-function, #0068d6)`,\"--shiki-dark\":`var(--mint-token-function, #0068d6)`},children:`pnpm`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` dlx`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` @frontic/cli@latest`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` mcp`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` init`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` --client`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` cursor`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`npm`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-function, #0068d6)`,\"--shiki-dark\":`var(--mint-token-function, #0068d6)`},children:`npx`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` @frontic/cli@latest`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` mcp`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` init`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` --client`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` cursor`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`yarn`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-function, #0068d6)`,\"--shiki-dark\":`var(--mint-token-function, #0068d6)`},children:`yarn`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` dlx`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` @frontic/cli@latest`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` mcp`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` init`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` --client`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` cursor`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`bun`,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-function, #0068d6)`,\"--shiki-dark\":`var(--mint-token-function, #0068d6)`},children:`bunx`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` @frontic/cli@latest`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` mcp`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` init`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` --client`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` cursor`})]}),`\n`]})})})]}),`\n`,_jsxs(_components.p,{children:[`Swap `,_jsx(_components.code,{children:`cursor`}),` for `,_jsx(_components.code,{children:`claude`}),`, `,_jsx(_components.code,{children:`windsurf`}),`, `,_jsx(_components.code,{children:`vscode`}),`, or `,_jsx(_components.code,{children:`codex`}),`. The CLI prompts whether to install Frontic Tools, Frontic Docs, or both - the recommended default is both. See the `,_jsx(_components.a,{href:`/reference/frontic-cli#frontic-mcp-init`,children:`Frontic CLI reference`}),` for full options.`]}),`\n`,_jsx(_components.p,{children:`If you’d rather edit the config yourself, drop this entry into your client’s MCP config file:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"mcpServers\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"frontic-tools\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"http\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"url\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"https://mcp.frontic.com/mcp\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`The first time you connect, you’ll be prompted to authenticate via OAuth. The token carries your Frontic account’s permissions - whatever role you have on a project, the MCP can do on that project, and nothing more.`})}),`\n`,_jsx(Heading,{level:`3`,id:`client-specific-configuration`,children:`Client-specific configuration`}),`\n`,_jsxs(Accordion,{title:`Claude Code`,id:`claude-code`,children:[_jsxs(_components.p,{children:[`Add to `,_jsx(_components.code,{children:`.mcp.json`}),` at your project root - Claude Code reads project MCP config from this file:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"mcpServers\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"frontic-tools\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"http\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"url\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"https://mcp.frontic.com/mcp\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`}`})}),`\n`]})})})]}),`\n`,_jsxs(Accordion,{title:`Claude Desktop`,id:`claude-desktop`,children:[_jsx(_components.p,{children:`Edit the Claude Desktop config file:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`macOS`}),`: `,_jsx(_components.code,{children:`~/Library/Application Support/Claude/claude_desktop_config.json`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Windows`}),`: `,_jsx(_components.code,{children:`%APPDATA%\\\\Claude\\\\claude_desktop_config.json`})]}),`\n`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"mcpServers\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"frontic-tools\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"http\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"url\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"https://mcp.frontic.com/mcp\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`}`})}),`\n`]})})})]}),`\n`,_jsxs(Accordion,{title:`Cursor`,id:`cursor`,children:[_jsxs(_components.p,{children:[`Add to `,_jsx(_components.code,{children:`.cursor/mcp.json`}),` in your project root, or Cursor’s global settings:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"mcpServers\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"frontic-tools\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"http\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"url\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"https://mcp.frontic.com/mcp\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`}`})}),`\n`]})})})]}),`\n`,_jsx(Heading,{level:`2`,id:`common-workflows`,children:`Common Workflows`}),`\n`,_jsx(_components.p,{children:`Most tools are a step in a chain, and the chain is what gets work done. These four cover\nalmost everything people build through the MCP server.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Build a backend from zero`,icon:`cube`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`list_projects`}),` to find the project, then `,_jsx(_components.code,{children:`create_storage`}),` for the `,_jsx(_components.a,{href:`/data-integration/data-storages`,children:`Data Storage`}),`\nand `,_jsx(_components.code,{children:`update_storage`}),` to add its fields. Wrap it in a `,_jsx(_components.a,{href:`/api-builder/blocks`,children:`Detail Block`}),`\nwith `,_jsx(_components.code,{children:`create_block`}),`, expose a collection with `,_jsx(_components.code,{children:`create_listing`}),`, and route it with\n`,_jsx(_components.code,{children:`create_page`}),`. Finish with `,_jsx(_components.code,{children:`preview_fetch_response`}),` to see exactly what the frontend\nwill receive.`]})}),_jsx(Step,{title:`Map a feed into a storage`,icon:`arrows-rotate`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`list_integrations`}),` to find the connected system, then `,_jsx(_components.code,{children:`get_integration_feed`}),` for the\nflat field list in dot-path notation. Shape the storage to match, then `,_jsx(_components.code,{children:`create_data_sync`}),` -\nwhich creates the sync shell only. Call `,_jsx(_components.code,{children:`get_data_sync`}),` for the field tree, map the\nfields with `,_jsx(_components.code,{children:`update_data_sync_value_configs`}),`, and dry-run the result with\n`,_jsx(_components.code,{children:`preview_composer_record`}),` before anything is persisted. Verify with `,_jsx(_components.code,{children:`search_storage_records`}),`\nonce the sync has run.`]})}),_jsx(Step,{title:`Build a navigation menu`,icon:`sitemap`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`list_storages`}),` for the source data and `,_jsx(_components.code,{children:`list_blocks`}),` to find an item block worth\nreusing - multiple `,_jsx(_components.a,{href:`/api-builder/trees`,children:`Menu Trees`}),` can share one. `,_jsx(_components.code,{children:`create_tree`}),`\nbuilds the hierarchy, `,_jsx(_components.code,{children:`update_tree`}),` narrows it with query conditions.`]})}),_jsx(Step,{title:`Debug what the frontend receives`,icon:`magnifying-glass`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`preview_fetch_response`}),` for the served payload, `,_jsx(_components.code,{children:`search_storage_records`}),` for the\nstored values behind it - filtered by scope, region, and locale to see contextualized\noutput. When you need a storage’s real keys and slugs rather than a search,\n`,_jsx(_components.code,{children:`list_storage_record_examples`}),` returns up to five records with their system fields.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`example-prompts`,children:`Example Prompts`}),`\n`,_jsx(_components.p,{children:`Once connected, try these prompts to explore the MCP server’s capabilities:`}),`\n`,_jsx(Prompt,{description:`Have your agent list your projects and inspect the main one`,children:`List all my Frontic projects and show me the resources in my main project.`}),`\n`,_jsx(Prompt,{description:`Ask the agent to map out your Data Storages and their fields`,children:`What storages and data structures are available in my project?`}),`\n`,_jsx(Prompt,{description:`Let the agent build a Search Listing with filters and sorting`,children:`Create a product listing with filters for category and price, sorted by newest first.`}),`\n`,_jsx(Prompt,{description:`Tell the agent to scaffold a hero block with the standard fields`,children:`Create a hero block with fields for title, subtitle, background image, and CTA button.`}),`\n`,_jsx(Prompt,{description:`Have the agent assemble a homepage from existing primitives`,children:`Create a homepage with a hero section at the top and a featured products listing below.`}),`\n`,_jsx(Prompt,{description:`Get the agent to plan and set up a basic storefront end to end`,children:`Help me set up a basic storefront with a homepage, product listing page, and the necessary blocks.`}),`\n`,_jsx(Prompt,{description:`Have the agent extend a Data Storage schema with a new translatable field`,children:\"Add a translatable `shortDescription` string field to the Products storage.\"}),`\n`,_jsx(Prompt,{description:`Have the agent create a Products storage and connect a feed`,children:`Create a Products storage and connect it to the Shopify Products feed.`}),`\n`,_jsx(Prompt,{description:`Have the agent set up a content storage from scratch`,children:`Set up a content storage for blog articles.`}),`\n`,_jsx(Prompt,{description:`Have the agent add a relation field linking two storages`,children:\"Add a `relatedProducts` relation field to the Products storage that links back to Products via the `sku` field.\"}),`\n`,_jsx(Prompt,{description:`Walk the integration → feed → data sync workflow end to end`,children:`Show me the field schema of my Shopify Products feed and use it to map the Products data sync.`}),`\n`,_jsx(Prompt,{description:`Ask the agent to inspect your data syncs and their field mappings`,children:`Show me all data syncs and their field mappings for my project.`}),`\n`,_jsx(Prompt,{description:`Have the agent preview a Value Composer transformation on a sample record`,children:`Preview how the Value Composer transforms a sample product record.`}),`\n`,_jsx(Prompt,{description:`Ask the agent what the connected Shopware store is running`,children:`List the sales channels and active promotions of my Shopware store.`}),`\n`,_jsx(Prompt,{description:`Ask the agent to walk your scope, region, and domain hierarchy`,children:`List all scopes, regions, and domains in my project to understand the context hierarchy.`}),`\n`,_jsx(Heading,{level:`2`,id:`available-tools`,children:`Available Tools`}),`\n`,_jsx(Heading,{level:`3`,id:`what-each-tool-may-do`,children:`What each tool may do`}),`\n`,_jsx(_components.p,{children:`Every tool declares whether it only reads, as an MCP annotation. Clients that act on those\nannotations can run the reading tools without stopping to ask and keep prompting for the\nrest; for clients that want it spelled out, the allow-list below does the same thing\nexplicitly.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`May do`}),_jsx(_components.th,{children:`Tools`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Reads only`})}),_jsxs(_components.td,{children:[`every `,_jsx(_components.code,{children:`get_*`}),`, `,_jsx(_components.code,{children:`list_*`}),`, `,_jsx(_components.code,{children:`search_*`}),`, and `,_jsx(_components.code,{children:`preview_*`}),` tool`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Writes`})}),_jsxs(_components.td,{children:[`every `,_jsx(_components.code,{children:`create_*`}),` tool, and the `,_jsx(_components.code,{children:`update_*`}),` tools that change configuration`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Destroys data`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`delete_resource`}),`, `,_jsx(_components.code,{children:`update_storage`})]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`preview_*`}),` tools count as reads because all three are dry-runs - they show you the\ntransformed value or the API response without persisting anything.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`update_storage`}),` sits with `,_jsx(_components.code,{children:`delete_resource`}),` because its field operations include deleting a\nfield, and deleting a field takes the stored values with it. Adding and renaming fields is\nsafe; removing one is not reversible.`]}),`\n`,_jsxs(Accordion,{title:`Auto-approve the read-only tools in Claude Code`,id:`auto-approve-the-read-only-tools-in-claude-code`,children:[_jsxs(_components.p,{children:[`Add to `,_jsx(_components.code,{children:`.claude/settings.json`}),` in your project. Everything not listed still prompts:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`32`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`32`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"permissions\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:` \"allow\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`:`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__get_context_document\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__get_data_sync\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__get_integration_feed\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__get_project\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_blocks\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_composer_operations\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_context_documents\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_data_syncs\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_domains\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_integrations\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_listings\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_locales\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_pages\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_projects\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_regions\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_scopes\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_shopware_promotions\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_shopware_sales_channels\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_storage_record_examples\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_storages\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__list_trees\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__preview_composer_record\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__preview_composer_value\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__preview_fetch_response\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__search_feed_records\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"mcp__frontic-tools__search_storage_records\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`}`})}),`\n`]})})})]}),`\n`,_jsx(Heading,{level:`3`,id:`project-\u0026-resource-discovery`,children:`Project \u0026 Resource Discovery`}),`\n`,_jsx(Heading,{level:`4`,id:`list_projects`,children:_jsx(_components.code,{children:`list_projects`})}),`\n`,_jsx(_components.p,{children:`Browse all your Frontic projects with their names, IDs, data types, and configured locales. Use it when you don’t already know which project you’re working against - once a project is selected, the resource tools take its ID directly.`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`mode`,type:`enum`,default:`content`,id:`param-mode`,children:_jsxs(_components.p,{children:[`Output format: ‘content’ (default) returns project data directly in the response, ‘resource’ returns MCP resource URIs that can be fetched separately. Use ‘content’ in most cases.\nOne of: `,_jsx(_components.code,{children:`resource`}),`, `,_jsx(_components.code,{children:`content`})]})})}),`\n`,_jsx(Heading,{level:`4`,id:`preview_fetch_response`,children:_jsx(_components.code,{children:`preview_fetch_response`})}),`\n`,_jsx(_components.p,{children:`Get a sample Fetch API response for a block, listing, tree, or page - exactly what the frontend receives when calling the Frontic API. Useful for understanding the response shape before building your frontend.`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`type`,type:`enum`,required:true,id:`param-type`,children:_jsxs(_components.p,{children:[`Resource type to get the example for. Can be “block”, “listing”, “tree” or “page”. If you pass the wrong type for a given name, the tool will auto-correct to match the resource’s actual mode.\nOne of: `,_jsx(_components.code,{children:`block`}),`, `,_jsx(_components.code,{children:`listing`}),`, `,_jsx(_components.code,{children:`tree`}),`, `,_jsx(_components.code,{children:`page`})]})}),_jsx(ParamField,{path:`name`,type:`string`,id:`param-name`,children:_jsx(_components.p,{children:`The type name of the block, listing, or tree (e.g., ‘ProductCard’, ‘CategoryListing’, ‘CategoryNavigation’). Use list_blocks, list_listings or list_trees to find available names if unsure. Not needed for pages - use the slug parameter instead.`})}),_jsx(ParamField,{path:`parameters`,type:`string`,id:`param-parameters`,children:_jsx(_components.p,{children:`JSON object with entry point parameters. For blocks: {“key”: “\u003crecord-uuid>”} (omit to return any result). For listings: depends on configuration, e.g., {“categoryId”: “\u003cid>”} - most listings require at least one parameter. For trees: optional {“key”: “\u003crecord-uuid>”} to start from a subtree, {“depth”: \u003cn>} to limit depth (1-20). Use list_storage_record_examples to find real record IDs.`})}),_jsx(ParamField,{path:`slug`,type:`string`,id:`param-slug`,children:_jsx(_components.p,{children:`Only required for pages. The full URL of the page - e.g. “myshop.com/shoes/sneakers/nike-air-max-90”, “myshop.com/fr-FR/Women/Clothing”`})}),_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`delete_resource`,children:_jsx(_components.code,{children:`delete_resource`})}),`\n`,_jsx(_components.p,{children:`Permanently delete a block, listing, page, storage, or tree from the project. This action cannot be undone.`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-1`,children:_jsx(_components.p,{children:`The unique identifier of the project containing the resource to delete`})}),_jsx(ParamField,{path:`type`,type:`enum`,required:true,id:`param-type-1`,children:_jsxs(_components.p,{children:[`Entity type: “block” for content components, “listing” for listings, “page” for website pages, “storage” for data storages “tree” for trees\nOne of: `,_jsx(_components.code,{children:`block`}),`, `,_jsx(_components.code,{children:`listing`}),`, `,_jsx(_components.code,{children:`page`}),`, `,_jsx(_components.code,{children:`storage`}),`, `,_jsx(_components.code,{children:`tree`})]})}),_jsx(ParamField,{path:`id`,type:`string`,required:true,id:`param-id`,children:_jsx(_components.p,{children:`The unique identifier of the specific resource to delete`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`block-management`,children:`Block Management`}),`\n`,_jsx(Heading,{level:`4`,id:`list_blocks`,children:_jsx(_components.code,{children:`list_blocks`})}),`\n`,_jsxs(_components.p,{children:[`Single-record endpoints with their fields, parameters, and `,_jsx(_components.code,{children:`storageId`})]}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-2`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`create_block`,children:_jsx(_components.code,{children:`create_block`})}),`\n`,_jsx(_components.p,{children:`Create a new block - a reusable content component that defines which fields are exposed in Fetch API responses. Blocks serve single-record endpoints.`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-3`,children:_jsx(_components.p,{children:`The unique identifier of the project in which the block should be created`})}),_jsx(ParamField,{path:`name`,type:`string`,required:true,id:`param-name-1`,children:_jsx(_components.p,{children:`The name of the block. IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Product Card’, ‘Hero Banner’, ‘Cart Summary’). Never use PascalCase or concatenated words - the platform derives the URL slug and API type name from this value, and incorrect casing breaks namespacing.`})}),_jsx(ParamField,{path:`description`,type:`string`,required:true,id:`param-description`,children:_jsx(_components.p,{children:`A brief description of the block’s purpose (e.g., ‘Serves product detail data including name, price, images, and description’).`})}),_jsx(ParamField,{path:`storageId`,type:`string`,required:true,id:`param-storage-id`,children:_jsx(_components.p,{children:`Must reference a valid storage ID from the available storages.`})}),_jsx(ParamField,{path:`useVariants`,type:`boolean`,default:`false`,id:`param-use-variants`,children:_jsx(_components.p,{children:`If the storage used in storageId is of type “commerce”, you can choose to retrieve product variants from this block. This will determine the fetchMode for this block. It will make the block return variant records. The default is to return product records.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`update_block`,children:_jsx(_components.code,{children:`update_block`})}),`\n`,_jsx(_components.p,{children:`Update an existing block by adding or removing fields, and control its active status.`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-4`,children:_jsx(_components.p,{children:`The unique identifier of the project containing the block`})}),_jsx(ParamField,{path:`blockId`,type:`string`,required:true,id:`param-block-id`,children:_jsx(_components.p,{children:`The unique identifier of the block to modify`})}),_jsxs(ParamField,{path:`fields`,type:`object[]`,id:`param-fields`,children:[_jsx(_components.p,{children:`Optional array of field operations. Each field can have “add” or “delete” operation, allowing mixed operations in a single call. Omit this parameter if you only want to change the active status.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`operation`,type:`enum`,required:true,id:`param-operation`,children:_jsxs(_components.p,{children:[`The operation for this field: “add” to add a new field, “delete” to remove an existing field\nOne of: `,_jsx(_components.code,{children:`add`}),`, `,_jsx(_components.code,{children:`delete`})]})}),_jsx(ParamField,{path:`name`,type:`string`,required:true,id:`param-name-2`,children:_jsx(_components.p,{children:`Name of the block field. For “add” operation, this will be the new field name. For “delete” operation, this must match an existing field name.`})}),_jsx(ParamField,{path:`fieldType`,type:`enum`,id:`param-field-type`,children:_jsxs(_components.p,{children:[`The type of field to add. Required for “add” operations. Options: “field” (storage-based), “block” (nested block), “resultList”, “variantList”, “productPrice” (only possible for blocks with fetchMode=product), “pageRoute”\nOne of: `,_jsx(_components.code,{children:`field`}),`, `,_jsx(_components.code,{children:`block`}),`, `,_jsx(_components.code,{children:`resultList`}),`, `,_jsx(_components.code,{children:`variantList`}),`, `,_jsx(_components.code,{children:`productPrice`}),`, `,_jsx(_components.code,{children:`pageRoute`})]})}),_jsx(ParamField,{path:`storageFieldId`,type:`string`,id:`param-storage-field-id`,children:_jsx(_components.p,{children:`Required for fieldType=“field”. The ID of the field from the block’s storage to link to.`})}),_jsx(ParamField,{path:`nestedBlockId`,type:`string`,id:`param-nested-block-id`,children:_jsx(_components.p,{children:`Required for fieldType=“block”, “resultList”, or “variantList”. The ID of the nested block to embed.`})}),_jsxs(ParamField,{path:`blockParameterValues`,type:`object[]`,id:`param-block-parameter-values`,children:[_jsx(_components.p,{children:`Optional parameter values for nested blocks. Maps parent block fields to nested block parameters.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`blockFieldId`,type:`string`,required:true,id:`param-block-field-id`,children:_jsx(_components.p,{children:`The ID of the block field to pass as value`})}),_jsx(ParamField,{path:`source`,type:`enum`,id:`param-source`,children:_jsxs(_components.p,{children:[`The source type for the block parameter value\nOne of: `,_jsx(_components.code,{children:`blockField`}),`, `,_jsx(_components.code,{children:`static`}),`, `,_jsx(_components.code,{children:`storageSchemaField`})]})}),_jsx(ParamField,{path:`reference`,type:`string`,required:true,id:`param-reference`,children:_jsx(_components.p,{children:`The static value or block field ID or block field name or storage field ID for the block parameter value source`})}),_jsx(ParamField,{path:`path`,type:`string`,id:`param-path`,children:_jsx(_components.p,{children:`The path in the block field or storage field for the block parameter value source, if it is a composite field`})})]})]}),_jsx(ParamField,{path:`priceStrategy`,type:`enum`,id:`param-price-strategy`,children:_jsxs(_components.p,{children:[`Required for fieldType=“productPrice”. Strategy for selecting price from variants.\nOne of: `,_jsx(_components.code,{children:`first`}),`, `,_jsx(_components.code,{children:`lowest`}),`, `,_jsx(_components.code,{children:`highest`})]})}),_jsx(ParamField,{path:`pageId`,type:`string`,id:`param-page-id`,children:_jsx(_components.p,{children:`Required for fieldType=“pageRoute”. The ID of the target page to link to.`})}),_jsx(ParamField,{path:`pageKeyBlockFieldId`,type:`string`,id:`param-page-key-block-field-id`,children:_jsx(_components.p,{children:`Required for fieldType=“pageRoute”. The ID of the block field that provides the key value that is used to get the correct page value.`})}),_jsx(ParamField,{path:`pageKeyStorageSchemaFieldId`,type:`string`,id:`param-page-key-storage-schema-field-id`,children:_jsx(_components.p,{children:`Required for fieldType=“pageRoute”. The ID of the storage schema field used as the page key.`})}),_jsx(ParamField,{path:`pageKeyPath`,type:`string`,id:`param-page-key-path`,children:_jsx(_components.p,{children:`Optional for fieldType=“pageRoute”. Path in the key field if it is a composite field (e.g., “name.en”).`})})]})]}),_jsx(ParamField,{path:`active`,type:`boolean`,id:`param-active`,children:_jsx(_components.p,{children:`Optional. Set whether the block is active (enabled) or inactive (disabled). When inactive, the block cannot be used in pages or other blocks.`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`listing-management`,children:`Listing Management`}),`\n`,_jsx(Heading,{level:`4`,id:`list_listings`,children:_jsx(_components.code,{children:`list_listings`})}),`\n`,_jsx(_components.p,{children:`Collections with their search, filter, and sort fields, parameters, and query conditions`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-5`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`create_listing`,children:_jsx(_components.code,{children:`create_listing`})}),`\n`,_jsx(_components.p,{children:`Create a new listing - a searchable, filterable, sortable collection that performs search queries on a block index.`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-6`,children:_jsx(_components.p,{children:`The unique identifier of the project in which the listing should be created`})}),_jsx(ParamField,{path:`name`,type:`string`,required:true,id:`param-name-3`,children:_jsx(_components.p,{children:`The name of the listing. IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Product List’, ‘Category Grid’, ‘Search Results’). Never use PascalCase or concatenated words - the platform derives the URL slug and API type name from this value.`})}),_jsx(ParamField,{path:`description`,type:`string`,required:true,id:`param-description-1`,children:_jsx(_components.p,{children:`A brief description of the listing’s purpose (e.g., ‘Searchable product collection with category filtering and price sorting’).`})}),_jsx(ParamField,{path:`storageId`,type:`string`,required:true,id:`param-storage-id-1`,children:_jsx(_components.p,{children:`Must reference a valid storage ID from the available storages.`})}),_jsx(ParamField,{path:`resultStrategy`,type:`enum`,required:true,id:`param-result-strategy`,children:_jsxs(_components.p,{children:[`Choose if the listing should return only the first result or all results. Use “first” for single item searches, “all” for listing multiple items (e.g. product listings in categories).\nOne of: `,_jsx(_components.code,{children:`all`}),`, `,_jsx(_components.code,{children:`first`})]})}),_jsx(ParamField,{path:`nestedBlockId`,type:`string`,required:true,id:`param-nested-block-id-1`,children:_jsx(_components.p,{children:`Must reference a valid block ID from the available blocks. This block will be used to render each item in the listing.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`update_listing`,children:_jsx(_components.code,{children:`update_listing`})}),`\n`,_jsx(_components.p,{children:`Configure all aspects of an existing listing: search fields, filter fields, sort fields, parameters, query conditions, search settings, and pagination.`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-7`,children:_jsx(_components.p,{children:`The unique identifier of the project containing the listing`})}),_jsx(ParamField,{path:`listingId`,type:`string`,required:true,id:`param-listing-id`,children:_jsx(_components.p,{children:`The unique identifier of the listing to modify`})}),_jsxs(ParamField,{path:`fields`,type:`object[]`,id:`param-fields-1`,children:[_jsx(_components.p,{children:`Optional array of field operations for search/filter/sort fields. Each field can have “add”, “update”, or “delete” operation.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`operation`,type:`enum`,required:true,id:`param-operation-1`,children:_jsxs(_components.p,{children:[`The operation for this field: “add” to add a new field, “update” to modify an existing field, “delete” to remove an existing field\nOne of: `,_jsx(_components.code,{children:`add`}),`, `,_jsx(_components.code,{children:`update`}),`, `,_jsx(_components.code,{children:`delete`})]})}),_jsx(ParamField,{path:`type`,type:`enum`,required:true,id:`param-type-2`,children:_jsxs(_components.p,{children:[`The type of field: “search” for text search, “filter” for filtering/faceting, “sort” for sorting\nOne of: `,_jsx(_components.code,{children:`search`}),`, `,_jsx(_components.code,{children:`filter`}),`, `,_jsx(_components.code,{children:`sort`})]})}),_jsx(ParamField,{path:`name`,type:`string`,required:true,id:`param-name-4`,children:_jsx(_components.p,{children:`Name of the field. For “add” operation, this will be the new field name. For “update” and “delete” operations, this must match an existing field name.`})}),_jsx(ParamField,{path:`source`,type:`enum`,id:`param-source-1`,children:_jsxs(_components.p,{children:[`Required for “add” operations. Source of the field: “blockField” (from listing’s nested block) or “storageField” (from storage referenced in storageId). Always prefer block fields over storage fields.\nOne of: `,_jsx(_components.code,{children:`blockField`}),`, `,_jsx(_components.code,{children:`storageField`})]})}),_jsx(ParamField,{path:`path`,type:`string`,id:`param-path-1`,children:_jsx(_components.p,{children:`Optional path of the field, if it is nested/composite (e.g. if the field you want to use is vendor.label, then the path is “label”)`})}),_jsx(ParamField,{path:`isFacetted`,type:`boolean`,id:`param-is-facetted`,children:_jsx(_components.p,{children:`Required for type=“filter” add operations. Whether the filter field is facetted (shows available options)`})}),_jsx(ParamField,{path:`isAggregated`,type:`boolean`,id:`param-is-aggregated`,children:_jsx(_components.p,{children:`Optional for type=“filter” add operations. Whether to aggregate values for this filter field. Defaults to true if not specified.`})}),_jsxs(ParamField,{path:`ranges`,type:`object[]`,id:`param-ranges`,children:[_jsx(_components.p,{children:`Optional for type=“filter”. Numeric ranges for the filter field`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`from`,type:`number`,required:true,id:`param-from`,children:_jsx(_components.p,{children:`Start of the range`})}),_jsx(ParamField,{path:`to`,type:`number`,required:true,id:`param-to`,children:_jsx(_components.p,{children:`End of the range`})})]})]}),_jsx(ParamField,{path:`sort`,type:`enum`,id:`param-sort`,children:_jsxs(_components.p,{children:[`Required for type=“sort” add operations. The sorting direction: “asc” (ascending) or “desc” (descending)\nOne of: `,_jsx(_components.code,{children:`asc`}),`, `,_jsx(_components.code,{children:`desc`})]})}),_jsx(ParamField,{path:`isDefault`,type:`boolean`,id:`param-is-default`,children:_jsx(_components.p,{children:`Required for type=“sort” add operations. Indicates if this is the default sort field. Only one sort field can be default.`})})]})]}),_jsxs(ParamField,{path:`parameters`,type:`object[]`,id:`param-parameters-1`,children:[_jsx(_components.p,{children:`Optional array of parameter operations. Parameters can be referenced in query conditions.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`operation`,type:`enum`,required:true,id:`param-operation-2`,children:_jsxs(_components.p,{children:[`The operation for this parameter: “add”, “update”, or “delete”\nOne of: `,_jsx(_components.code,{children:`add`}),`, `,_jsx(_components.code,{children:`update`}),`, `,_jsx(_components.code,{children:`delete`})]})}),_jsx(ParamField,{path:`name`,type:`string`,required:true,id:`param-name-5`,children:_jsx(_components.p,{children:`Name of the parameter. For “update” and “delete” operations, this must match an existing parameter name.`})}),_jsx(ParamField,{path:`dataType`,type:`string`,id:`param-data-type`,children:_jsx(_components.p,{children:`Required for “add” operations. The data type of the parameter (e.g., “string”, “int”, “bool”)`})}),_jsx(ParamField,{path:`required`,type:`boolean`,id:`param-required`,children:_jsx(_components.p,{children:`Required for “add” operations. Whether the parameter is required`})}),_jsx(ParamField,{path:`isArray`,type:`boolean`,id:`param-is-array`,children:_jsx(_components.p,{children:`Required for “add” operations. Whether the parameter is an array`})}),_jsx(ParamField,{path:`minItems`,type:`number`,id:`param-min-items`,children:_jsx(_components.p,{children:`Optional minimum number of items (for array parameters)`})}),_jsx(ParamField,{path:`maxItems`,type:`number`,id:`param-max-items`,children:_jsx(_components.p,{children:`Optional maximum number of items (for array parameters)`})}),_jsx(ParamField,{path:`defaultValue`,type:`string`,id:`param-default-value`,children:_jsx(_components.p,{children:`Optional default value for the parameter`})})]})]}),_jsxs(ParamField,{path:`conditions`,type:`object[]`,id:`param-conditions`,children:[_jsx(_components.p,{children:`Optional array of query condition operations. Conditions filter which records appear in the listing.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`operation`,type:`enum`,required:true,id:`param-operation-3`,children:_jsxs(_components.p,{children:[`The operation for this condition: “add” to add a new condition, “delete” to remove by index\nOne of: `,_jsx(_components.code,{children:`add`}),`, `,_jsx(_components.code,{children:`delete`})]})}),_jsx(ParamField,{path:`index`,type:`number`,id:`param-index`,children:_jsx(_components.p,{children:`Required for “delete” operation. The index of the condition to delete (0-based)`})}),_jsxs(ParamField,{path:`before`,type:`object`,id:`param-before`,children:[_jsx(_components.p,{children:`Required for simple comparison conditions. The left-hand side of the condition (field to check). Omit for pure group conditions.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`type`,type:`enum`,required:true,id:`param-type-3`,children:_jsxs(_components.p,{children:[`Source type: “blockField” or “storageField” (will be normalized to storageSchemaField)\nOne of: `,_jsx(_components.code,{children:`blockField`}),`, `,_jsx(_components.code,{children:`storageField`})]})}),_jsx(ParamField,{path:`reference`,type:`string`,required:true,id:`param-reference-1`,children:_jsx(_components.p,{children:`UUID of the field to compare`})}),_jsx(ParamField,{path:`path`,type:`string`,id:`param-path-2`,children:_jsx(_components.p,{children:`Optional path if the field is composite (e.g., “name.en”)`})})]})]}),_jsx(ParamField,{path:`operator`,type:`enum`,id:`param-operator`,children:_jsxs(_components.p,{children:[`Required for simple comparison conditions. The comparison operator. Omit for pure group conditions.\nOne of: `,_jsx(_components.code,{children:`like`}),`, `,_jsx(_components.code,{children:`notLike`}),`, `,_jsx(_components.code,{children:`equals`}),`, `,_jsx(_components.code,{children:`notEquals`}),`, `,_jsx(_components.code,{children:`gt`}),`, `,_jsx(_components.code,{children:`gte`}),`, `,_jsx(_components.code,{children:`lt`}),`, `,_jsx(_components.code,{children:`lte`})]})}),_jsxs(ParamField,{path:`after`,type:`object`,id:`param-after`,children:[_jsx(_components.p,{children:`Required for simple comparison conditions. The right-hand side of the condition (value to compare against). Omit for pure group conditions.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`type`,type:`enum`,required:true,id:`param-type-4`,children:_jsxs(_components.p,{children:[`Value type: “blockParameter” (reference to parameter) or “value” (static value)\nOne of: `,_jsx(_components.code,{children:`blockParameter`}),`, `,_jsx(_components.code,{children:`value`})]})}),_jsx(ParamField,{path:`reference`,type:`string`,required:true,id:`param-reference-2`,children:_jsx(_components.p,{children:`For blockParameter: parameter name. For value: the static value`})})]})]}),_jsx(ParamField,{path:`rules`,type:`any[]`,id:`param-rules`,children:_jsx(_components.p,{children:`Array of nested conditions for complex AND/OR logic. Required for pure group conditions. Each rule follows the same structure and can itself be either a simple condition or a group.`})}),_jsx(ParamField,{path:`group`,type:`enum`,id:`param-group`,children:_jsxs(_components.p,{children:[`Required when rules are present. Logical operator (“and” or “or”) for combining nested rules.\nOne of: `,_jsx(_components.code,{children:`and`}),`, `,_jsx(_components.code,{children:`or`})]})})]})]}),_jsx(ParamField,{path:`isSearchFuzzy`,type:`boolean`,id:`param-is-search-fuzzy`,children:_jsx(_components.p,{children:`Optional. Enable fuzzy search for better matching of similar terms. Defaults to true if not specified.`})}),_jsx(ParamField,{path:`perPageDefault`,type:`number`,id:`param-per-page-default`,children:_jsx(_components.p,{children:`Optional. Default number of items per page for pagination. Must be at least 1. Defaults to 24 if not specified.`})}),_jsx(ParamField,{path:`perPageMax`,type:`number`,id:`param-per-page-max`,children:_jsx(_components.p,{children:`Optional. Maximum number of items per page that can be requested. Must be at least 1. Defaults to 48 if not specified.`})}),_jsx(ParamField,{path:`active`,type:`boolean`,id:`param-active-1`,children:_jsx(_components.p,{children:`Optional. Set whether the listing is active (enabled) or inactive (disabled). When inactive, the listing cannot be used in the storefront.`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`page-management`,children:`Page Management`}),`\n`,_jsx(Heading,{level:`4`,id:`list_pages`,children:_jsx(_components.code,{children:`list_pages`})}),`\n`,_jsxs(_components.p,{children:[`URL routing patterns with their block and that block’s `,_jsx(_components.code,{children:`storageId`})]}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-8`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`create_page`,children:_jsx(_components.code,{children:`create_page`})}),`\n`,_jsx(_components.p,{children:`Create a page - a URL routing pattern that generates SEO-friendly routes from block data records.`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-9`,children:_jsx(_components.p,{children:`The unique identifier of the project in which the page should be created`})}),_jsx(ParamField,{path:`name`,type:`string`,required:true,id:`param-name-6`,children:_jsx(_components.p,{children:`The name of the page (max 100 characters). IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Product Detail’, ‘Category Page’). Never use PascalCase or concatenated words.`})}),_jsx(ParamField,{path:`blockId`,type:`string`,required:true,id:`param-block-id-1`,children:_jsx(_components.p,{children:`Must reference a valid block ID from the available blocks. This must be a block, not a listing.`})}),_jsx(ParamField,{path:`slugBlockFieldId`,type:`string`,required:true,id:`param-slug-block-field-id`,children:_jsx(_components.p,{children:`The ID of the block field to use as the URL slug. This field will be used to generate the URL path for each page.`})}),_jsx(ParamField,{path:`slugBlockFieldPath`,type:`string`,id:`param-slug-block-field-path`,children:_jsx(_components.p,{children:`The path in the slug block field referenced in slugBlockFieldId, if it is a composite field (e.g., “label” if the slugBlockFieldId references the composite field “cover” and the full path would be “cover.label”). Leave empty for simple fields.`})}),_jsx(ParamField,{path:`urlConflictStrategy`,type:`enum`,id:`param-url-conflict-strategy`,children:_jsxs(_components.p,{children:[`Strategy for handling URL conflicts: “suffix” adds the conflict suffix to make URLs unique, “discard” skips records with conflicting URLs. Defaults to “suffix”.\nOne of: `,_jsx(_components.code,{children:`suffix`}),`, `,_jsx(_components.code,{children:`discard`})]})}),_jsx(ParamField,{path:`urlConflictSuffixBlockFieldId`,type:`string`,id:`param-url-conflict-suffix-block-field-id`,children:_jsx(_components.p,{children:`Only required for urlConflictStrategy=“suffix”. The ID of the block field to use as suffix when URL conflicts occur (e.g., when multiple items would generate the same URL slug). It often makes sense to use a unique identifier for the item, like a unique id or product-number etc.`})}),_jsx(ParamField,{path:`urlConflictSuffixBlockFieldPath`,type:`string`,id:`param-url-conflict-suffix-block-field-path`,children:_jsx(_components.p,{children:`Only relevant for urlConflictStrategy=“suffix”. The path in the URL conflict suffix block field referenced in urlConflictSuffixBlockFieldId, if it is a composite field (e.g., “label” if the slugBlockFieldId references the composite field “cover” and the full path would be “cover.label”). Leave empty for simple fields.`})}),_jsx(ParamField,{path:`pageRecordDeleteStrategy`,type:`enum`,id:`param-page-record-delete-strategy`,children:_jsxs(_components.p,{children:[`Behavior when a source record is deleted: “temporaryRedirect” (302), “permanentRedirect” (301), “notFound” (404), or “delete” (removes the page URL completely). Defaults to “notFound”.\nOne of: `,_jsx(_components.code,{children:`temporaryRedirect`}),`, `,_jsx(_components.code,{children:`permanentRedirect`}),`, `,_jsx(_components.code,{children:`notFound`}),`, `,_jsx(_components.code,{children:`delete`})]})}),_jsx(ParamField,{path:`useForSitemap`,type:`boolean`,id:`param-use-for-sitemap`,children:_jsx(_components.p,{children:`Indicates if the URLs of this page should be included in generated sitemaps. Defaults to false.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`update_page`,children:_jsx(_components.code,{children:`update_page`})}),`\n`,_jsx(_components.p,{children:`Update an existing page’s URL generation settings like slug source, conflict strategy, and delete behavior.`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-10`,children:_jsx(_components.p,{children:`The unique identifier of the project containing the page`})}),_jsx(ParamField,{path:`pageId`,type:`string`,required:true,id:`param-page-id-1`,children:_jsx(_components.p,{children:`The unique identifier of the page to update`})}),_jsx(ParamField,{path:`slugBlockFieldId`,type:`string`,id:`param-slug-block-field-id-1`,children:_jsx(_components.p,{children:`Optional: The ID of the block field to use as the URL slug. Only provide if you want to change it.`})}),_jsx(ParamField,{path:`slugBlockFieldPath`,type:`string`,id:`param-slug-block-field-path-1`,children:_jsx(_components.p,{children:`Optional: The path in the slug block field, if it is a composite field (e.g., “label” for “cover.label”). Use empty string \"\" for simple fields. Only provide if you want to change it.`})}),_jsx(ParamField,{path:`urlConflictSuffixBlockFieldId`,type:`string`,id:`param-url-conflict-suffix-block-field-id-1`,children:_jsx(_components.p,{children:`Optional: The ID of the block field to use as suffix when URL conflicts occur. Required if you set urlConflictStrategy to “suffix”. It often makes sense to use a unique identifier like a product number.`})}),_jsx(ParamField,{path:`urlConflictSuffixBlockFieldPath`,type:`string`,id:`param-url-conflict-suffix-block-field-path-1`,children:_jsx(_components.p,{children:`Optional: The path in the URL conflict suffix block field, if it is a composite field. Use empty string \"\" for simple fields. Only provide if you want to change it.`})}),_jsx(ParamField,{path:`urlConflictStrategy`,type:`enum`,id:`param-url-conflict-strategy-1`,children:_jsx(_components.p,{children:`Optional: Strategy for handling URL conflicts: “suffix” adds the conflict suffix to make URLs unique, “discard” skips records with conflicting URLs. Set to null to clear the value. If set to “suffix”, you must also provide urlConflictSuffixBlockFieldId.`})}),_jsx(ParamField,{path:`pageRecordDeleteStrategy`,type:`enum`,id:`param-page-record-delete-strategy-1`,children:_jsx(_components.p,{children:`Optional: Behavior when a source record is deleted: “temporaryRedirect” (302), “permanentRedirect” (301), “notFound” (404), or “delete” (removes the page URL completely). Set to null to clear the value.`})}),_jsx(ParamField,{path:`useForSitemap`,type:`boolean`,id:`param-use-for-sitemap-1`,children:_jsx(_components.p,{children:`Indicates if the URLs of this page should be included in generated sitemaps..`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`tree-management`,children:`Tree Management`}),`\n`,_jsx(Heading,{level:`4`,id:`list_trees`,children:_jsx(_components.code,{children:`list_trees`})}),`\n`,_jsxs(_components.p,{children:[`Hierarchical collections with their `,_jsx(_components.code,{children:`storageId`}),`, query conditions, and nested item block`]}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-11`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`create_tree`,children:_jsx(_components.code,{children:`create_tree`})}),`\n`,_jsxs(_components.p,{children:[`Create a `,_jsx(_components.a,{href:`/api-builder/trees`,children:`Menu Tree`}),` - a hierarchical collection of records (navigation menus, category trees, support article hierarchies). Each tree references a connected Data Storage and a Detail Block that defines the node shape. Multiple trees can share the same block; the agent prefers reusing an existing block over creating a new one.`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-12`,children:_jsx(_components.p,{children:`The unique identifier of the project in which the tree should be created`})}),_jsx(ParamField,{path:`name`,type:`string`,required:true,id:`param-name-7`,children:_jsx(_components.p,{children:`The name of the tree. IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Category Menu’, ‘Footer Navigation’, ‘Support Links’). Never use PascalCase or concatenated words - the platform derives the URL slug and API type name from this value.`})}),_jsx(ParamField,{path:`description`,type:`string`,required:true,id:`param-description-2`,children:_jsx(_components.p,{children:`A brief description of the tree’s purpose (e.g., ‘Main category navigation for headers’).`})}),_jsx(ParamField,{path:`storageId`,type:`string`,required:true,id:`param-storage-id-2`,children:_jsx(_components.p,{children:`Must reference a valid storage ID from the available storages.`})}),_jsx(ParamField,{path:`nestedBlockId`,type:`string`,required:true,id:`param-nested-block-id-2`,children:_jsx(_components.p,{children:`Must reference a valid block ID from the available blocks. This block will be used to render each item in the tree.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`update_tree`,children:_jsx(_components.code,{children:`update_tree`})}),`\n`,_jsxs(_components.p,{children:[`Configure an existing tree’s query conditions - the business-logic filters that narrow which records the tree includes. Use it after `,_jsx(_components.code,{children:`create_tree`}),` to make a tree more specific.`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-13`,children:_jsx(_components.p,{children:`The unique identifier of the project containing the tree`})}),_jsx(ParamField,{path:`treeId`,type:`string`,required:true,id:`param-tree-id`,children:_jsx(_components.p,{children:`The unique identifier of the tree to modify`})}),_jsxs(ParamField,{path:`conditions`,type:`object[]`,id:`param-conditions-1`,children:[_jsx(_components.p,{children:`Optional array of query condition operations. Conditions filter which records appear in the tree.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`operation`,type:`enum`,required:true,id:`param-operation-4`,children:_jsxs(_components.p,{children:[`The operation for this condition: “add” to add a new condition, “delete” to remove by index\nOne of: `,_jsx(_components.code,{children:`add`}),`, `,_jsx(_components.code,{children:`delete`})]})}),_jsx(ParamField,{path:`index`,type:`number`,id:`param-index-1`,children:_jsx(_components.p,{children:`Required for “delete” operation. The index of the condition to delete (0-based)`})}),_jsxs(ParamField,{path:`before`,type:`object`,id:`param-before-1`,children:[_jsx(_components.p,{children:`Required for simple comparison conditions. The left-hand side of the condition (field to check). Omit for pure group conditions.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`type`,type:`enum`,required:true,id:`param-type-5`,children:_jsxs(_components.p,{children:[`Source type: “storageSchemaField”\nOne of: `,_jsx(_components.code,{children:`storageSchemaField`})]})}),_jsx(ParamField,{path:`reference`,type:`string`,required:true,id:`param-reference-3`,children:_jsx(_components.p,{children:`UUID of the field to compare`})}),_jsx(ParamField,{path:`path`,type:`string`,id:`param-path-3`,children:_jsx(_components.p,{children:`Optional path if the field is composite (e.g., “name.en”)`})})]})]}),_jsx(ParamField,{path:`operator`,type:`enum`,id:`param-operator-1`,children:_jsxs(_components.p,{children:[`Required for simple comparison conditions. The comparison operator. Omit for pure group conditions.\nOne of: `,_jsx(_components.code,{children:`like`}),`, `,_jsx(_components.code,{children:`notLike`}),`, `,_jsx(_components.code,{children:`equals`}),`, `,_jsx(_components.code,{children:`notEquals`}),`, `,_jsx(_components.code,{children:`gt`}),`, `,_jsx(_components.code,{children:`gte`}),`, `,_jsx(_components.code,{children:`lt`}),`, `,_jsx(_components.code,{children:`lte`})]})}),_jsxs(ParamField,{path:`after`,type:`object`,id:`param-after-1`,children:[_jsx(_components.p,{children:`Required for simple comparison conditions. The right-hand side of the condition (value to compare against). Omit for pure group conditions.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`type`,type:`enum`,required:true,id:`param-type-6`,children:_jsxs(_components.p,{children:[`Value type: “value” (static value)\nOne of: `,_jsx(_components.code,{children:`value`})]})}),_jsx(ParamField,{path:`reference`,type:`string`,required:true,id:`param-reference-4`,children:_jsx(_components.p,{children:`the static value`})})]})]}),_jsx(ParamField,{path:`rules`,type:`any[]`,id:`param-rules-1`,children:_jsx(_components.p,{children:`Array of nested conditions for complex AND/OR logic. Required for pure group conditions. Each rule follows the same structure and can itself be either a simple condition or a group.`})}),_jsx(ParamField,{path:`group`,type:`enum`,id:`param-group-1`,children:_jsxs(_components.p,{children:[`Required when rules are present. Logical operator (“and” or “or”) for combining nested rules.\nOne of: `,_jsx(_components.code,{children:`and`}),`, `,_jsx(_components.code,{children:`or`})]})})]})]}),_jsx(ParamField,{path:`active`,type:`boolean`,id:`param-active-2`,children:_jsx(_components.p,{children:`Optional. Set whether the tree is active (enabled) or inactive (disabled). When inactive, the tree cannot be used in the storefront.`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`storage-management`,children:`Storage Management`}),`\n`,_jsx(Heading,{level:`4`,id:`list_storages`,children:_jsx(_components.code,{children:`list_storages`})}),`\n`,_jsx(_components.p,{children:`Data schemas with their fields`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-14`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`create_storage`,children:_jsx(_components.code,{children:`create_storage`})}),`\n`,_jsxs(_components.p,{children:[`Create a new `,_jsx(_components.a,{href:`/data-integration/data-storages`,children:`Data Storage`}),` with a name and schema type.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`default`}),` creates a regular Content storage for content or reference data.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`commerce`}),` creates a Products storage for product catalog data and adds commerce-specific system fields for variants, prices, parent keys, and options.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`After creating the storage, use `,_jsx(_components.code,{children:`update_storage`}),` to add custom fields.`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-15`,children:_jsx(_components.p,{children:`The unique identifier of the project in which the storage should be created`})}),_jsx(ParamField,{path:`name`,type:`string`,required:true,id:`param-name-8`,children:_jsx(_components.p,{children:`The name of the storage. IMPORTANT: Always use normal capitalized words with spaces (e.g., ‘Products’, ‘Blog Articles’, ‘Brands’). Never use PascalCase or concatenated words.`})}),_jsx(ParamField,{path:`type`,type:`enum`,required:true,id:`param-type-7`,children:_jsxs(_components.p,{children:[`Storage type. Use “default” for regular content/reference data and “commerce” for product catalog data with commerce-specific default fields.\nOne of: `,_jsx(_components.code,{children:`default`}),`, `,_jsx(_components.code,{children:`commerce`})]})})]}),`\n`,_jsx(Heading,{level:`4`,id:`update_storage`,children:_jsx(_components.code,{children:`update_storage`})}),`\n`,_jsxs(_components.p,{children:[`Update an existing `,_jsx(_components.a,{href:`/data-integration/data-storages`,children:`Data Storage`}),` by adding, renaming, or removing top-level fields. Removing a field deletes the values stored in it, which is why this tool is marked as destroying data. Field type is fixed at creation - to change a field’s type you delete and recreate it.`]}),`\n`,_jsx(_components.p,{children:`Multiple operations can be batched in a single call and run sequentially, so a later operation can target a field added or renamed earlier in the same call.`}),`\n`,_jsxs(_components.p,{children:[`The tool works on top-level fields only - nested sub-fields of composite types aren’t editable through this tool. To create a new storage from scratch through MCP, use `,_jsx(_components.code,{children:`create_storage`}),`.`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-16`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`storageId`,type:`string`,required:true,id:`param-storage-id-3`,children:_jsx(_components.p,{children:`Storage ID`})}),_jsxs(ParamField,{path:`fields`,type:`object[]`,required:true,id:`param-fields-2`,children:[_jsx(_components.p,{children:`Ordered list of field operations. Operations run sequentially, so later operations can target fields created or renamed earlier in the same call.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`operation`,type:`enum`,required:true,id:`param-operation-5`,children:_jsxs(_components.p,{children:[`Field operation: “add” creates a new top-level storage field, “update” modifies an existing field, “delete” removes one.\nOne of: `,_jsx(_components.code,{children:`add`}),`, `,_jsx(_components.code,{children:`update`}),`, `,_jsx(_components.code,{children:`delete`})]})}),_jsx(ParamField,{path:`fieldId`,type:`string`,id:`param-field-id`,children:_jsx(_components.p,{children:`Existing storage field ID to update or delete. Prefer this when available from list_storages.`})}),_jsx(ParamField,{path:`fieldName`,type:`string`,id:`param-field-name`,children:_jsx(_components.p,{children:`Existing storage field name to update or delete when fieldId is unknown. Only top-level field names are supported.`})}),_jsx(ParamField,{path:`name`,type:`string`,id:`param-name-9`,children:_jsx(_components.p,{children:`New field name for “add”, or the replacement name when renaming an existing field during “update”.`})}),_jsx(ParamField,{path:`type`,type:`string`,id:`param-type-8`,children:_jsx(_components.p,{children:`Data type key for “add” operations, e.g. “string”, “integer”, “boolean”, or a custom composite type key. If relation is provided and type is omitted, “any” is used automatically.`})}),_jsx(ParamField,{path:`description`,type:`string`,id:`param-description-3`,children:_jsx(_components.p,{children:`Optional field description for add or update operations.`})}),_jsx(ParamField,{path:`isArray`,type:`boolean`,id:`param-is-array-1`,children:_jsx(_components.p,{children:`Whether the field stores multiple values. For add operations, defaults to false.`})}),_jsx(ParamField,{path:`sharedAcrossVariants`,type:`boolean`,id:`param-shared-across-variants`,children:_jsx(_components.p,{children:`Whether the field is shared across variants. For add operations, defaults to false.`})}),_jsx(ParamField,{path:`isTranslatable`,type:`boolean`,id:`param-is-translatable`,children:_jsx(_components.p,{children:`Whether the field is translatable. For add operations, defaults to false.`})}),_jsx(ParamField,{path:`isScoped`,type:`boolean`,id:`param-is-scoped`,children:_jsx(_components.p,{children:`Whether the field is scope-aware. For add operations, defaults to false.`})}),_jsxs(ParamField,{path:`relation`,type:`object`,id:`param-relation`,children:[_jsx(_components.p,{children:`Optional relation configuration. The source field must already exist in the current storage.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`sourceFieldName`,type:`string`,required:true,id:`param-source-field-name`,children:_jsx(_components.p,{children:`Source field name in the current storage used as the relation key`})}),_jsx(ParamField,{path:`sourceFieldPath`,type:`string`,id:`param-source-field-path`,children:_jsx(_components.p,{children:`Optional path in the source field when it is composite, e.g. “code”.`})}),_jsx(ParamField,{path:`targetStorageId`,type:`string`,required:true,id:`param-target-storage-id`,children:_jsx(_components.p,{children:`Target storage ID`})}),_jsx(ParamField,{path:`targetFieldName`,type:`string`,required:true,id:`param-target-field-name`,children:_jsx(_components.p,{children:`Field name in the target storage to match against`})}),_jsx(ParamField,{path:`targetFieldPath`,type:`string`,id:`param-target-field-path`,children:_jsx(_components.p,{children:`Optional path in the target field when it is composite, e.g. “slug”.`})})]})]}),_jsx(ParamField,{path:`mockModule`,type:`string`,id:`param-mock-module`,children:_jsx(_components.p,{children:`Optional mock generator module, e.g. “faker.datatype.string”.`})}),_jsx(ParamField,{path:`mockModuleParams`,type:`string`,id:`param-mock-module-params`,children:_jsx(_components.p,{children:`Optional mock generator parameters string.`})}),_jsx(ParamField,{path:`mockMin`,type:`integer`,id:`param-mock-min`,children:_jsx(_components.p,{children:`Optional minimum array size for generated mock data.`})}),_jsx(ParamField,{path:`mockMax`,type:`integer`,id:`param-mock-max`,children:_jsx(_components.p,{children:`Optional maximum array size for generated mock data.`})})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`project-configuration`,children:`Project Configuration`}),`\n`,_jsxs(_components.p,{children:[`Explore the context hierarchy of your project. `,_jsx(_components.code,{children:`get_project`}),` returns the whole configuration in one call: the project, its scopes with their regions and locales, and its domains with each domain’s scope, region, and locale resolved into names rather than left as IDs. The `,_jsx(_components.code,{children:`list_*`}),` tools enumerate one resource kind at a time.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Domains`}),` map a scope, region, and locale combination to URL routing.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Scopes`}),` are data segmentation layers (e.g., B2B vs B2C). Every project has at least the default `,_jsx(_components.code,{children:`public`}),` scope. A scoped field can return different values per scope - for example, `,_jsx(_components.code,{children:`true`}),` in scope A and `,_jsx(_components.code,{children:`false`}),` in scope B.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Regions`}),` are subdivisions of a scope (e.g., EU, US, APAC). Each region holds a currency and one or more locales, determining which prices to show.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Locales`}),` determine which translation to return for translatable fields. If a field is set as translatable, the response value matches the translation for that locale. `,_jsx(_components.code,{children:`list_locales`}),` is the complete list: a locale that no region exposes appears there and not in `,_jsx(_components.code,{children:`get_project`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`4`,id:`get_project`,children:_jsx(_components.code,{children:`get_project`})}),`\n`,_jsxs(_components.p,{children:[`How one project is configured, in a single call: the project itself, its scopes with their regions and locales, and its domains with each domain’s scope, region, and locale resolved into names and keys rather than left as IDs. Start here when you already know which project you are working on, and reach for `,_jsx(_components.code,{children:`list_projects`}),` only when you do not.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`fetchApi`}),` carries the hostname and the version token that addresses this environment. Send the token as the `,_jsx(_components.code,{children:`fs-version`}),` header on `,_jsx(_components.a,{href:`/reference/fetch-api`,children:`Fetch API`}),` calls: without it the Fetch API serves the public environment. `,_jsx(_components.code,{children:`environments`}),` lists the project’s other stages, each with its own version token, and a stage only carries a token when one is set - the public environment has none, because sending no `,_jsx(_components.code,{children:`fs-version`}),` header is how a caller reaches it.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`list_locales`}),` remains the complete locale list. A locale that no region exposes appears there and not here.`]}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-17`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`list_domains`,children:_jsx(_components.code,{children:`list_domains`})}),`\n`,_jsx(_components.p,{children:`List all domains configured in a project`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-18`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`list_scopes`,children:_jsx(_components.code,{children:`list_scopes`})}),`\n`,_jsx(_components.p,{children:`List all scopes in a project`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-19`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`list_regions`,children:_jsx(_components.code,{children:`list_regions`})}),`\n`,_jsx(_components.p,{children:`List all regions within a scope`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-20`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`scopeId`,type:`string`,required:true,id:`param-scope-id`,children:_jsx(_components.p,{children:`Scope ID`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`list_locales`,children:_jsx(_components.code,{children:`list_locales`})}),`\n`,_jsx(_components.p,{children:`List all configured locales in a project`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-21`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`3`,id:`browse-data`,children:`Browse Data`}),`\n`,_jsx(_components.p,{children:`Search and inspect the actual data in your project - both transformed storage records and raw feed records from integrations.`}),`\n`,_jsx(Heading,{level:`4`,id:`list_storage_record_examples`,children:_jsx(_components.code,{children:`list_storage_record_examples`})}),`\n`,_jsxs(_components.p,{children:[`List up to five example records from a storage, each carrying the system fields the record has (`,_jsx(_components.code,{children:`key`}),`, `,_jsx(_components.code,{children:`active`}),`, `,_jsx(_components.code,{children:`parentKey`}),`, `,_jsx(_components.code,{children:`position`}),`, plus `,_jsx(_components.code,{children:`price`}),` and `,_jsx(_components.code,{children:`options`}),` on Products storages). Use it to learn a storage’s real shape - slugs, keys, field values - before writing query conditions against it.`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-22`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`storageId`,type:`string`,required:true,id:`param-storage-id-4`,children:_jsx(_components.p,{children:`ID of the storage to read - usually the one connected to the block, listing or page. list_blocks, list_listings, list_trees and list_pages show each resource’s storageId.`})}),_jsx(ParamField,{path:`fields`,type:`string[]`,id:`param-fields-3`,children:_jsx(_components.p,{children:`Storage fields to return next to the system fields, e.g. [“slug”] for a page or [“categoryId”] for a listing parameter. Only records with a value in every one of them are returned. System fields come with every example.`})}),_jsx(ParamField,{path:`variants`,type:`boolean`,id:`param-variants`,children:_jsx(_components.p,{children:`Commerce storages only: true returns variant records instead of parent products. Default false.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`search_storage_records`,children:_jsx(_components.code,{children:`search_storage_records`})}),`\n`,_jsxs(_components.p,{children:[`Search records in a storage to see the transformed values blocks and listings serve to the frontend. Useful for verifying data after a sync, debugging unexpected output, or pulling a realistic sample for a composer dry-run with `,_jsx(_components.code,{children:`preview_composer_value`}),` or `,_jsx(_components.code,{children:`preview_composer_record`}),`. Filter by scope, region, and locale to see contextualized values like scoped pricing or translated content.`]}),`\n`,_jsxs(_components.p,{children:[`By default `,_jsx(_components.code,{children:`records[]`}),` contains bare payload objects - exactly what the user stored, no wrapper. Pass `,_jsx(_components.code,{children:`includeMetadata: true`}),` to get each record wrapped with its `,_jsx(_components.code,{children:`id`}),`, `,_jsx(_components.code,{children:`sourceId`}),`, `,_jsx(_components.code,{children:`parentSourceId`}),`, `,_jsx(_components.code,{children:`createdAt`}),`, and `,_jsx(_components.code,{children:`updatedAt`}),`. Opt in when you need to know when a record was updated/created or walk parent–child relationships in a follow-up call.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`metadata.parentSourceId`}),` is the storage-tree parent - distinct from any `,_jsx(_components.code,{children:`parentKey`}),` a user happens to have inside their own payload. That namespacing is why metadata is opt-in rather than always-on.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`availableFilters`}),` and `,_jsx(_components.code,{children:`metaSearchResult`}),` (pagination + total count) are always returned alongside `,_jsx(_components.code,{children:`records[]`}),`, regardless of `,_jsx(_components.code,{children:`includeMetadata`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Omit `,_jsx(_components.code,{children:`conditions`}),` entirely to return all records.`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-23`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`storageId`,type:`string`,required:true,id:`param-storage-id-5`,children:_jsx(_components.p,{children:`Storage ID`})}),_jsx(ParamField,{path:`request`,type:`object`,required:true,id:`param-request`,children:_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`searchVariants`,type:`boolean`,id:`param-search-variants`,children:_jsx(_components.p,{children:`Search product variants instead of parent products. Only applicable to commerce-type storages.`})}),_jsxs(ParamField,{path:`conditions`,type:`object`,id:`param-conditions-2`,children:[_jsxs(_components.p,{children:[`Filter conditions. Pass an `,_jsx(_components.code,{children:`and`}),` or `,_jsx(_components.code,{children:`or`}),` array of {field, operator, value} items - NOT a field-keyed object. Example: {“and”: [{“field”: “slug”, “operator”: “like”, “value”: “polizei”}]}. The field-keyed shape {“slug”: {“like”: ”…”}} is silently ignored by the backend and returns all records.`]}),_jsxs(Expandable,{title:`Fields`,children:[_jsxs(ParamField,{path:`and`,type:`object[]`,id:`param-and`,children:[_jsx(_components.p,{children:`All items must match (logical AND).`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`field`,type:`string`,required:true,id:`param-field`,children:_jsx(_components.p,{children:`Field name to filter on, as it appears in availableFilters (e.g. “slug”, “name”, “parentKey”).`})}),_jsx(ParamField,{path:`operator`,type:`enum`,required:true,id:`param-operator-2`,children:_jsxs(_components.p,{children:[`Comparison operator. “like”/“notLike” accept raw substrings (no SQL wildcards - the backend wraps them). “empty” matches a missing, null or empty-string value, “notEmpty” the opposite.\nOne of: `,_jsx(_components.code,{children:`equals`}),`, `,_jsx(_components.code,{children:`notEquals`}),`, `,_jsx(_components.code,{children:`gt`}),`, `,_jsx(_components.code,{children:`lt`}),`, `,_jsx(_components.code,{children:`gte`}),`, `,_jsx(_components.code,{children:`lte`}),`, `,_jsx(_components.code,{children:`like`}),`, `,_jsx(_components.code,{children:`notLike`}),`, `,_jsx(_components.code,{children:`empty`}),`, `,_jsx(_components.code,{children:`notEmpty`})]})}),_jsx(ParamField,{path:`value`,type:`string | number | boolean | string[]`,id:`param-value`,children:_jsx(_components.p,{children:`Value to compare against. Strings, numbers, booleans, or string arrays (for IN-style matches). Not needed for “empty” and “notEmpty”.`})})]})]}),_jsxs(ParamField,{path:`or`,type:`object[]`,id:`param-or`,children:[_jsx(_components.p,{children:`Any item must match (logical OR).`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`field`,type:`string`,required:true,id:`param-field-1`,children:_jsx(_components.p,{children:`Field name to filter on, as it appears in availableFilters (e.g. “slug”, “name”, “parentKey”).`})}),_jsx(ParamField,{path:`operator`,type:`enum`,required:true,id:`param-operator-3`,children:_jsxs(_components.p,{children:[`Comparison operator. “like”/“notLike” accept raw substrings (no SQL wildcards - the backend wraps them). “empty” matches a missing, null or empty-string value, “notEmpty” the opposite.\nOne of: `,_jsx(_components.code,{children:`equals`}),`, `,_jsx(_components.code,{children:`notEquals`}),`, `,_jsx(_components.code,{children:`gt`}),`, `,_jsx(_components.code,{children:`lt`}),`, `,_jsx(_components.code,{children:`gte`}),`, `,_jsx(_components.code,{children:`lte`}),`, `,_jsx(_components.code,{children:`like`}),`, `,_jsx(_components.code,{children:`notLike`}),`, `,_jsx(_components.code,{children:`empty`}),`, `,_jsx(_components.code,{children:`notEmpty`})]})}),_jsx(ParamField,{path:`value`,type:`string | number | boolean | string[]`,id:`param-value-1`,children:_jsx(_components.p,{children:`Value to compare against. Strings, numbers, booleans, or string arrays (for IN-style matches). Not needed for “empty” and “notEmpty”.`})})]})]})]})]}),_jsxs(ParamField,{path:`sorting`,type:`object[]`,id:`param-sorting`,children:[_jsx(_components.p,{children:`Sort order for results as array of {field, direction: ‘ASC’|‘DESC’}.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`field`,type:`string`,required:true,id:`param-field-2`}),_jsx(ParamField,{path:`direction`,type:`enum`,required:true,id:`param-direction`,children:_jsxs(_components.p,{children:[`One of: `,_jsx(_components.code,{children:`ASC`}),`, `,_jsx(_components.code,{children:`DESC`})]})})]})]}),_jsx(ParamField,{path:`page`,type:`integer`,id:`param-page`,children:_jsx(_components.p,{children:`Page number for pagination (1-based). Defaults to 1.`})}),_jsx(ParamField,{path:`limit`,type:`integer`,id:`param-limit`,children:_jsx(_components.p,{children:`Maximum records to return per page. Defaults to server limit.`})})]})}),_jsx(ParamField,{path:`scopeId`,type:`string`,id:`param-scope-id-1`,children:_jsx(_components.p,{children:`Scope ID for scope-contextualized field values (e.g., B2B pricing). Falls back to default scope if omitted.`})}),_jsx(ParamField,{path:`regionId`,type:`string`,id:`param-region-id`,children:_jsx(_components.p,{children:`Region ID within the scope for region-specific values. Falls back to default region if omitted.`})}),_jsx(ParamField,{path:`localeId`,type:`string`,id:`param-locale-id`,children:_jsx(_components.p,{children:`Locale ID for translated field values (e.g., German product descriptions). Falls back to default locale if omitted.`})}),_jsx(ParamField,{path:`includeMetadata`,type:`boolean`,default:`false`,id:`param-include-metadata`,children:_jsx(_components.p,{children:`Include storage metadata (id, sourceId, parentSourceId, createdAt, updatedAt) on each record. Default false returns the bare payload - what the user actually stored - under records[]. Opt in when you need to reference a record by its sourceId, parentSourceId, or id, e.g. for follow-up tool calls or debugging tree relationships.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`search_feed_records`,children:_jsx(_components.code,{children:`search_feed_records`})}),`\n`,_jsx(_components.p,{children:`Search feed records from an integration to see the connector-normalized data before the composer transforms it. Every commerce platform names fields differently (Shopify: flat keys; Shopware: dot-notation; commercetools: deeply nested objects), so inspecting an actual feed record is the only reliable way to know what’s available and how it’s shaped.`}),`\n`,_jsxs(_components.p,{children:[`Same metadata contract as `,_jsx(_components.code,{children:`search_storage_records`}),`: bare payloads by default, full envelope (`,_jsx(_components.code,{children:`id`}),`, `,_jsx(_components.code,{children:`sourceId`}),`, `,_jsx(_components.code,{children:`parentSourceId`}),`, `,_jsx(_components.code,{children:`createdAt`}),`, `,_jsx(_components.code,{children:`updatedAt`}),`) when you pass `,_jsx(_components.code,{children:`includeMetadata: true`}),`. `,_jsx(_components.code,{children:`availableFilters`}),` and `,_jsx(_components.code,{children:`metaSearchResult`}),` are always returned.`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`feedId`,type:`string`,required:true,id:`param-feed-id`,children:_jsx(_components.p,{children:`Feed ID`})}),_jsx(ParamField,{path:`integrationId`,type:`string`,required:true,id:`param-integration-id`,children:_jsx(_components.p,{children:`Integration ID`})}),_jsx(ParamField,{path:`channelId`,type:`string`,id:`param-channel-id`,children:_jsx(_components.p,{children:`Integration channel ID. Omit to use the integration’s default channel. Read the ids from list_integrations.`})}),_jsx(ParamField,{path:`translationId`,type:`string`,id:`param-translation-id`,children:_jsx(_components.p,{children:`Integration translation ID, which belongs to a channel. Omit to use the chosen channel’s first translation.`})}),_jsx(ParamField,{path:`sourceId`,type:`string`,id:`param-source-id`,children:_jsxs(_components.p,{children:[`Filter by a specific record source ID to find a single record. Finds a parent record unless `,_jsx(_components.code,{children:`variants`}),` is set. Use this for targeted lookups when you know the record identifier.`]})}),_jsx(ParamField,{path:`parentSourceId`,type:`string`,id:`param-parent-source-id`,children:_jsx(_components.p,{children:`Filter by parent record source ID to find its variants (e.g., all variants of a main product). Only applicable to feeds with parent-child relationships. Implies a variant search.`})}),_jsx(ParamField,{path:`variants`,type:`boolean`,id:`param-variants-1`,children:_jsxs(_components.p,{children:[`Commerce feeds only: true makes `,_jsx(_components.code,{children:`sourceId`}),` look up a variant record instead of a parent. Not needed when filtering by `,_jsx(_components.code,{children:`parentSourceId`}),`, which always searches variants.`]})}),_jsx(ParamField,{path:`includeMetadata`,type:`boolean`,default:`false`,id:`param-include-metadata-1`,children:_jsx(_components.p,{children:`Include storage metadata (id, sourceId, parentSourceId, createdAt, updatedAt) on each record. Default false returns the bare payload - what the user actually stored - under records[]. Opt in when you need to reference a record by its sourceId, parentSourceId, or id, e.g. for follow-up tool calls or debugging tree relationships.`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`integrations`,children:`Integrations`}),`\n`,_jsxs(_components.p,{children:[`Discover and inspect connected source systems and their feed schemas. The typical workflow is `,_jsx(_components.code,{children:`list_integrations`}),` → pick a feed → `,_jsx(_components.code,{children:`get_integration_feed`}),` → use the field paths in `,_jsx(_components.code,{children:`update_data_sync_value_configs`}),` or composer previews.`]}),`\n`,_jsxs(_components.p,{children:[`Integrations belong to the Team rather than to a single project, so both tools here take no project and return the same results wherever you are working. The same holds for `,_jsx(_components.code,{children:`search_feed_records`}),` in Browse Data, which reads a feed rather than a storage.`]}),`\n`,_jsx(Heading,{level:`4`,id:`list_integrations`,children:_jsx(_components.code,{children:`list_integrations`})}),`\n`,_jsx(_components.p,{children:`Connected source systems with their channels and a compact feed inventory (id and name). Integrations belong to the Team, so this takes no project and returns the same list whichever project you are working in.`}),`\n`,_jsx(_components.p,{children:`Takes no parameters.`}),`\n`,_jsx(Heading,{level:`4`,id:`get_integration_feed`,children:_jsx(_components.code,{children:`get_integration_feed`})}),`\n`,_jsxs(_components.p,{children:[`Get the full schema for a single integration feed by feed ID. Returns the integration metadata, feed metadata (including `,_jsx(_components.code,{children:`type`}),`, `,_jsx(_components.code,{children:`token`}),`, `,_jsx(_components.code,{children:`urls`}),`, `,_jsx(_components.code,{children:`methods`}),`, `,_jsx(_components.code,{children:`configurations`}),`, and `,_jsx(_components.code,{children:`refreshSupported`}),`), and a flat field list in dot-path notation with types - for example, `,_jsx(_components.code,{children:`title (string)`}),`, `,_jsx(_components.code,{children:`manufacturer (object)`}),`, `,_jsx(_components.code,{children:`manufacturer.name (string)`}),`. The flat representation is what you copy into composer configs.`]}),`\n`,_jsx(_components.p,{children:`If the feed ID isn’t found, the tool returns the list of available feed IDs across the Team’s integrations so the agent can recover without a separate discovery call.`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`feedId`,type:`string`,required:true,id:`param-feed-id-1`,children:_jsx(_components.p,{children:`Integration feed ID`})})}),`\n`,_jsx(Heading,{level:`3`,id:`data-syncs`,children:`Data Syncs`}),`\n`,_jsx(Heading,{level:`4`,id:`list_data_syncs`,children:_jsx(_components.code,{children:`list_data_syncs`})}),`\n`,_jsx(_components.p,{children:`List all data sync configurations, showing which integrations feed into which storages`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-24`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`create_data_sync`,children:_jsx(_components.code,{children:`create_data_sync`})}),`\n`,_jsxs(_components.p,{children:[`Create a data sync shell that connects one integration feed to one storage with a name, feed, storage, and optional scope/channel/locale mappings. New data syncs are enabled on creation; call `,_jsx(_components.code,{children:`get_data_sync`}),`, then `,_jsx(_components.code,{children:`update_data_sync_value_configs`}),`, to configure field value mappings`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-25`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`name`,type:`string`,required:true,id:`param-name-10`,children:_jsx(_components.p,{children:`The name of the data sync. Always use normal capitalized words with spaces (e.g., ‘Sync Products’, ‘Sync Categories’).`})}),_jsx(ParamField,{path:`feedId`,type:`string`,required:true,id:`param-feed-id-2`,children:_jsx(_components.p,{children:`Integration feed ID`})}),_jsx(ParamField,{path:`storageId`,type:`string`,required:true,id:`param-storage-id-6`,children:_jsx(_components.p,{children:`Storage ID`})}),_jsxs(ParamField,{path:`mappings`,type:`object[]`,id:`param-mappings`,children:[_jsx(_components.p,{children:`Optional scope/channel/locale mappings. This is not the storage field value-composer configuration.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`scopeId`,type:`string`,required:true,id:`param-scope-id-2`,children:_jsx(_components.p,{children:`Project scope ID`})}),_jsx(ParamField,{path:`channelId`,type:`string`,required:true,id:`param-channel-id-1`,children:_jsx(_components.p,{children:`Integration channel ID`})}),_jsxs(ParamField,{path:`locales`,type:`object[]`,id:`param-locales`,children:[_jsx(_components.p,{children:`Locale to integration translation mappings for this scope and channel. Leave empty when the scope has no locale mappings.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`localeId`,type:`string`,required:true,id:`param-locale-id-1`,children:_jsx(_components.p,{children:`Project locale ID`})}),_jsx(ParamField,{path:`translationId`,type:`string`,required:true,id:`param-translation-id-1`,children:_jsx(_components.p,{children:`Integration translation ID`})})]})]})]})]})]}),`\n`,_jsx(Heading,{level:`4`,id:`get_data_sync`,children:_jsx(_components.code,{children:`get_data_sync`})}),`\n`,_jsx(_components.p,{children:`Get a single data sync with full field-level detail including value-composer configurations`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-26`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`dataSyncId`,type:`string`,required:true,id:`param-data-sync-id`,children:_jsx(_components.p,{children:`Data sync ID`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`update_data_sync_value_configs`,children:_jsx(_components.code,{children:`update_data_sync_value_configs`})}),`\n`,_jsx(_components.p,{children:`Update data sync value composer field configurations by field ID`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-27`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`dataSyncId`,type:`string`,required:true,id:`param-data-sync-id-1`,children:_jsx(_components.p,{children:`Data sync ID`})}),_jsxs(ParamField,{path:`fieldUpdates`,type:`object[]`,required:true,id:`param-field-updates`,children:[_jsx(_components.p,{children:`List of field-level config replacements. Each entry replaces one target field config by fieldId, without requiring the caller to pass all data sync fields.`}),_jsxs(Expandable,{title:`Fields`,children:[_jsx(ParamField,{path:`fieldId`,type:`string`,required:true,id:`param-field-id-1`,children:_jsx(_components.p,{children:`Storage field UUID from get_data_sync.storage.fields[].id (supports nested composite fields).`})}),_jsx(ParamField,{path:`config`,type:`object`,required:true,id:`param-config`,children:_jsx(_components.p,{children:`Full replacement config for this field only. Valid examples: {“source”:“data-field”,“field”:“name”}, {“source”:“static”,“value”:“Default”}, {“source”:“composed”,“composition”:{“type”:“object”,“properties”:{“label”:{“source”:“data-field”,“field”:“manufacturer.name”}}}}.`})})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`value-composer`,children:`Value Composer`}),`\n`,_jsx(Heading,{level:`4`,id:`list_composer_operations`,children:_jsx(_components.code,{children:`list_composer_operations`})}),`\n`,_jsx(_components.p,{children:`List all available value-composer operations with type, input/output shapes, and documentation`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-28`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`preview_composer_value`,children:_jsx(_components.code,{children:`preview_composer_value`})}),`\n`,_jsx(_components.p,{children:`Preview a computed value by running a single value-composer config against a sample record (dry-run)`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-29`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`config`,type:`object`,required:true,id:`param-config-1`,children:_jsx(_components.p,{children:`Value-composer config object. Common valid examples: {“source”:“data-field”,“field”:“name”}, {“source”:“static”,“value”:“Default”}, {“source”:“composed”,“composition”:{“type”:“object”,“properties”:{“label”:{“source”:“data-field”,“field”:“manufacturer.name”}}}}. Use list_composer_operations to discover operation-specific composition schemas.`})}),_jsx(ParamField,{path:`record`,type:`object`,required:true,id:`param-record`,children:_jsx(_components.p,{children:`Sample input record payload used during the dry run. You can source realistic examples from search_feed_records or search_storage_records.`})}),_jsx(ParamField,{path:`debug`,type:`boolean`,default:`false`,id:`param-debug`,children:_jsx(_components.p,{children:`Include intermediate transformation steps in the response for troubleshooting composition chains. Useful when a multi-step composition produces unexpected results and you need to see which operation went wrong.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`preview_composer_record`,children:_jsx(_components.code,{children:`preview_composer_record`})}),`\n`,_jsx(_components.p,{children:`Preview a full transformed record by running all storage-field mapping configs against a sample source record`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-30`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`storageId`,type:`string`,required:true,id:`param-storage-id-7`,children:_jsx(_components.p,{children:`Storage ID`})}),_jsx(ParamField,{path:`recordConfig`,type:`object`,required:true,id:`param-record-config`,children:_jsx(_components.p,{children:`Object mapping storage field names/keys to value-composer configs, e.g. {“title”:{“source”:“data-field”,“field”:“name”},“seoTitle”:{“source”:“static”,“value”:“Fallback”},“manufacturer”:{“source”:“composed”,“composition”:{“type”:“object”,“properties”:{“label”:{“source”:“data-field”,“field”:“manufacturer.name”}}}}}.`})}),_jsx(ParamField,{path:`record`,type:`object`,required:true,id:`param-record-1`,children:_jsx(_components.p,{children:`Sample source record payload for the dry run. Prefer realistic records from search_feed_records or search_storage_records.`})}),_jsx(ParamField,{path:`debug`,type:`boolean`,default:`false`,id:`param-debug-1`,children:_jsx(_components.p,{children:`Include intermediate transformation steps in the response for troubleshooting composition chains. Useful when a multi-step composition produces unexpected results and you need to see which operation went wrong.`})})]}),`\n`,_jsxs(Heading,{level:`3`,id:`context-documents-plus`,children:[`Context Documents `,_jsx(`sup`,{children:`Plus`})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`Context document tools are part of `,_jsx(_components.strong,{children:`Frontic Studio`}),`, available on the `,_jsx(_components.strong,{children:`Plus plan`}),`.`]})}),`\n`,_jsx(_components.p,{children:`Manage skills, rules, commands, guides, and other context documents that provide instructions and knowledge to AI agents working with your project.`}),`\n`,_jsx(Heading,{level:`4`,id:`list_context_documents`,children:_jsx(_components.code,{children:`list_context_documents`})}),`\n`,_jsxs(_components.p,{children:[`List all active documents in a collection (`,_jsx(_components.code,{children:`skills`}),`, `,_jsx(_components.code,{children:`rules`}),`, `,_jsx(_components.code,{children:`commands`}),`, `,_jsx(_components.code,{children:`guides`}),`)`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-31`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`collection`,type:`enum`,required:true,id:`param-collection`,children:_jsxs(_components.p,{children:[`Document collection\nOne of: `,_jsx(_components.code,{children:`skills`}),`, `,_jsx(_components.code,{children:`rules`}),`, `,_jsx(_components.code,{children:`commands`}),`, `,_jsx(_components.code,{children:`guides`})]})})]}),`\n`,_jsx(Heading,{level:`4`,id:`get_context_document`,children:_jsx(_components.code,{children:`get_context_document`})}),`\n`,_jsx(_components.p,{children:`Fetch a single document by key, returning full markdown with YAML frontmatter`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`key`,type:`string`,required:true,id:`param-key`,children:_jsx(_components.p,{children:`Document key in format “collection/slug”`})}),_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-32`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`create_context_document`,children:_jsx(_components.code,{children:`create_context_document`})}),`\n`,_jsxs(_components.p,{children:[`Creates the document as a draft unless `,_jsx(_components.code,{children:`activate`}),` is true, which publishes it in the same call.`]}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-33`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`collection`,type:`enum`,required:true,id:`param-collection-1`,children:_jsxs(_components.p,{children:[`Document collection\nOne of: `,_jsx(_components.code,{children:`skills`}),`, `,_jsx(_components.code,{children:`rules`}),`, `,_jsx(_components.code,{children:`commands`}),`, `,_jsx(_components.code,{children:`guides`})]})}),_jsx(ParamField,{path:`title`,type:`string`,required:true,id:`param-title`,children:_jsx(_components.p,{children:`Document title`})}),_jsx(ParamField,{path:`description`,type:`string`,required:true,id:`param-description-4`,children:_jsx(_components.p,{children:`Document description`})}),_jsx(ParamField,{path:`content`,type:`string`,id:`param-content`,children:_jsx(_components.p,{children:`Initial document content in markdown format`})}),_jsx(ParamField,{path:`activate`,type:`boolean`,id:`param-activate`,children:_jsx(_components.p,{children:`Set to true to make this document active immediately. When false or omitted, the document starts as a draft.`})})]}),`\n`,_jsx(Heading,{level:`4`,id:`update_context_document`,children:_jsx(_components.code,{children:`update_context_document`})}),`\n`,_jsx(_components.p,{children:`Update a document’s metadata and/or content`}),`\n`,_jsxs(Expandable,{title:`Parameters`,children:[_jsx(ParamField,{path:`key`,type:`string`,required:true,id:`param-key-1`,children:_jsx(_components.p,{children:`Document key in format “collection/slug”`})}),_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-34`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})}),_jsx(ParamField,{path:`title`,type:`string`,id:`param-title-1`,children:_jsx(_components.p,{children:`New document title`})}),_jsx(ParamField,{path:`description`,type:`string`,id:`param-description-5`,children:_jsx(_components.p,{children:`New document description`})}),_jsx(ParamField,{path:`content`,type:`string`,id:`param-content-1`,children:_jsx(_components.p,{children:`New document content in markdown format`})}),_jsx(ParamField,{path:`status`,type:`enum`,id:`param-status`,children:_jsxs(_components.p,{children:[`Set the document status. “active” makes it available to agents, “draft” hides it, “inactive” disables it. Omit to keep the current status unchanged.\nOne of: `,_jsx(_components.code,{children:`active`}),`, `,_jsx(_components.code,{children:`draft`}),`, `,_jsx(_components.code,{children:`inactive`})]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`shopware-insights`,children:`Shopware Insights`}),`\n`,_jsx(_components.p,{children:`Read the store behind a project that has a Shopware integration configured. Both tools are read-only.`}),`\n`,_jsx(Heading,{level:`4`,id:`list_shopware_promotions`,children:_jsx(_components.code,{children:`list_shopware_promotions`})}),`\n`,_jsxs(_components.p,{children:[`List active promotions with their discounts and validity window (`,_jsx(_components.code,{children:`validFrom`}),`/`,_jsx(_components.code,{children:`validUntil`}),`, ISO-8601, `,_jsx(_components.code,{children:`null`}),` = unbounded)`]}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-35`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})}),`\n`,_jsx(Heading,{level:`4`,id:`list_shopware_sales_channels`,children:_jsx(_components.code,{children:`list_shopware_sales_channels`})}),`\n`,_jsx(_components.p,{children:`List sales channels with their configuration, theme configuration, languages, and currencies`}),`\n`,_jsx(Expandable,{title:`Parameters`,children:_jsx(ParamField,{path:`projectId`,type:`string`,required:true,id:`param-project-id-36`,children:_jsx(_components.p,{children:`Project ID in which the resource exists.`})})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":"css-variables"},"config":{},"pageMetadata":{"title":"Frontic Tools","icon":"microchip-ai","description":null,"href":"/reference/mcp/frontic-tools"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[]},{"title":"Setup","slug":"setup","depth":2,"children":[{"title":"Client-specific configuration","slug":"client-specific-configuration","depth":3,"children":[]}]},{"title":"Common Workflows","slug":"common-workflows","depth":2,"children":[]},{"title":"Example Prompts","slug":"example-prompts","depth":2,"children":[]},{"title":"Available Tools","slug":"available-tools","depth":2,"children":[{"title":"What each tool may do","slug":"what-each-tool-may-do","depth":3,"children":[]},{"title":"Project \u0026 Resource Discovery","slug":"project-\u0026-resource-discovery","depth":3,"children":[]},{"title":"list_projects","slug":"list_projects","depth":4,"children":[]},{"title":"preview_fetch_response","slug":"preview_fetch_response","depth":4,"children":[]},{"title":"delete_resource","slug":"delete_resource","depth":4,"children":[]},{"title":"Block Management","slug":"block-management","depth":3,"children":[]},{"title":"list_blocks","slug":"list_blocks","depth":4,"children":[]},{"title":"create_block","slug":"create_block","depth":4,"children":[]},{"title":"update_block","slug":"update_block","depth":4,"children":[]},{"title":"Listing Management","slug":"listing-management","depth":3,"children":[]},{"title":"list_listings","slug":"list_listings","depth":4,"children":[]},{"title":"create_listing","slug":"create_listing","depth":4,"children":[]},{"title":"update_listing","slug":"update_listing","depth":4,"children":[]},{"title":"Page Management","slug":"page-management","depth":3,"children":[]},{"title":"list_pages","slug":"list_pages","depth":4,"children":[]},{"title":"create_page","slug":"create_page","depth":4,"children":[]},{"title":"update_page","slug":"update_page","depth":4,"children":[]},{"title":"Tree Management","slug":"tree-management","depth":3,"children":[]},{"title":"list_trees","slug":"list_trees","depth":4,"children":[]},{"title":"create_tree","slug":"create_tree","depth":4,"children":[]},{"title":"update_tree","slug":"update_tree","depth":4,"children":[]},{"title":"Storage Management","slug":"storage-management","depth":3,"children":[]},{"title":"list_storages","slug":"list_storages","depth":4,"children":[]},{"title":"create_storage","slug":"create_storage","depth":4,"children":[]},{"title":"update_storage","slug":"update_storage","depth":4,"children":[]},{"title":"Project Configuration","slug":"project-configuration","depth":3,"children":[]},{"title":"get_project","slug":"get_project","depth":4,"children":[]},{"title":"list_domains","slug":"list_domains","depth":4,"children":[]},{"title":"list_scopes","slug":"list_scopes","depth":4,"children":[]},{"title":"list_regions","slug":"list_regions","depth":4,"children":[]},{"title":"list_locales","slug":"list_locales","depth":4,"children":[]},{"title":"Browse Data","slug":"browse-data","depth":3,"children":[]},{"title":"list_storage_record_examples","slug":"list_storage_record_examples","depth":4,"children":[]},{"title":"search_storage_records","slug":"search_storage_records","depth":4,"children":[]},{"title":"search_feed_records","slug":"search_feed_records","depth":4,"children":[]},{"title":"Integrations","slug":"integrations","depth":3,"children":[]},{"title":"list_integrations","slug":"list_integrations","depth":4,"children":[]},{"title":"get_integration_feed","slug":"get_integration_feed","depth":4,"children":[]},{"title":"Data Syncs","slug":"data-syncs","depth":3,"children":[]},{"title":"list_data_syncs","slug":"list_data_syncs","depth":4,"children":[]},{"title":"create_data_sync","slug":"create_data_sync","depth":4,"children":[]},{"title":"get_data_sync","slug":"get_data_sync","depth":4,"children":[]},{"title":"update_data_sync_value_configs","slug":"update_data_sync_value_configs","depth":4,"children":[]},{"title":"Value Composer","slug":"value-composer","depth":3,"children":[]},{"title":"list_composer_operations","slug":"list_composer_operations","depth":4,"children":[]},{"title":"preview_composer_value","slug":"preview_composer_value","depth":4,"children":[]},{"title":"preview_composer_record","slug":"preview_composer_record","depth":4,"children":[]},{"title":"Context Documents Plus","slug":"context-documents-plus","depth":3,"children":[]},{"title":"list_context_documents","slug":"list_context_documents","depth":4,"children":[]},{"title":"get_context_document","slug":"get_context_document","depth":4,"children":[]},{"title":"create_context_document","slug":"create_context_document","depth":4,"children":[]},{"title":"update_context_document","slug":"update_context_document","depth":4,"children":[]},{"title":"Shopware Insights","slug":"shopware-insights","depth":3,"children":[]},{"title":"list_shopware_promotions","slug":"list_shopware_promotions","depth":4,"children":[]},{"title":"list_shopware_sales_channels","slug":"list_shopware_sales_channels","depth":4,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"subdomain":"frontic","siteName":"Frontic Docs","title":"Frontic Tools - Frontic Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-01T22:42:14.322Z","originalFileLocation":"reference/mcp/frontic-tools.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"Frontic Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Frontic Tools - Frontic Docs\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Frontic Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.frontic.com/reference/mcp/frontic-tools\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://frontic.mintlify.app/_mintlify/api/og/v2?division=MCP+Server\u0026amp;title=Frontic+Tools\u0026amp;theme=206c460697bb939e13b9c293\u0026amp;signature=56534d3e9a9369f09e9631aa4ff22dd0bffa81573e0aa0af3b81e44233cf9a1b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Frontic Tools - Frontic Docs\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://frontic.mintlify.app/_mintlify/api/og/v2?division=MCP+Server\u0026amp;title=Frontic+Tools\u0026amp;theme=206c460697bb939e13b9c293\u0026amp;signature=56534d3e9a9369f09e9631aa4ff22dd0bffa81573e0aa0af3b81e44233cf9a1b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/frontic/J-QaW07dTW_FQ00e/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Frontic Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#a855f7\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.frontic.com/reference/mcp/frontic-tools\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/reference/mcp/frontic-tools.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.frontic.com/#organization\",\"name\":\"Frontic Docs\",\"url\":\"https://docs.frontic.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/frontic/QEEg-J3fIyHJ_Wyh/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=QEEg-J3fIyHJ_Wyh\u0026q=85\u0026s=36391b9f3546193a73f97d7b6ee40463\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.frontic.com#website\",\"name\":\"Frontic Docs\",\"url\":\"https://docs.frontic.com\",\"publisher\":{\"@id\":\"https://docs.frontic.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.frontic.com/reference/mcp/frontic-tools#webpage\",\"url\":\"https://docs.frontic.com/reference/mcp/frontic-tools\",\"name\":\"Frontic Tools\",\"dateModified\":\"2026-11-01T22:42:14.322Z\",\"isPartOf\":{\"@id\":\"https://docs.frontic.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.frontic.com/reference/mcp/frontic-tools#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.frontic.com/reference/mcp/frontic-tools#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Frontic Docs\",\"item\":\"https://docs.frontic.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frontic Tools\",\"item\":\"https://docs.frontic.com/reference/mcp/frontic-tools\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.frontic.com/reference/mcp/frontic-tools#article\",\"headline\":\"Frontic Tools\",\"name\":\"Frontic Tools\",\"url\":\"https://docs.frontic.com/reference/mcp/frontic-tools\",\"mainEntityOfPage\":{\"@id\":\"https://docs.frontic.com/reference/mcp/frontic-tools#webpage\"},\"dateModified\":\"2026-11-01T22:42:14.322Z\",\"publisher\":{\"@id\":\"https://docs.frontic.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.frontic.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Frontic Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Frontic Docs","nav":{"global":{},"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/essentials/what-is-frontic"}]},{"tab":"Connectors","pages":[{"title":"Connectors","href":"/connectors/overview"}]},{"tab":"Reference","groups":[{"group":"Overview","pages":[{"title":"Overview","icon":"compass","href":"/reference/overview"}]},{"group":"CLI \u0026 SDKs","pages":[{"title":"Frontic CLI","icon":"terminal","href":"/reference/frontic-cli"},{"title":"Client SDK","icon":"laptop-code","href":"/reference/client-sdk"},{"title":"Nuxt Module","icon":"vuejs","href":"/reference/nuxt-module"},{"title":"Frontic UI","icon":"swatchbook","tag":"Preview","description":null,"href":"/reference/frontic-ui"}]},{"group":"MCP Server","pages":[{"title":"Frontic Tools","icon":"microchip-ai","href":"/reference/mcp/frontic-tools"},{"title":"Frontic Docs","icon":"book-open","description":null,"href":"/reference/mcp/frontic-docs"}]},{"group":"Data Model","pages":[{"title":"Storage Field Types","icon":"gif","href":"/reference/storage-field-types"},{"title":"Value Composer","icon":"wand-magic-sparkles","href":"/reference/value-composer"}]},{"group":"Ingest API","pages":[{"title":"Overview","icon":"book-open","href":"/reference/ingest-api"},{"title":"Upsert Record","api":"POST https://ingest-{integration-id}.frontic.com/ingest/{feed-token}/upsert","href":"/reference/ingest-api/upsert"},{"title":"Patch Record","api":"PATCH https://ingest-{integration-id}.frontic.com/ingest/{feed-token}/upsert","href":"/reference/ingest-api/patch"},{"title":"Delete Record","api":"DELETE https://ingest-{integration-id}.frontic.com/ingest/{feed-token}/delete","href":"/reference/ingest-api/delete"},{"title":"Trigger Fetch","api":"POST https://ingest-{integration-id}.frontic.com/ingest/{feed-token}/fetch","href":"/reference/ingest-api/fetch"},{"title":"Trigger Fetch List","api":"POST https://ingest-{integration-id}.frontic.com/ingest/{feed-token}/fetch-list","href":"/reference/ingest-api/fetch-list"}]},{"group":"Fetch API","pages":[{"title":"Overview","icon":"book-open","href":"/reference/fetch-api"},{"title":"Fetch a Block","api":"POST https://fetch-{project-token}.frontic.com/block/{slug}/{key}","playground":"simple","href":"/reference/fetch-api/block"},{"title":"Fetch a Listing","api":"POST https://fetch-{project-token}.frontic.com/listing/{slug}","playground":"simple","href":"/reference/fetch-api/listing"},{"title":"Fetch a Page","api":"GET https://fetch-{project-token}.frontic.com/page/{url}","playground":"simple","href":"/reference/fetch-api/page"},{"title":"Fetch a Tree","api":"POST https://fetch-{project-token}.frontic.com/tree/{slug}","playground":"simple","href":"/reference/fetch-api/menu-tree"},{"title":"Fetch a Sitemap","api":"GET https://fetch-{project-token}.frontic.com/sitemap{index}.xml","playground":"simple","href":"/reference/fetch-api/sitemap"},{"title":"Get Context","api":"GET https://fetch-{project-token}.frontic.com/context/token","playground":"simple","href":"/reference/fetch-api/get-context"},{"title":"List Contexts","api":"GET https://fetch-{project-token}.frontic.com/context","playground":"simple","href":"/reference/fetch-api/list-contexts"},{"title":"Update Context","api":"PATCH https://fetch-{project-token}.frontic.com/context","playground":"simple","href":"/reference/fetch-api/update-context"}]}]}]},"basePath":"","title":"Frontic Tools - Frontic Docs","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["07c022d89b","a74be98ba7","869c33ed97"],"chunks":["Frame-DW6UFrUy.js","DynamicMarkdown-B62XqCSI.js","zoom-image-lightbox-eHyQ0tlO.js","lightbox-handle-r17bVUz3.js","Prompt-x-RCkg-A.js","clsx-BIWXJmsZ.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DKZWslLH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}