Skip to main content
Glama

swebsy_update_settings

Update site settings for SEO, theme, fonts, analytics, performance, deploy, and per-page overrides by sending only the fields that 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

TableJSON 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.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."
  2. 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"
      +}
  3. 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"
      +}
  4. First observedv0.8.0

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose partial-update semantics ("Provide ONLY the fields that change") and a hard rule to always set both light and dark variants, but leaves mutation/merge behavior, permission requirements, and what happens to unspecified keys entirely to the nested schema descriptions.

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

Conciseness2/5

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

The core is one very long run-on paragraph that lists a dozen unrelated domains in a single sentence, which is hard to parse and buries the two genuinely important rules (only changed fields; always set both light and dark). The image-matching tip is valuable but tacked on after an overloaded enumeration.

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, deeply nested tool with no annotations and no output schema, the description plus the rich schema gives an agent enough to call it correctly: it names the domains, the partial-update contract, and the site-wide/page rule. It stops short of full completeness only because mutation and auth behavior are never stated.

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

Parameters3/5

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

Schema description coverage is 92%, so the schema already documents nearly every field in detail. The description's enumeration maps the areas to top-level parameters and adds the site-wide/page distinction, but it adds little syntax or format meaning beyond what the schema already provides. Baseline 3 applies.

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?

States a specific verb and resource ("Update site settings") and then enumerates the exact domains covered, so an agent knows this is the omnibus site-level settings writer rather than a page tool. It clearly distinguishes `general`/`seo` (site-wide) from `page` (one page), which is the key disambiguation against siblings like swebsy_update_page.

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

Usage Guidelines3/5

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

"Provide ONLY the fields that change" and the site-wide-vs-page split give real usage guidance, as does the theme-from-image instruction. However, it never names an alternative sibling tool or states when NOT to use this tool (e.g. delegate to swebsy_update_page for page content), so routing is only implied.

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