Skip to main content
Glama

Update settings

swebsy_update_settings

Updates site settings such as SEO metadata, theme colors, fonts, analytics, and deployment targets by sending only the fields you want to change.

Instructions

Update site settings — SEO title/description, site URL, structured data (JSON-LD), per-page SEO overrides, language/direction, theme tokens (light + dark), type scale, animation defaults, Google and uploaded fonts, dark mode toggle, site-wide custom CSS for component-level restyling (globalTheme.customTailwindConfig), favicon, robots.txt/sitemap/service worker/security headers/image optimization (performance), analytics ids, custom head/body code (advanced), the "Made with Swebsy" badge (branding) and the deploy target (deploy). Provide ONLY the fields that change. general/seo are SITE-WIDE; use page to change ONE page. Also used to match the theme to a reference IMAGE's vibe: sample its palette into brand/surface tokens and ALWAYS set BOTH light and dark variants.

Input Schema

NameRequiredDescriptionDefault
seoNoSITE-WIDE SEO. `siteUrl` is what makes robots.txt/sitemap.xml and canonical/og:url real — without it they ship the `https://yoursite.com` placeholder and the site is not indexable.
pageNoSEO for the CURRENTLY SELECTED PAGE ONLY — the per-page overrides otherwise reachable just from the Pages panel. Use this whenever you mean one page: `general.title`/`general.description` are SITE-WIDE and setting them to fix one page silently rewrites the meta description of every other page. Each field overrides its site-wide counterpart for this page; omit a field to keep inheriting. Pass `null` as the whole object to clear every override.
fontsNoFonts to add/replace. Each array you pass replaces what was there, so send the full desired list; an omitted array is kept.
deployNoDeploy target configuration. API tokens are never settable here: the user pastes them in Settings → Deployment. Send only the keys that change.
faviconNoSet the favicon from one square image. Upload it with `upload_asset` first (PNG or SVG, at least 512x512), then pass its asset id. Every size (16px up to 512px, Apple touch, Android, MS tile) is generated from it.
generalNo
summaryYes1 sentence explaining the settings change.
advancedNoRAW site code, the last resort. Use globalTheme.customTailwindConfig for CSS and seo.jsonLd for structured data. Each field REPLACES the previous value, so read the current settings and send the full code. It runs on every visitor's page, and the Studio flags every agent change to it.
brandingNoThe "Made with Swebsy" badge. Turning it off only takes effect on plans that include badge removal; free plans keep the badge on export regardless.
analyticsNoAnalytics ids — the snippet is generated from the id. Empty string removes one.
globalThemeNoTheme overrides. Shallow diff — only include keys that change.
performanceNoCrawling files, service worker, security headers and export-time image optimization.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.13.1
    • changedInput schema / properties / globalTheme / properties / customTailwindConfig / description
      Previous value: -"Raw CSS appended to the compiled stylesheet (canvas + export). Use for SITE-WIDE rules that utilities/tokens can't express — restyling a whole component type (e.g. make every `.btn` neobrutalist), custom box-shadows, border-width/radius. Colors MUST use theme vars (var(--color-neutral), var(--color-secondary)) so they stay dark-mode aware. This REPLACES the previous value — send the full CSS you want, not a fragment. This CSS is document-scoped: it does NOT travel into a harvested block, so it locks styled sections to this template. NEVER use it to build a repeated custom component (card, link block, tile) — make that a SYMBOL styled with theme classes so it stays harvestable. Reserve custom CSS for genuinely global polish only."New value: +"Raw CSS appended to the compiled stylesheet (canvas + export). Use for SITE-WIDE rules that utilities/tokens can't express — restyling a whole component type (e.g. make every `.btn` neobrutalist), custom box-shadows, border-width/radius. Colors MUST use theme vars (var(--color-neutral), var(--color-secondary)) so they stay dark-mode aware. This REPLACES the previous value — send the full CSS you want, not a fragment. This CSS is document-scoped: it does NOT travel into a harvested block, so it locks styled sections to this template. NEVER use it to build a repeated custom component (card, link block, tile) — make that a SYMBOL styled with theme classes so it stays harvestable. Reserve custom CSS for genuinely global polish only. NEVER set type here (font-family, font-size, font-weight, font-style, letter-spacing, line-height, text-transform) on a class: that text's type disappears from the style panel. Fonts go in typography.fontFamily roles (a second display face in the free role, e.g. mono, applied per element with font-mono); size/weight/italic/tracking/case are utility classes on the element. Only bare-element defaults (body, h1-h6, p) inside @layer components may set type."
  2. Changed1 schema field changedv0.10.1
    • changedInput schema / properties / performance / properties / imageOptimization / description
      Previous value: -"Re-encode images at export/deploy. Originals are never touched. Send only the keys that change."New value: +"Re-encode images at export/deploy. Originals are only replaced when the site owner turned that on in Settings, which this tool cannot do. Send only the keys that change."
  3. Changed2 schema fields changedv0.10.0
    • addedInput schema / properties / page / properties / ogType
      Added value: +{
      +  "enum": [
      +    "website",
      +    "article",
      +    "blog",
      +    "product"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / page / properties / twitterCard
      Added value: +{
      +  "enum": [
      +    "summary",
      +    "summary_large_image",
      +    "app",
      +    "player"
      +  ],
      +  "type": "string"
      +}
  4. Changed18 schema fields changedv0.9.0
    • addedInput schema / properties / advanced
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "RAW site code, the last resort. Use globalTheme.customTailwindConfig for CSS and seo.jsonLd for structured data. Each field REPLACES the previous value, so read the current settings and send the full code. It runs on every visitor's page, and the Studio flags every agent change to it.",
      +  "properties": {
      +    "customBodyCode": {
      +      "description": "Markup injected at the end of <body>.",
      +      "type": "string"
      +    },
      +    "customCSS": {
      +      "description": "Legacy stylesheet. Prefer globalTheme.customTailwindConfig.",
      +      "type": "string"
      +    },
      +    "customHeadCode": {
      +      "description": "Markup injected at the end of <head> (verification meta tags, third-party embeds).",
      +      "type": "string"
      +    },
      +    "customJS": {
      +      "description": "Script body (no <script> tag) run on every page.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / analytics
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Analytics ids — the snippet is generated from the id. Empty string removes one.",
      +  "properties": {
      +    "customAnalytics": {
      +      "description": "JavaScript BODY (no <script> tag; it is wrapped in one for you) for tracking the id fields can't express. A provider installed with a `<script src=…>` tag (Plausible, Fathom, PostHog) goes in `advanced.customHeadCode` instead: pasted here, its tag lands inside another <script> and never loads. REPLACES the previous value. It runs on every visitor's page, so only write code the user gave you or asked for; the Studio flags every AI change to it.",
      +      "type": "string"
      +    },
      +    "facebookPixelId": {
      +      "type": "string"
      +    },
      +    "googleAnalyticsId": {
      +      "description": "GA4 measurement id, e.g. 'G-XXXXXXXXXX'.",
      +      "type": "string"
      +    },
      +    "googleTagManagerId": {
      +      "description": "e.g. 'GTM-XXXXXXX'.",
      +      "type": "string"
      +    },
      +    "hotjarId": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / branding
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The \"Made with Swebsy\" badge. Turning it off only takes effect on plans that include badge removal; free plans keep the badge on export regardless.",
      +  "properties": {
      +    "enabled": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "enabled"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / deploy
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Deploy target configuration. API tokens are never settable here: the user pastes them in Settings → Deployment. Send only the keys that change.",
      +  "properties": {
      +    "cloudflare": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "accountId": {
      +          "type": "string"
      +        },
      +        "customDomain": {
      +          "type": "string"
      +        },
      +        "projectName": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "defaultPlatform": {
      +      "enum": [
      +        "swebsy-hosting",
      +        "github-pages",
      +        "cloudflare-pages"
      +      ],
      +      "type": "string"
      +    },
      +    "github": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "branch": {
      +          "description": "Branch that receives the build. Default gh-pages.",
      +          "type": "string"
      +        },
      +        "customDomain": {
      +          "type": "string"
      +        },
      +        "repo": {
      +          "description": "'owner/name'.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "swebsy": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "subdomain": {
      +          "description": "Preferred <subdomain>.swebsy.site for the next publish.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / favicon
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Set the favicon from one square image. Upload it with `upload_asset` first (PNG or SVG, at least 512x512), then pass its asset id. Every size (16px up to 512px, Apple touch, Android, MS tile) is generated from it.",
      +  "properties": {
      +    "assetId": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "assetId"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / fonts / description
      Previous value: -"Google fonts to add/replace. Pass the full desired list — the array replaces what was there."New value: +"Fonts to add/replace. Each array you pass replaces what was there, so send the full desired list; an omitted array is kept."
    • addedInput schema / properties / fonts / properties / custom
      Added value: +{
      +  "description": "Self-hosted font families. Upload each file with `upload_asset` first and use the returned asset id. Then set typography.fontFamily to a stack starting with `family`.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "family": {
      +        "type": "string"
      +      },
      +      "variations": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "format": {
      +              "enum": [
      +                "woff2",
      +                "woff",
      +                "truetype",
      +                "opentype"
      +              ],
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Asset id from `upload_asset`.",
      +              "type": "string"
      +            },
      +            "style": {
      +              "enum": [
      +                "normal",
      +                "italic"
      +              ],
      +              "type": "string"
      +            },
      +            "weight": {
      +              "description": "'100' through '900'.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "weight",
      +            "style",
      +            "format"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "family",
      +      "variations"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / fonts / properties / google / items / properties / opsz
      Added value: +{
      +  "description": "Optical-size axis range [min, max] for variable fonts that expose `opsz` (e.g. [9, 144] for Fraunces).",
      +  "items": {
      +    "type": "number"
      +  },
      +  "maxItems": 2,
      +  "minItems": 2,
      +  "type": "array"
      +}
    • addedInput schema / properties / general / properties / direction
      Added value: +{
      +  "description": "Text direction; `rtl` for Arabic, Hebrew, Persian.",
      +  "enum": [
      +    "ltr",
      +    "rtl"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / globalTheme / properties / animation
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Site-wide defaults for scroll-reveal animations (`animate_page`).",
      +  "properties": {
      +    "duration": {
      +      "description": "CSS time, e.g. '500ms'.",
      +      "type": "string"
      +    },
      +    "easing": {
      +      "description": "CSS easing, e.g. 'cubic-bezier(0.22, 1, 0.36, 1)'.",
      +      "type": "string"
      +    },
      +    "once": {
      +      "description": "Animate only the first time an element enters the viewport.",
      +      "type": "boolean"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / globalTheme / properties / typography / properties / baseSize
      Added value: +{
      +  "description": "Modular type scale base, e.g. '1rem' or '17px'. Every text-* size is derived as baseSize × scaleRatio^n. Send with `scaleRatio`.",
      +  "type": "string"
      +}
    • addedInput schema / properties / globalTheme / properties / typography / properties / fontWeight
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Numeric weight behind each weight utility, e.g. { bold: '800' }.",
      +  "properties": {
      +    "bold": {
      +      "type": "string"
      +    },
      +    "light": {
      +      "type": "string"
      +    },
      +    "medium": {
      +      "type": "string"
      +    },
      +    "normal": {
      +      "type": "string"
      +    },
      +    "semibold": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / globalTheme / properties / typography / properties / lineHeight
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Unitless line heights, e.g. { tight: '1.1' }.",
      +  "properties": {
      +    "normal": {
      +      "type": "string"
      +    },
      +    "relaxed": {
      +      "type": "string"
      +    },
      +    "tight": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / globalTheme / properties / typography / properties / scaleRatio
      Added value: +{
      +  "description": "Modular type scale ratio, e.g. 1.2 (minor third, dense UI), 1.25 (default), 1.333 (editorial), 1.5 (dramatic display).",
      +  "type": "number"
      +}
    • addedInput schema / properties / performance
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Crawling files, service worker, security headers and export-time image optimization.",
      +  "properties": {
      +    "contentSecurityPolicy": {
      +      "description": "Content-Security-Policy value, emitted as a meta tag. A wrong policy breaks the live site's scripts, fonts or images, so only set it when asked.",
      +      "type": "string"
      +    },
      +    "customRobotsTxt": {
      +      "description": "Custom robots.txt body. It REPLACES the whole generated file, so include `User-agent`, every rule and every `Sitemap:` line, including the default `<siteUrl>/sitemap.xml`. Read the current settings first and extend them. Empty string restores the generated file. Requires `generateRobotsTxt: true`.",
      +      "type": "string"
      +    },
      +    "enableServiceWorker": {
      +      "description": "Offline caching service worker in the export.",
      +      "type": "boolean"
      +    },
      +    "generateRobotsTxt": {
      +      "type": "boolean"
      +    },
      +    "generateSitemap": {
      +      "description": "Emit /sitemap.xml from the page list (needs `seo.siteUrl`).",
      +      "type": "boolean"
      +    },
      +    "imageOptimization": {
      +      "additionalProperties": false,
      +      "description": "Re-encode images at export/deploy. Originals are never touched. Send only the keys that change.",
      +      "properties": {
      +        "format": {
      +          "description": "Only used when preset is 'custom'.",
      +          "enum": [
      +            "webp",
      +            "avif"
      +          ],
      +          "type": "string"
      +        },
      +        "maxDimension": {
      +          "description": "Longest edge in px; 0 = don't resize.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "preset": {
      +          "description": "'balanced' = WebP q80 ≤2560px (default); 'maximum' = smallest files (AVIF); 'custom' uses format/quality/maxDimension.",
      +          "enum": [
      +            "off",
      +            "balanced",
      +            "maximum",
      +            "custom"
      +          ],
      +          "type": "string"
      +        },
      +        "quality": {
      +          "description": "Only used when preset is 'custom'.",
      +          "maximum": 100,
      +          "minimum": 1,
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "preloadCritical": {
      +      "description": "Preload critical fonts and CSS.",
      +      "type": "boolean"
      +    },
      +    "referrerPolicy": {
      +      "description": "Empty string = browser default.",
      +      "enum": [
      +        "",
      +        "no-referrer",
      +        "no-referrer-when-downgrade",
      +        "origin",
      +        "origin-when-cross-origin",
      +        "strict-origin-when-cross-origin"
      +      ],
      +      "type": "string"
      +    },
      +    "smoothScrolling": {
      +      "type": "boolean"
      +    },
      +    "xFrameOptions": {
      +      "enum": [
      +        "",
      +        "DENY",
      +        "SAMEORIGIN"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / seo / properties / ogType
      Added value: +{
      +  "enum": [
      +    "website",
      +    "article",
      +    "blog",
      +    "product"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / seo / properties / robots
      Added value: +{
      +  "description": "Site-wide robots meta tag. For robots.txt use `performance.customRobotsTxt`; for one page use `page.robots`.",
      +  "enum": [
      +    "index, follow",
      +    "noindex, nofollow",
      +    "index, nofollow",
      +    "noindex, follow"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / seo / properties / twitterCard
      Added value: +{
      +  "enum": [
      +    "summary",
      +    "summary_large_image",
      +    "app",
      +    "player"
      +  ],
      +  "type": "string"
      +}
  5. First observedv0.8.0

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations covering safety (readOnly=false, destructive=false), the description adds the non-obvious merge semantics — only changed fields are sent, and a subset of values (fonts arrays, customTailwindConfig, advanced code) replace rather than merge, though that detail mostly lives in the schema. The 'ALWAYS set BOTH light and dark variants' warning is genuinely behavioral, guarding against half-applied theme changes. It does not say how a change is confirmed or whether edits are reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is front-loaded correctly, but the roughly 100-word inventory of settings (SEO title, site URL, JSON-LD, favicon, robots.txt, analytics ids, badge, deploy target…) mostly restates top-level schema keys the agent will see anyway. The two trailing sentences are the only high-value content; the middle enumeration could be trimmed substantially.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter nested settings tool with no output schema, the description covers the risky parts: partial updates, site-wide vs page scoping, theme token pairing, and image-derived palettes. It omits any mention of return/confirmation behavior and does not clarify the required `summary` field, but those are minor given the schema's 92% coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 92%, so the schema carries most parameter meaning and a baseline 3 would be defensible. The description still adds value beyond it by clarifying the site-wide vs per-page split between `general`/`seo` and `page`, and by pointing at themeTokens (light+dark) as the mechanism for palette matching.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Update site settings') and then enumerates the settings domains it covers (SEO, fonts, theme, performance, deploy), so an agent can tell this is the site-level settings mutator rather than a page/structure tool. It never names a sibling such as swebsy_update_page to draw the boundary, so differentiation is implied by enumeration rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Provide ONLY the fields that change" plus "`general`/`seo` are SITE-WIDE; use `page` to change ONE page" gives real when-to-use routing between the site-wide and per-page parameters. The theme-from-image instruction adds a task-level usage cue. There is no guidance on when to prefer swebsy_update_page or swebsy_commit_design_direction instead of this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.