Skip to main content
Glama

Deploy app

deploy_app
Destructive

Deploy or update a website or web app to get a public URL. Text files only in files[]. files[] must be a JSON array, even for one file. Example: files: [{"filename":"src/App.tsx","content":"..."}]. Never pass a bare string or a single file object. Use files[] for inline text edits and diffs, not for copying large existing local file contents into tool params. Never inline or base64-encode binary assets/resources in files[]; use upload_assets first for images, fonts, media, PDFs, archives, and other client-supplied file assets, then pass upload_id. Format generated and edited source files as conventional, human-readable multi-line code; never minify or collapse an entire file onto one line. For JavaScript/TypeScript/JSX/TSX string literals, use single quotes wherever valid. If the app needs a custom PWA manifest, place it in public/manifest.json (or public/manifest.webmanifest) and link it from HTML as /manifest.json (or /manifest.webmanifest). Do not create a duplicate project-root manifest. Use /resources/... for public resource icons and / for a root-intended start_url and scope; preserve intentional launch routes and respect any hosting base path. Template files from get_app_template are auto-included as the baseline — use diffs[] to modify them; content is otherwise only for entirely new files. New apps: tests/tests.json is the intentional template-file exception and must be sent as a complete content replacement. New apps: set app_id to null, provide app_name, description, app_type, frontend_template, and features. Updates: provide existing app_id, features, and either changed files/deletePaths or upload_id. If upload_id is provided, do not also send files[] or deletePaths[]; the upload manifest owns all text changes, diffs, and delete operations. Rules: do not add @appdeploy/client or @appdeploy/sdk to package.json (platform-injected). SPAs must use HashRouter. Frontend must never import @appdeploy/sdk; backend must never import @appdeploy/client. Frontend must use api from @appdeploy/client for backend calls, never fetch() or axios. If frontend realtime is used, @appdeploy/client websocket usage is ws.connect() only; do not call ws.subscribe/ws.publish/ws.send directly on ws. After deploy, poll get_app_status every 5s until status is 'ready' or 'failed'. On a lifetime-limit error, stop deploy_app calls unless the account limit increases. The limit does not reset; show the returned upgrade link to the user. If get_app_status returns QA/e2e/runtime errors, attempt automatic fixes and redeploy up to 3 times before asking the user for guidance.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
typeNoOptional deploy change type, for example 'fix', 'feature', 'refactor', 'performance', 'test', 'docs', 'chore', or 'style'.
filesNoArray of text file edit objects. MUST be a JSON array, even for one file. Never pass a bare string or a single object. Example value: [{"filename":"src/App.tsx","content":"..."}]. Each item must include filename plus either content or diffs. Use files[] for inline text edits and diffs. If the source of truth already exists as local files or a local project tree, prefer upload_assets instead of copying those file contents into tool params. If upload_id is provided, do not also send files[] or deletePaths[]; the upload manifest owns all text changes, diffs, and delete operations. Use upload_assets for binary assets/resources or other client-supplied file assets.
modelNoMANDATORY: LLM model name generating this deploy (e.g. 'claude-sonnet-4', 'gpt-4o'). If unavailable, use 'chat'.
app_idNoMANDATORY: existing app id to update, or null for new app
intentNoMANDATORY: one-line summary of what changed (e.g. 'Add dark mode toggle', 'Fix login redirect bug'). If no specific intent was given, use 'app deploy'.
app_nameYesshort display name
app_typeYesapp architecture: frontend-only or frontend+backend
featuresNoSDK features used (from get_appdeploy_sdk_reference). Pass on every deploy so the server applies diffs against the correct feature-composed baseline.
initiatorNoOptional request initiator. Use 'user' when this call directly follows a user request. Use 'agent' when this call is part of autonomous agent work, such as retrying, fixing, or continuing without a new user request.
upload_idNoOpaque upload ID from upload_assets. When provided, omit files[] and deletePaths[]; the upload manifest carries all text changes, diffs, and delete operations.
deletePathsNoArray of relative paths to delete. MUST be a JSON array, even for one path. Example value: ["src/old-file.ts"]. If upload_id is provided, do not also send files[] or deletePaths[]; the upload manifest owns all text changes, diffs, and delete operations.
descriptionNoshort description of what the app does
resource_onlyNoFor an existing app_id with upload_id, set true to apply only binary public/resources/* files without redeploying app code. Failed snapshots accept partial batches; use finalize_resources after all required files are staged. Source edits are rejected.
secret_entry_idsNoOptional one-time secret entry ids to bind during a new-app deploy. Allowed only when app_id is omitted. For existing apps, use set_app_secrets instead.
frontend_templateNoREQUIRED when app_id is null. One of: 'html-static' (simple sites), 'react-vite' (SPAs, games), 'nextjs-static' (multi-page). Template files auto-included.
finalize_resourcesNoFor an existing failed source snapshot with all required resources staged, set true to validate and deploy the complete saved source without a dummy code edit. Omit files, deletePaths and upload_id. Full source validation still applies.
resource_requirementsNoOptional widget upload slot definitions for ChatGPT web/Claude web. Use this when users will provide large resources (images/PDF/media/fonts) after code generation. Code should reference these target_path placeholders so uploaded files resolve without further code edits.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • removedInput schema / properties / features / default
      Removed value: -[
      -  "api",
      -  "realtime",
      -  "auth",
      -  "notifications",
      -  "invites",
      -  "database",
      -  "storage",
      -  "secrets",
      -  "ai.generate",
      -  "ai.extract",
      -  "ai.ocr",
      -  "ai.classify",
      -  "ai.scrape",
      -  "ai.run",
      -  "ai.image",
      -  "cron"
      -]
    • changedInput schema / properties / files / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": {},
      -      "description": "One item inside files[]. Example with content: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Example with diffs: {\"filename\":\"src/App.tsx\",\"diffs\":[{\"from\":\"old\",\"to\":\"new\"}]}. Use this shape for inline text edits and diffs, not for copying large existing local file contents into tool params.",
      -      "properties": {
      -        "content": {
      -          "anyOf": [
      -            {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "additionalProperties": {},
      -                  "propertyNames": {
      -                    "type": "string"
      -                  },
      -                  "type": "object"
      -                }
      -              ],
      -              "description": "File contents. Use a string for text files; JSON object is allowed for .json files."
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Text file contents only. Use a string for text files; JSON object is allowed for .json files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      -        },
      -        "diffs": {
      -          "anyOf": [
      -            {
      -              "description": "Non-empty array of diff replacements. Use instead of content.",
      -              "items": {
      -                "additionalProperties": {},
      -                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      -                "properties": {
      -                  "from": {
      -                    "anyOf": [
      -                      {
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      -                  },
      -                  "multiple": {
      -                    "anyOf": [
      -                      {
      -                        "type": "boolean"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      -                  },
      -                  "to": {
      -                    "anyOf": [
      -                      {
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required replacement text (empty string deletes the match)."
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "filename": {
      -          "anyOf": [
      -            {
      -              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": {},
      +      "description": "One item inside files[]. Example with content: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Example with diffs: {\"filename\":\"src/App.tsx\",\"diffs\":[{\"from\":\"old\",\"to\":\"new\"}]}. Use this shape for inline text edits and diffs, not for copying large existing local file contents into tool params.",
      +      "properties": {
      +        "content": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "additionalProperties": {},
      +                  "propertyNames": {
      +                    "type": "string"
      +                  },
      +                  "type": "object"
      +                }
      +              ],
      +              "description": "File contents. Use a string for text files; JSON object is allowed for .json and .webmanifest files."
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Text file contents only. Use a string for text files; JSON object is allowed for .json and .webmanifest files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      +        },
      +        "diffs": {
      +          "anyOf": [
      +            {
      +              "description": "Non-empty array of diff replacements. Use instead of content.",
      +              "items": {
      +                "additionalProperties": {},
      +                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      +                "properties": {
      +                  "from": {
      +                    "anyOf": [
      +                      {
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      +                  },
      +                  "multiple": {
      +                    "anyOf": [
      +                      {
      +                        "type": "boolean"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      +                  },
      +                  "to": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required replacement text (empty string deletes the match)."
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "filename": {
      +          "anyOf": [
      +            {
      +              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed2 schema fields changed
    • addedInput schema / properties / features / default
      Added value: +[
      +  "api",
      +  "realtime",
      +  "auth",
      +  "notifications",
      +  "invites",
      +  "database",
      +  "storage",
      +  "secrets",
      +  "ai.generate",
      +  "ai.extract",
      +  "ai.ocr",
      +  "ai.classify",
      +  "ai.scrape",
      +  "ai.run",
      +  "ai.image",
      +  "cron"
      +]
    • changedInput schema / properties / files / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": {},
      -      "description": "One item inside files[]. Example with content: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Example with diffs: {\"filename\":\"src/App.tsx\",\"diffs\":[{\"from\":\"old\",\"to\":\"new\"}]}. Use this shape for inline text edits and diffs, not for copying large existing local file contents into tool params.",
      -      "properties": {
      -        "content": {
      -          "anyOf": [
      -            {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "additionalProperties": {},
      -                  "propertyNames": {
      -                    "type": "string"
      -                  },
      -                  "type": "object"
      -                }
      -              ],
      -              "description": "File contents. Use a string for text files; JSON object is allowed for .json and .webmanifest files."
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Text file contents only. Use a string for text files; JSON object is allowed for .json and .webmanifest files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      -        },
      -        "diffs": {
      -          "anyOf": [
      -            {
      -              "description": "Non-empty array of diff replacements. Use instead of content.",
      -              "items": {
      -                "additionalProperties": {},
      -                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      -                "properties": {
      -                  "from": {
      -                    "anyOf": [
      -                      {
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      -                  },
      -                  "multiple": {
      -                    "anyOf": [
      -                      {
      -                        "type": "boolean"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      -                  },
      -                  "to": {
      -                    "anyOf": [
      -                      {
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required replacement text (empty string deletes the match)."
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "filename": {
      -          "anyOf": [
      -            {
      -              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": {},
      +      "description": "One item inside files[]. Example with content: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Example with diffs: {\"filename\":\"src/App.tsx\",\"diffs\":[{\"from\":\"old\",\"to\":\"new\"}]}. Use this shape for inline text edits and diffs, not for copying large existing local file contents into tool params.",
      +      "properties": {
      +        "content": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "additionalProperties": {},
      +                  "propertyNames": {
      +                    "type": "string"
      +                  },
      +                  "type": "object"
      +                }
      +              ],
      +              "description": "File contents. Use a string for text files; JSON object is allowed for .json files."
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Text file contents only. Use a string for text files; JSON object is allowed for .json files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      +        },
      +        "diffs": {
      +          "anyOf": [
      +            {
      +              "description": "Non-empty array of diff replacements. Use instead of content.",
      +              "items": {
      +                "additionalProperties": {},
      +                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      +                "properties": {
      +                  "from": {
      +                    "anyOf": [
      +                      {
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      +                  },
      +                  "multiple": {
      +                    "anyOf": [
      +                      {
      +                        "type": "boolean"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      +                  },
      +                  "to": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required replacement text (empty string deletes the match)."
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "filename": {
      +          "anyOf": [
      +            {
      +              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed2 schema fields changed
    • addedInput schema / properties / finalize_resources
      Added value: +{
      +  "description": "For an existing failed source snapshot with all required resources staged, set true to validate and deploy the complete saved source without a dummy code edit. Omit files, deletePaths and upload_id. Full source validation still applies.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / resource_only
      Added value: +{
      +  "description": "For an existing app_id with upload_id, set true to apply only binary public/resources/* files without redeploying app code. Failed snapshots accept partial batches; use finalize_resources after all required files are staged. Source edits are rejected.",
      +  "type": "boolean"
      +}
  4. Changed3 schema fields changed
    • changedInput schema / properties / features / description
      Previous value: -"SDK features used (from get_appdeploy_sdk_reference). Pass on every deploy so the server applies edits against the correct feature-composed baseline."New value: +"SDK features used (from get_appdeploy_sdk_reference). Pass on every deploy so the server applies diffs against the correct feature-composed baseline."
    • changedInput schema / properties / files / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": {},
      -      "description": "One item inside files[]. Example full replacement: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Follow get_deploy_instructions for incremental edits; legacy diffs[] are also accepted. Use this shape for inline text edits, not for copying large existing local file contents into tool params.",
      -      "properties": {
      -        "content": {
      -          "anyOf": [
      -            {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "additionalProperties": {},
      -                  "propertyNames": {
      -                    "type": "string"
      -                  },
      -                  "type": "object"
      -                }
      -              ],
      -              "description": "Text file content or a supported inline edit. Follow get_deploy_instructions for the edit format; JSON object is allowed for .json and .webmanifest files."
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Text file content or a supported inline edit. Follow get_deploy_instructions for the edit format; JSON object is allowed for .json and .webmanifest files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      -        },
      -        "diffs": {
      -          "anyOf": [
      -            {
      -              "description": "Non-empty array of diff replacements. Use instead of content.",
      -              "items": {
      -                "additionalProperties": {},
      -                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      -                "properties": {
      -                  "from": {
      -                    "anyOf": [
      -                      {
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      -                  },
      -                  "multiple": {
      -                    "anyOf": [
      -                      {
      -                        "type": "boolean"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      -                  },
      -                  "to": {
      -                    "anyOf": [
      -                      {
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required replacement text (empty string deletes the match)."
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "filename": {
      -          "anyOf": [
      -            {
      -              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": {},
      +      "description": "One item inside files[]. Example with content: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Example with diffs: {\"filename\":\"src/App.tsx\",\"diffs\":[{\"from\":\"old\",\"to\":\"new\"}]}. Use this shape for inline text edits and diffs, not for copying large existing local file contents into tool params.",
      +      "properties": {
      +        "content": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "additionalProperties": {},
      +                  "propertyNames": {
      +                    "type": "string"
      +                  },
      +                  "type": "object"
      +                }
      +              ],
      +              "description": "File contents. Use a string for text files; JSON object is allowed for .json and .webmanifest files."
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Text file contents only. Use a string for text files; JSON object is allowed for .json and .webmanifest files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      +        },
      +        "diffs": {
      +          "anyOf": [
      +            {
      +              "description": "Non-empty array of diff replacements. Use instead of content.",
      +              "items": {
      +                "additionalProperties": {},
      +                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      +                "properties": {
      +                  "from": {
      +                    "anyOf": [
      +                      {
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      +                  },
      +                  "multiple": {
      +                    "anyOf": [
      +                      {
      +                        "type": "boolean"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      +                  },
      +                  "to": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required replacement text (empty string deletes the match)."
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "filename": {
      +          "anyOf": [
      +            {
      +              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / files / description
      Previous value: -"Array of text file edit objects. MUST be a JSON array, even for one file. Never pass a bare string or a single object. Example value: [{\"filename\":\"src/App.tsx\",\"content\":\"...\"}]. Each item must include filename plus either content or diffs. Use files[] for inline text edits; follow get_deploy_instructions for the incremental edit format. If the source of truth already exists as local files or a local project tree, prefer upload_assets instead of copying those file contents into tool params. If upload_id is provided, do not also send files[] or deletePaths[]; the upload manifest owns all text changes, diffs, and delete operations. Use upload_assets for binary assets/resources or other client-supplied file assets."New value: +"Array of text file edit objects. MUST be a JSON array, even for one file. Never pass a bare string or a single object. Example value: [{\"filename\":\"src/App.tsx\",\"content\":\"...\"}]. Each item must include filename plus either content or diffs. Use files[] for inline text edits and diffs. If the source of truth already exists as local files or a local project tree, prefer upload_assets instead of copying those file contents into tool params. If upload_id is provided, do not also send files[] or deletePaths[]; the upload manifest owns all text changes, diffs, and delete operations. Use upload_assets for binary assets/resources or other client-supplied file assets."
  5. Changed3 schema fields changed
    • changedInput schema / properties / features / description
      Previous value: -"SDK features used (from get_appdeploy_sdk_reference). Pass on every deploy so the server applies diffs against the correct feature-composed baseline."New value: +"SDK features used (from get_appdeploy_sdk_reference). Pass on every deploy so the server applies edits against the correct feature-composed baseline."
    • changedInput schema / properties / files / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": {},
      -      "description": "One item inside files[]. Example with content: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Example with diffs: {\"filename\":\"src/App.tsx\",\"diffs\":[{\"from\":\"old\",\"to\":\"new\"}]}. Use this shape for inline text edits and diffs, not for copying large existing local file contents into tool params.",
      -      "properties": {
      -        "content": {
      -          "anyOf": [
      -            {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "additionalProperties": {},
      -                  "propertyNames": {
      -                    "type": "string"
      -                  },
      -                  "type": "object"
      -                }
      -              ],
      -              "description": "File contents. Use a string for text files; JSON object is allowed for .json and .webmanifest files."
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Text file contents only. Use a string for text files; JSON object is allowed for .json and .webmanifest files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      -        },
      -        "diffs": {
      -          "anyOf": [
      -            {
      -              "description": "Non-empty array of diff replacements. Use instead of content.",
      -              "items": {
      -                "additionalProperties": {},
      -                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      -                "properties": {
      -                  "from": {
      -                    "anyOf": [
      -                      {
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      -                  },
      -                  "multiple": {
      -                    "anyOf": [
      -                      {
      -                        "type": "boolean"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      -                  },
      -                  "to": {
      -                    "anyOf": [
      -                      {
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required replacement text (empty string deletes the match)."
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "filename": {
      -          "anyOf": [
      -            {
      -              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": {},
      +      "description": "One item inside files[]. Example full replacement: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Follow get_deploy_instructions for incremental edits; legacy diffs[] are also accepted. Use this shape for inline text edits, not for copying large existing local file contents into tool params.",
      +      "properties": {
      +        "content": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "additionalProperties": {},
      +                  "propertyNames": {
      +                    "type": "string"
      +                  },
      +                  "type": "object"
      +                }
      +              ],
      +              "description": "Text file content or a supported inline edit. Follow get_deploy_instructions for the edit format; JSON object is allowed for .json and .webmanifest files."
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Text file content or a supported inline edit. Follow get_deploy_instructions for the edit format; JSON object is allowed for .json and .webmanifest files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      +        },
      +        "diffs": {
      +          "anyOf": [
      +            {
      +              "description": "Non-empty array of diff replacements. Use instead of content.",
      +              "items": {
      +                "additionalProperties": {},
      +                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      +                "properties": {
      +                  "from": {
      +                    "anyOf": [
      +                      {
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      +                  },
      +                  "multiple": {
      +                    "anyOf": [
      +                      {
      +                        "type": "boolean"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      +                  },
      +                  "to": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required replacement text (empty string deletes the match)."
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "filename": {
      +          "anyOf": [
      +            {
      +              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / files / description
      Previous value: -"Array of text file edit objects. MUST be a JSON array, even for one file. Never pass a bare string or a single object. Example value: [{\"filename\":\"src/App.tsx\",\"content\":\"...\"}]. Each item must include filename plus either content or diffs. Use files[] for inline text edits and diffs. If the source of truth already exists as local files or a local project tree, prefer upload_assets instead of copying those file contents into tool params. If upload_id is provided, do not also send files[] or deletePaths[]; the upload manifest owns all text changes, diffs, and delete operations. Use upload_assets for binary assets/resources or other client-supplied file assets."New value: +"Array of text file edit objects. MUST be a JSON array, even for one file. Never pass a bare string or a single object. Example value: [{\"filename\":\"src/App.tsx\",\"content\":\"...\"}]. Each item must include filename plus either content or diffs. Use files[] for inline text edits; follow get_deploy_instructions for the incremental edit format. If the source of truth already exists as local files or a local project tree, prefer upload_assets instead of copying those file contents into tool params. If upload_id is provided, do not also send files[] or deletePaths[]; the upload manifest owns all text changes, diffs, and delete operations. Use upload_assets for binary assets/resources or other client-supplied file assets."
  6. Changed1 schema field changed
    • changedInput schema / properties / files / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": {},
      -      "description": "One item inside files[]. Example with content: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Example with diffs: {\"filename\":\"src/App.tsx\",\"diffs\":[{\"from\":\"old\",\"to\":\"new\"}]}. Use this shape for inline text edits and diffs, not for copying large existing local file contents into tool params.",
      -      "properties": {
      -        "content": {
      -          "anyOf": [
      -            {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "additionalProperties": {},
      -                  "propertyNames": {
      -                    "type": "string"
      -                  },
      -                  "type": "object"
      -                }
      -              ],
      -              "description": "File contents. Use a string for text files; JSON object is allowed for .json files."
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Text file contents only. Use a string for text files; JSON object is allowed for .json files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      -        },
      -        "diffs": {
      -          "anyOf": [
      -            {
      -              "description": "Non-empty array of diff replacements. Use instead of content.",
      -              "items": {
      -                "additionalProperties": {},
      -                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      -                "properties": {
      -                  "from": {
      -                    "anyOf": [
      -                      {
      -                        "minLength": 1,
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      -                  },
      -                  "multiple": {
      -                    "anyOf": [
      -                      {
      -                        "type": "boolean"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      -                  },
      -                  "to": {
      -                    "anyOf": [
      -                      {
      -                        "type": "string"
      -                      },
      -                      {
      -                        "type": "null"
      -                      }
      -                    ],
      -                    "description": "Required replacement text (empty string deletes the match)."
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "filename": {
      -          "anyOf": [
      -            {
      -              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": {},
      +      "description": "One item inside files[]. Example with content: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Example with diffs: {\"filename\":\"src/App.tsx\",\"diffs\":[{\"from\":\"old\",\"to\":\"new\"}]}. Use this shape for inline text edits and diffs, not for copying large existing local file contents into tool params.",
      +      "properties": {
      +        "content": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "additionalProperties": {},
      +                  "propertyNames": {
      +                    "type": "string"
      +                  },
      +                  "type": "object"
      +                }
      +              ],
      +              "description": "File contents. Use a string for text files; JSON object is allowed for .json and .webmanifest files."
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Text file contents only. Use a string for text files; JSON object is allowed for .json and .webmanifest files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      +        },
      +        "diffs": {
      +          "anyOf": [
      +            {
      +              "description": "Non-empty array of diff replacements. Use instead of content.",
      +              "items": {
      +                "additionalProperties": {},
      +                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      +                "properties": {
      +                  "from": {
      +                    "anyOf": [
      +                      {
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      +                  },
      +                  "multiple": {
      +                    "anyOf": [
      +                      {
      +                        "type": "boolean"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      +                  },
      +                  "to": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required replacement text (empty string deletes the match)."
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "filename": {
      +          "anyOf": [
      +            {
      +              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  7. Changed1 schema field changed
    • removedInput schema / properties / features / default
      Removed value: -[
      -  "api",
      -  "realtime",
      -  "auth",
      -  "notifications",
      -  "invites",
      -  "database",
      -  "storage",
      -  "secrets",
      -  "ai.generate",
      -  "ai.extract",
      -  "ai.ocr",
      -  "ai.classify",
      -  "ai.scrape",
      -  "ai.run",
      -  "ai.image",
      -  "cron"
      -]
  8. Changed28 schema fields changed
    • changedInput schema / additionalProperties
      Previous value: -falseNew value: +{}
    • changedInput schema / properties / app_id / description
      Previous value: -"existing app id to update, or null for new app"New value: +"MANDATORY: existing app id to update, or null for new app"
    • addedInput schema / properties / deletePaths / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / deletePaths / description
      Previous value: -"Paths to delete. ONLY for updates (app_id required). Cannot delete package.json or framework entry points."New value: +"Array of relative paths to delete. MUST be a JSON array, even for one path. Example value: [\"src/old-file.ts\"]. If upload_id is provided, do not also send files[] or deletePaths[]; the upload manifest owns all text changes, diffs, and delete operations."
    • removedInput schema / properties / deletePaths / items
      Removed value: -{
      -  "minLength": 1,
      -  "type": "string"
      -}
    • removedInput schema / properties / deletePaths / type
      Removed value: -"array"
    • addedInput schema / properties / description / anyOf
      Added value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / description / minLength
      Removed value: -1
    • removedInput schema / properties / description / type
      Removed value: -"string"
    • addedInput schema / properties / features
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "enum": [
      +          "api",
      +          "realtime",
      +          "auth",
      +          "notifications",
      +          "invites",
      +          "database",
      +          "storage",
      +          "secrets",
      +          "ai.generate",
      +          "ai.extract",
      +          "ai.ocr",
      +          "ai.classify",
      +          "ai.scrape",
      +          "ai.run",
      +          "ai.image",
      +          "cron"
      +        ],
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": [
      +    "api",
      +    "realtime",
      +    "auth",
      +    "notifications",
      +    "invites",
      +    "database",
      +    "storage",
      +    "secrets",
      +    "ai.generate",
      +    "ai.extract",
      +    "ai.ocr",
      +    "ai.classify",
      +    "ai.scrape",
      +    "ai.run",
      +    "ai.image",
      +    "cron"
      +  ],
      +  "description": "SDK features used (from get_appdeploy_sdk_reference). Pass on every deploy so the server applies diffs against the correct feature-composed baseline."
      +}
    • addedInput schema / properties / files / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "additionalProperties": {},
      +      "description": "One item inside files[]. Example with content: {\"filename\":\"src/App.tsx\",\"content\":\"...\"}. Example with diffs: {\"filename\":\"src/App.tsx\",\"diffs\":[{\"from\":\"old\",\"to\":\"new\"}]}. Use this shape for inline text edits and diffs, not for copying large existing local file contents into tool params.",
      +      "properties": {
      +        "content": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "additionalProperties": {},
      +                  "propertyNames": {
      +                    "type": "string"
      +                  },
      +                  "type": "object"
      +                }
      +              ],
      +              "description": "File contents. Use a string for text files; JSON object is allowed for .json files."
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Text file contents only. Use a string for text files; JSON object is allowed for .json files. Use upload_assets for binary assets/resources, or when direct upload is available and the source of truth already exists as local files or a local project tree."
      +        },
      +        "diffs": {
      +          "anyOf": [
      +            {
      +              "description": "Non-empty array of diff replacements. Use instead of content.",
      +              "items": {
      +                "additionalProperties": {},
      +                "description": "One diff replacement. Required fields: from, to. Optional field: multiple.",
      +                "properties": {
      +                  "from": {
      +                    "anyOf": [
      +                      {
      +                        "minLength": 1,
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required text to find (exact match, non-empty). Must be unique unless multiple=true."
      +                  },
      +                  "multiple": {
      +                    "anyOf": [
      +                      {
      +                        "type": "boolean"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Optional. Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails."
      +                  },
      +                  "to": {
      +                    "anyOf": [
      +                      {
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ],
      +                    "description": "Required replacement text (empty string deletes the match)."
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "filename": {
      +          "anyOf": [
      +            {
      +              "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / files / description
      Previous value: -"Files to write. NEW APPS: only custom files + diffs to template files. UPDATES: only changed files using diffs[]. At least one of files[] or deletePaths[] required."New value: +"Array of text file edit objects. MUST be a JSON array, even for one file. Never pass a bare string or a single object. Example value: [{\"filename\":\"src/App.tsx\",\"content\":\"...\"}]. Each item must include filename plus either content or diffs. Use files[] for inline text edits and diffs. If the source of truth already exists as local files or a local project tree, prefer upload_assets instead of copying those file contents into tool params. If upload_id is provided, do not also send files[] or deletePaths[]; the upload manifest owns all text changes, diffs, and delete operations. Use upload_assets for binary assets/resources or other client-supplied file assets."
    • removedInput schema / properties / files / items
      Removed value: -{
      -  "properties": {
      -    "content": {
      -      "description": "Full file contents (string; JSON object allowed for .json files)"
      -    },
      -    "diffs": {
      -      "description": "Array of {from,to,multiple?} replacements (use instead of content)",
      -      "items": {
      -        "properties": {
      -          "from": {
      -            "description": "Text to find (exact match, non-empty). Must be unique unless multiple=true.",
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "multiple": {
      -            "description": "Replace all matches (default false). Verify 'from' appears only once; if it appears multiple times and you want to replace all, set multiple=true or the request fails.",
      -            "type": "boolean"
      -          },
      -          "to": {
      -            "description": "Replacement text (empty string deletes the match)",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "from",
      -          "to"
      -        ],
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "encoding": {
      -      "description": "'base64' for binary files, otherwise 'utf-8'",
      -      "enum": [
      -        "utf-8",
      -        "base64"
      -      ],
      -      "type": "string"
      -    },
      -    "file": {
      -      "description": "alias of filename",
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "filename": {
      -      "description": "full relative path (e.g. 'public/index.html', 'src/main.tsx', 'backend/index.ts')",
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "mimeType": {
      -      "description": "Optional MIME type hint (e.g., image/png)",
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "name": {
      -      "description": "alias of filename",
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "path": {
      -      "description": "alias of filename",
      -      "minLength": 1,
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}
    • removedInput schema / properties / files / type
      Removed value: -"array"
    • addedInput schema / properties / initiator
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Optional request initiator. Use 'user' when this call directly follows a user request. Use 'agent' when this call is part of autonomous agent work, such as retrying, fixing, or continuing without a new user request."
      +}
    • addedInput schema / properties / intent / anyOf
      Added value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / intent / description
      Previous value: -"The intent of this deployment. User-initiated examples: 'initial app deploy', 'bugfix - ui is too noisy'. Agent-initiated examples: 'agent fixing deployment error', 'agent retry after lint failure'"New value: +"MANDATORY: one-line summary of what changed (e.g. 'Add dark mode toggle', 'Fix login redirect bug'). If no specific intent was given, use 'app deploy'."
    • removedInput schema / properties / intent / minLength
      Removed value: -1
    • removedInput schema / properties / intent / type
      Removed value: -"string"
    • addedInput schema / properties / model / anyOf
      Added value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / model / description
      Previous value: -"The coding agent model used for this deployment, to the best of your knowledge. Examples: 'codex-5.3', 'chatgpt', 'opus 4.6', 'claude-sonnet-4-5', 'gemini-2.5-pro'"New value: +"MANDATORY: LLM model name generating this deploy (e.g. 'claude-sonnet-4', 'gpt-4o'). If unavailable, use 'chat'."
    • removedInput schema / properties / model / minLength
      Removed value: -1
    • removedInput schema / properties / model / type
      Removed value: -"string"
    • addedInput schema / properties / resource_requirements
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "properties": {
      +          "accept": {
      +            "anyOf": [
      +              {
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Optional file picker accept filter (for example 'image/*' or 'application/pdf')."
      +          },
      +          "name": {
      +            "description": "User-facing label for this requested resource (for widget slot UI).",
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "required": {
      +            "anyOf": [
      +              {
      +                "type": "boolean"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Whether this slot is required before upload. Defaults to true."
      +          },
      +          "target_path": {
      +            "description": "App-relative placeholder path to reference in code. Use deterministic paths under 'public/resources/...'.",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "target_path"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Optional widget upload slot definitions for ChatGPT web/Claude web. Use this when users will provide large resources (images/PDF/media/fonts) after code generation. Code should reference these target_path placeholders so uploaded files resolve without further code edits."
      +}
    • addedInput schema / properties / secret_entry_ids
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "description": "Opaque one-time secret entry id.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Optional one-time secret entry ids to bind during a new-app deploy. Allowed only when app_id is omitted. For existing apps, use set_app_secrets instead."
      +}
    • addedInput schema / properties / type
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Optional deploy change type, for example 'fix', 'feature', 'refactor', 'performance', 'test', 'docs', 'chore', or 'style'."
      +}
    • addedInput schema / properties / upload_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Opaque upload ID from upload_assets. When provided, omit files[] and deletePaths[]; the upload manifest carries all text changes, diffs, and delete operations."
      +}
    • changedInput schema / required
      Previous value: -[
      -  "app_id",
      -  "app_type",
      -  "app_name",
      -  "model",
      -  "intent"
      -]New value: +[
      +  "app_type",
      +  "app_name"
      +]
  9. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructive/openWorld/non-idempotent, but the description goes far beyond them: post-deploy polling of get_app_status every 5s, lifetime-limit error handling ('stop deploy_app calls, limit does not reset, show upgrade link'), and automatic-fix-retry-up-to-3-times policy on QA failures. These are behavioral traits an agent could not infer from the annotations.

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?

Front-loaded with a clear opening sentence, but the body is a dense, unstructured run-on that mixes parameter guidance, code conventions, import rules, and lifecycle policy without headers or grouping. Most sentences carry real information, so it is not padded, but the wall-of-text form hurts scannability.

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 17-parameter deployment tool with no output schema, the description covers the full lifecycle: inputs, template baseline, post-deploy polling, failure handling, and resource staging. It stops short of describing what deploy_app itself returns (app_id/handle), but the referenced get_app_status fills that role well enough.

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 already 100%, so the baseline is 3, but the description adds conventions the schema lacks: files[] must be a JSON array even for one file, diffs[] vs content usage, template auto-inclusion, and code-formatting rules (single quotes, multi-line, no minification). Useful additions beyond the structured fields.

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?

States a specific verb+resource+outcome: 'Deploy or update a website or web app to get a public URL.' It distinguishes itself from siblings by naming upload_assets, get_app_template, and get_app_status as adjacent steps. An agent knows immediately this is the build/publish action.

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?

Explicitly separates new-app flow (app_id null, provide app_name/description/app_type/frontend_template/features) from update flow, and states when to use files[] vs upload_assets vs upload_id, plus the mutual-exclusion rule between upload_id and files[]/deletePaths[]. Alternatives and exclusions are named, not implied.

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