Skip to main content
Glama

Update Project Metadata

update_project_metadata

Update project settings (current values appear at the top of list_files). Keys: title (2-100 chars), description, iconUrl (the app's icon/logo: favicon, home-screen icon and native app icon — a /_cdn/static/… path from upload_asset, generate_image or request_user_upload, or an absolute https URL; null resets), splashUrl (native splash screen, same value forms), mobileAppId, enableSSR (boolean), flootAiDisallowed (boolean — true opts the project out of @floot/ai), and iOS Info.plist purpose strings (NS…UsageDescription — set to a string, or null to remove) plus boolean Info.plist keys (UIViewControllerBasedStatusBarAppearance — set to a boolean, or null to restore the template default). Invalid keys/values are reported and skipped. NOTE: these take effect on the published app only after the next publish (publish_app, or the user's Publish button). The iosInfoPlist keys only affect builds made before the first iOS publish; after the iOS app is published, edit the project file static/__dev/native/ios-info.plist directly with write_file/edit_file (see get_guides('ios-info-plist')). Likewise, after the first Android publish, edit static/__dev/native/android-manifest.xml directly for manifest changes (see get_guides('android-manifest')). shareTarget makes the native app appear in the iOS and Android share sheets (other apps can share photos/videos/files/text into it): pass { enabled: true, mimeTypes?, allowMultiple? } to register, { enabled: false } to remove; receiving the shared items still needs the handler in app code — read get_guides('share-target') first and ship both together. nativeSystemBars controls how the native app treats the status bar / Android navigation bar: mode 'inset' (default) keeps the app below the bars and paints the exposed strips color (default black — set it to the app's header color for a seamless look); mode 'edge-to-edge' runs the app under the bars, which REQUIRES the app to pad by var(--safe-area-inset-top/bottom) itself — read get_guides('native-system-bars') first and ship both changes together. Not superseded by the __dev/native files. serverMemoryMb sets the memory (MB) of the project's server Lambda, which runs every endpoint, queued task, scheduled job and SSR render (default 1024 MB; 2048 for the published app when SSR is on — the dev backend never bumps). EXPERT SETTING — NEVER change it on your own initiative or as a side effect of another request, only when the user explicitly asks to change the server memory AND understands the trade-off: too low and the backend stops working entirely (killed out-of-memory); Lambda CPU scales with memory, so a lower value also makes every request slower and — because compute is billed per GB-second of billed duration — can cost MORE, not less; a higher value costs more per millisecond. Allowed range 512–4096 MB, whole MB (if a size turns out not to be available for the app's server, the deploy fails and the error names this setting). It applies to the dev backend at the next backend deploy and to the published app at the next publish. Pass null to restore the default. Read get_guides('server-memory') before changing it. analyticsMode controls the built-in visitor analytics tracker every published app includes (the project's Analytics tab): 'storage' (default) keeps a 30-minute session id in the visitor's localStorage, which is device storage that needs consent under EU ePrivacy / UK PECR — an app with EU/UK visitors pairs it with a consent banner that calls window.flootAnalytics.setMode(); 'memory' keeps the id in memory only (nothing stored on the device, no consent needed, but a reload or new tab counts as a new session); 'off' sends no analytics at all. Only change it when the user asks about analytics, cookies, consent or privacy for their published app; it takes effect at the next publish. Read get_guides('analytics') for the consent-banner API before changing it. iosDeviceFamily picks the devices the native iOS app is built for: 'iphone-and-ipad' (default, universal) or 'iphone' (iPhone only — the app still installs on iPads but runs there in iPhone compatibility mode, and App Store Connect no longer asks for iPad screenshots). This is the ONLY way to make the app iPhone-only: it is an Xcode build setting, so a UIDeviceFamily key in static/__dev/native/ios-info.plist is overwritten at build and does nothing. One-way door: App Store Connect rejects an update that drops iPad once a version supporting iPad has been released on the App Store, and the build then fails at upload. Before setting 'iphone', ask the user whether the app is already live on the App Store; if it is, tell them it cannot be made iPhone-only and do not set it. Takes effect at the next iOS publish. routePrefetch controls how the PUBLISHED app downloads other pages' code ahead of navigation: mode 'auto' (default: every page when the app has 15 or fewer, else links entering the screen plus hover/touch), 'all', 'viewport' (links in view + hover/touch), 'intent' (hover/touch only) or 'off'; skipAutomation: true turns warming off in automated browsers (navigator.webdriver: Playwright, Puppeteer, Selenium). A single link opts out with the attribute data-no-prefetch on the or an ancestor (honoured in every mode except the whole-app warm of 'all' / small-app 'auto'). Only change it when the user asks about page prefetching or load performance; it takes effect at the next publish. dependencyOverrides forces the version of a package one of the project's dependencies pulls in, in the PUBLISHED app's installs (pnpm overrides), for when a dependency pins a vulnerable package and has no fixed release: { "exceljs>uuid": "11.1.1" } moves the uuid that exceljs uses. Keys are always "parent>package" and the parent must be one of the project's own dependencies (an entry whose parent is not is kept but not applied); a value of null removes that entry, and null for the whole parameter removes them all. Versions are exact or ^/~ on an exact version. Prefer the fixed release on the major the parent asks for (or the nearest one): a newer major can break the parent, and the published backend runs Node 22 without require() of ES modules, so an ESM-only major breaks a CommonJS parent. Packages Floot manages (React, the router, zod, the default UI packages, build tooling, @tiptap/*, Capacitor, sharp, hono…) are refused as parent or package. Adding the fixed version as a direct dependency does NOT change a nested copy; this does. It applies to the published app at the next publish, and to the preview from the next change (reload the preview). Only set it when the user asks to fix a dependency vulnerability or version conflict. securityHeaders sets the published app's own page headers: embedding (who may show the app in an iframe: 'anyone' (default), 'self', 'none', or a list of https origins), csp (directive -> the COMPLETE source list for it, replacing the platform's; other directives keep the platform's), cspReportOnly (try csp without enforcing it) and referrerPolicy. Each field passed replaces the stored one and null removes it (inside csp, per directive); securityHeaders: null restores the platform defaults. Changes that would break the app are refused with the reason. Change it only when the user asks about embedding / iframes / clickjacking, a security scan finding, a stricter or looser Content-Security-Policy, or referrer privacy; it takes effect at the next publish and never in the preview. Read get_guides('security-headers') before changing it.

Input Schema

NameRequiredDescriptionDefault
updatesNoFlat metadata fields (see the tool description).
projectIdYes
shareTargetNoShare-sheet target config (iOS Share Extension + Android share sheet). Omit to leave unchanged; { enabled: false } removes it.
analyticsModeNoBuilt-in visitor analytics mode for the published app: 'storage' (default, session id in localStorage — needs a consent banner for EU/UK visitors), 'memory' (nothing stored on the device, no consent needed) or 'off' (no analytics). Omit to leave unchanged.
routePrefetchNoPublished app's page-code prefetching: { mode?: 'auto' | 'all' | 'viewport' | 'intent' | 'off', skipAutomation?: boolean }, merged over the current value; null restores the default. Omit to leave unchanged.
serverMemoryMbNoMemory (MB) of the project's server Lambda, 512–4096. EXPERT SETTING: only on an explicit user request to change the server memory (see the tool description for the risks); never touch it otherwise. Omit to leave unchanged; null restores the platform default.
iosDeviceFamilyNoDevices the native iOS app is built for: 'iphone-and-ipad' (default) or 'iphone' (iPhone only). Not possible for an app already released on the App Store with iPad support. Omit to leave unchanged.
securityHeadersNoThe published app's own page headers. Omit to leave unchanged; null restores the platform defaults. Fields: embedding ('anyone' | 'self' | 'none' | list of https origins), csp ({ directive: [complete source list] } replacing the platform's for that directive; a directive set to null goes back to the platform's), cspReportOnly (boolean), referrerPolicy. A field passed as null is removed; a field left out is kept.
nativeSystemBarsNoNative system-bars config, replaced whole. Omit to leave unchanged; { mode: 'inset' } with no color restores the default. Runtime strip color (dark theme): see get_guides("native-system-bars").
dependencyOverridesNoPublished app's pnpm overrides: { "parent>package": "exact version" | "^x.y.z" | "~x.y.z" | null }, the parent being one of the project's own dependencies; merged over the current value (null removes an entry); null for the whole parameter removes them all. Omit to leave unchanged.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / dependencyOverrides
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Published app's pnpm overrides: { \"parent>package\": \"exact version\" | \"^x.y.z\" | \"~x.y.z\" | null }, the parent being one of the project's own dependencies; merged over the current value (null removes an entry); null for the whole parameter removes them all. Omit to leave unchanged."
      +}
  2. Changed3 schema fields changed
    • changedInput schema / properties / nativeSystemBars / description
      Previous value: -"Native system-bars config. Omit to leave unchanged; { mode: 'inset' } with no color restores the default."New value: +"Native system-bars config, replaced whole. Omit to leave unchanged; { mode: 'inset' } with no color restores the default. Runtime strip color (dark theme): see get_guides(\"native-system-bars\")."
    • addedInput schema / properties / nativeSystemBars / properties / android
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "color": {
      +          "type": "string"
      +        },
      +        "iconStyle": {
      +          "enum": [
      +            "light",
      +            "dark"
      +          ],
      +          "type": "string"
      +        },
      +        "mode": {
      +          "enum": [
      +            "inset",
      +            "edge-to-edge"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Android-only override of mode/color/iconStyle (e.g. { mode: 'inset' } while iOS is edge-to-edge). Unset fields come from the top level."
      +}
    • addedInput schema / properties / nativeSystemBars / properties / ios
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "color": {
      +          "type": "string"
      +        },
      +        "iconStyle": {
      +          "enum": [
      +            "light",
      +            "dark"
      +          ],
      +          "type": "string"
      +        },
      +        "mode": {
      +          "enum": [
      +            "inset",
      +            "edge-to-edge"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "iOS-only override of mode/color/iconStyle. Unset fields come from the top level."
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / routePrefetch
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "mode": {
      +          "enum": [
      +            "auto",
      +            "all",
      +            "viewport",
      +            "intent",
      +            "off"
      +          ],
      +          "type": "string"
      +        },
      +        "skipAutomation": {
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Published app's page-code prefetching: { mode?: 'auto' | 'all' | 'viewport' | 'intent' | 'off', skipAutomation?: boolean }, merged over the current value; null restores the default. Omit to leave unchanged."
      +}
  4. Changed1 schema field changed
    • addedInput schema / properties / securityHeaders
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "csp": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": {
      +                "anyOf": [
      +                  {
      +                    "items": {
      +                      "type": "string"
      +                    },
      +                    "type": "array"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Directive -> its COMPLETE source list, replacing the platform's for that directive, e.g. { \"form-action\": [\"'self'\"] }. A directive set to null goes back to the platform's; directives left out are kept."
      +        },
      +        "cspReportOnly": {
      +          "description": "true: send `csp` as Content-Security-Policy-Report-Only (nothing blocked) to try it on the published app first.",
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        },
      +        "embedding": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "enum": [
      +                    "anyone",
      +                    "self",
      +                    "none"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                }
      +              ]
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "'anyone' (default), 'self', 'none', or a list of https origins (own origin always included)."
      +        },
      +        "referrerPolicy": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "no-referrer",
      +                "no-referrer-when-downgrade",
      +                "origin",
      +                "origin-when-cross-origin",
      +                "same-origin",
      +                "strict-origin",
      +                "strict-origin-when-cross-origin",
      +                "unsafe-url"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The published app's own page headers. Omit to leave unchanged; null restores the platform defaults. Fields: embedding ('anyone' | 'self' | 'none' | list of https origins), csp ({ directive: [complete source list] } replacing the platform's for that directive; a directive set to null goes back to the platform's), cspReportOnly (boolean), referrerPolicy. A field passed as null is removed; a field left out is kept."
      +}
  5. Changed1 schema field changed
    • addedInput schema / properties / iosDeviceFamily
      Added value: +{
      +  "description": "Devices the native iOS app is built for: 'iphone-and-ipad' (default) or 'iphone' (iPhone only). Not possible for an app already released on the App Store with iPad support. Omit to leave unchanged.",
      +  "enum": [
      +    "iphone-and-ipad",
      +    "iphone"
      +  ],
      +  "type": "string"
      +}
  6. Changed1 schema field changed
    • addedInput schema / properties / analyticsMode
      Added value: +{
      +  "description": "Built-in visitor analytics mode for the published app: 'storage' (default, session id in localStorage — needs a consent banner for EU/UK visitors), 'memory' (nothing stored on the device, no consent needed) or 'off' (no analytics). Omit to leave unchanged.",
      +  "enum": [
      +    "storage",
      +    "memory",
      +    "off"
      +  ],
      +  "type": "string"
      +}
  7. Changed1 schema field changed
    • addedInput schema / properties / serverMemoryMb
      Added value: +{
      +  "anyOf": [
      +    {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Memory (MB) of the project's server Lambda, 512–4096. EXPERT SETTING: only on an explicit user request to change the server memory (see the tool description for the risks); never touch it otherwise. Omit to leave unchanged; null restores the platform default."
      +}
  8. Changed1 schema field changed
    • addedInput schema / properties / shareTarget
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Share-sheet target config (iOS Share Extension + Android share sheet). Omit to leave unchanged; { enabled: false } removes it.",
      +  "properties": {
      +    "allowMultiple": {
      +      "description": "Also accept multi-select shares. Default true.",
      +      "type": "boolean"
      +    },
      +    "enabled": {
      +      "type": "boolean"
      +    },
      +    "mimeTypes": {
      +      "description": "MIME patterns to accept, e.g. [\"image/*\",\"video/*\"] (default). Allowed: image/*, video/*, audio/*, text/plain, application/pdf.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "enabled"
      +  ],
      +  "type": "object"
      +}
  9. Changed1 schema field changed
    • removedInput schema / properties / shareTarget
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "Share-sheet target config (iOS Share Extension + Android share sheet). Omit to leave unchanged; { enabled: false } removes it.",
      -  "properties": {
      -    "allowMultiple": {
      -      "description": "Also accept multi-select shares. Default true.",
      -      "type": "boolean"
      -    },
      -    "enabled": {
      -      "type": "boolean"
      -    },
      -    "mimeTypes": {
      -      "description": "MIME patterns to accept, e.g. [\"image/*\",\"video/*\"] (default). Allowed: image/*, video/*, audio/*, text/plain, application/pdf.",
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    }
      -  },
      -  "required": [
      -    "enabled"
      -  ],
      -  "type": "object"
      -}
  10. Changed1 schema field changed
    • addedInput schema / properties / shareTarget
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Share-sheet target config (iOS Share Extension + Android share sheet). Omit to leave unchanged; { enabled: false } removes it.",
      +  "properties": {
      +    "allowMultiple": {
      +      "description": "Also accept multi-select shares. Default true.",
      +      "type": "boolean"
      +    },
      +    "enabled": {
      +      "type": "boolean"
      +    },
      +    "mimeTypes": {
      +      "description": "MIME patterns to accept, e.g. [\"image/*\",\"video/*\"] (default). Allowed: image/*, video/*, audio/*, text/plain, application/pdf.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "enabled"
      +  ],
      +  "type": "object"
      +}
  11. Changed3 schema fields changed
    • addedInput schema / properties / nativeSystemBars
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Native system-bars config. Omit to leave unchanged; { mode: 'inset' } with no color restores the default.",
      +  "properties": {
      +    "color": {
      +      "description": "Inset mode only: #rrggbb paint of the strips under the bars. Default #000000.",
      +      "type": "string"
      +    },
      +    "iconStyle": {
      +      "description": "Color of the bar ICONS. Inset: defaults to contrast with `color`. Edge-to-edge: defaults to 'dark'.",
      +      "enum": [
      +        "light",
      +        "dark"
      +      ],
      +      "type": "string"
      +    },
      +    "mode": {
      +      "enum": [
      +        "inset",
      +        "edge-to-edge"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "mode"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / updates / description
      Added value: +"Flat metadata fields (see the tool description)."
    • changedInput schema / required
      Previous value: -[
      -  "projectId",
      -  "updates"
      -]New value: +[
      +  "projectId"
      +]
  12. First observed

TDQS

A4.8/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the annotations: invalid keys are reported and skipped, changes take effect at publish, certain settings are one-way doors, some settings only affect builds before first publish, and memory changes carry availability/cost risks. These disclosures are exactly the kind of mutation-side effects an agent needs for safe invocation.

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 content is valuable and mostly earns its place, but it is presented as one enormous, dense paragraph rather than a structured reference with clear sections. It is front-loaded with the basic purpose, yet the long run-on presentation makes it harder to scan than necessary for a 10-parameter tool with this much complexity.

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?

Given the tool's complexity, nested objects, high schema coverage, and lack of an output schema, the description is unusually complete. It covers activation timing, validation behavior, safety prerequisites, alternatives for related edits, and nuanced per-setting constraints that an agent would otherwise miss.

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

Parameters5/5

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

Schema coverage is already 90%, and the description still adds critical meaning, especially for the generic `updates` object whose allowed keys are not enumerated in the schema. It explains value forms, null-reset behavior, nested merge/replace semantics, and prerequisites for complex parameters such as `shareTarget`, `nativeSystemBars`, `dependencyOverrides`, and `securityHeaders`.

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 description opens with a specific verb and resource: it updates project settings/metadata. It also points to `list_files` for current values and names related tools (`publish_app`, `write_file`, `edit_file`) for adjacent operations, making its role clear among siblings.

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?

It gives explicit when-to-use and when-not-to-use guidance for multiple settings, including hard warnings like never changing `serverMemoryMb` without an explicit user request and understanding the trade-off. It also directs the agent to read specific guides before changing complex settings and distinguishes when to edit `static/__dev/native` files directly instead.

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