Skip to main content
Glama

Build a website

build_site
DestructiveIdempotent

For a business's marketing site only, for example "a site for my bakery". Something people use (upload a photo, AI pictures, sign-in, a tool, a game) is an app: use build_app, never a landing page. Pass the customer's brief in the customer's own words; do not add features the customer did not ask for (no invented sign-up, accounts, subscriptions or payments). First call: nothing starts, a summary returns; after a yes, call with its action.arguments. In hosts that render the build card (MCP Apps or ChatGPT widget), the card tracks progress automatically: do not poll job_status. In hosts without a build card (Claude Code or API), call job_status with the job_id until the job is finished, stopped or failed. Not for changing a built site (use edit).

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "brief": "<brief>",
      "idempotency_key": "<idempotency_key>"
    },
    "name": "build_site"
  }
}

Input Schema

NameRequiredDescriptionDefault
pickNoConsole gallery starter slug.
briefYesThe customer's request in their own words: what the site is for and any pages, texts, colours or style they named. Do not add features they did not ask for.
themeNoConsole theme slug.
localeNoSite language (legacy alias for site_language).
as_siteNoTrue only when Pugi said this sounds like an app (app_suggested) and the person chose a marketing website anyway.
logo_idNoSelected logo_id returned by make_logo.
max_usdNoThe run ceiling in USD; plan builds are included in the subscription. For credit builds, the most this build may cost. Default 5. Credit accounts pay actual cost, usually less.
languageNoThe language the person is writing in, as a BCP 47 tag such as "ru".
without_logoNoTrue only when the person said this site should not use the logo they picked.
brief_versionNoWith brief_confirmed: the version of the summary the person agreed to, as returned with that summary.
site_languageNoLanguage for the website content; independent of the chat card language.
brandHandoffIdNoBrandHandoff from logo.pugi.io.
brief_confirmedNoTrue only after the person has seen the summary and agreed. In a chat, without it nothing starts and the summary comes back.
idempotency_keyYesA unique string naming this job. The same key returns the same job and is never charged twice.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / as_site
      Added value: +{
      +  "description": "True only when Pugi said this sounds like an app (app_suggested) and the person chose a marketing website anyway.",
      +  "type": "boolean"
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / brief_confirmed / description
      Previous value: -"With logo_id: true only after the person has seen the summary from select_logo and agreed. Without it nothing starts and the summary comes back."New value: +"True only after the person has seen the summary and agreed. In a chat, without it nothing starts and the summary comes back."
    • changedInput schema / properties / brief_version / description
      Previous value: -"With brief_confirmed: the version of the summary the person agreed to, from select_logo."New value: +"With brief_confirmed: the version of the summary the person agreed to, as returned with that summary."
  3. Changed4 schema fields changed
    • addedInput schema / properties / brief_confirmed
      Added value: +{
      +  "description": "With logo_id: true only after the person has seen the summary from select_logo and agreed. Without it nothing starts and the summary comes back.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / brief_version
      Added value: +{
      +  "description": "With brief_confirmed: the version of the summary the person agreed to, from select_logo.",
      +  "maxLength": 32,
      +  "type": "string"
      +}
    • addedInput schema / properties / language
      Added value: +{
      +  "description": "The language the person is writing in, as a BCP 47 tag such as \"ru\".",
      +  "maxLength": 35,
      +  "pattern": "^[a-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
      +  "type": "string"
      +}
    • addedInput schema / properties / without_logo
      Added value: +{
      +  "description": "True only when the person said this site should not use the logo they picked.",
      +  "type": "boolean"
      +}
  4. Changed1 schema field changed
    • changedInput schema / properties / brief / description
      Previous value: -"What the site is for, who it is for, the pages and sections it needs, and any texts, colours or style it should use."New value: +"The customer's request in their own words: what the site is for and any pages, texts, colours or style they named. Do not add features they did not ask for."
  5. Changed3 schema fields changed
    • changedInput schema / properties / locale / description
      Previous value: -"Site language."New value: +"Site language (legacy alias for site_language)."
    • changedInput schema / properties / max_usd / description
      Previous value: -"The most this build may cost, in USD. Default 5. You pay the actual cost, usually less."New value: +"The run ceiling in USD; plan builds are included in the subscription. For credit builds, the most this build may cost. Default 5. Credit accounts pay actual cost, usually less."
    • addedInput schema / properties / site_language
      Added value: +{
      +  "description": "Language for the website content; independent of the chat card language.",
      +  "type": "string"
      +}
  6. Changed5 schema fields changed
    • addedInput schema / properties / brandHandoffId
      Added value: +{
      +  "description": "BrandHandoff from logo.pugi.io.",
      +  "type": "string"
      +}
    • addedInput schema / properties / locale
      Added value: +{
      +  "description": "Site language.",
      +  "type": "string"
      +}
    • addedInput schema / properties / logo_id
      Added value: +{
      +  "description": "Selected logo_id returned by make_logo.",
      +  "type": "string"
      +}
    • addedInput schema / properties / pick
      Added value: +{
      +  "description": "Console gallery starter slug.",
      +  "type": "string"
      +}
    • addedInput schema / properties / theme
      Added value: +{
      +  "description": "Console theme slug.",
      +  "type": "string"
      +}
  7. Added
  8. Removed
  9. Added

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (destructive/openWorld/idempotent), it discloses a non-obvious two-phase behavior: the first call starts nothing and returns a summary, and work only begins after brief_confirmed. It further explains host-dependent progress tracking — auto-updating build card in MCP Apps/ChatGPT versus manual job_status polling in Claude Code/API — which is exactly the kind of context annotations cannot convey.

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

Conciseness4/5

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

Scope and the build_app exclusion are front-loaded, and every sentence carries routing or protocol information. It is dense and slightly run-on, with the 'do not add features the customer did not ask for' instruction duplicated in the brief schema, but for a 14-parameter, two-phase tool the length is defensible.

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

Completeness5/5

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

For a complex, expensive, multi-step tool with no output schema, the description covers scope, alternatives, the confirmation gate, host-specific progress tracking, and the edit handoff. The remaining details (credit costs, summary contents) are covered by the schema's max_usd and idempotency_key documentation.

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 100%, so the baseline is 3, but the description adds real meaning: brief must be the customer's own words with no invented sign-up, accounts, subscriptions or payments, and brief_confirmed is tied to the 'after a yes' gate. Other parameters (max_usd, theme, pick, brandHandoffId) are left entirely to the schema.

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

Purpose5/5

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

The opening sentence states the verb and resource plus a hard scope constraint ('business's marketing site only') and immediately contrasts it with the sibling build_app. It also names edit as the tool for post-build changes, so an agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('marketing site'), when-not ('something people use ... is an app: use build_app, never a landing page'), and when to switch ('not for changing a built site (use edit)'). It also instructs on the second-call protocol ('after a yes, call with its action.arguments'), leaving nothing to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources