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. 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
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.
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. 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."
  2. 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."
  3. 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"
      +  }
      +]
  4. 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"
      -]
  5. 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"
      +]
  6. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already carry the safety profile (destructiveHint=true, readOnlyHint=false), and the description adds substantial behavioral context beyond them: diff replacement fails unless 'from' is unique or multiple=true, template files are auto-included as a baseline, certain packages are platform-injected, and repeated calls stop on lifetime-limit errors. No contradiction with annotations exists.

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 description is well-structured and front-loads the most critical constraint (files[] must be a JSON array), but it is very long for a tool description. Peripheral code-style rules (never minify, prefer single quotes for JS/TS string literals) are code-generation preferences rather than invocation semantics and could be moved elsewhere. Still dense and purposeful overall.

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 15-parameter, two-mode tool with no output schema, the description covers nearly everything an agent needs: required parameter sets per mode, exclusions, constraint violations, error handling, polling cadence, and retry limits. The one gap is the deploy_app response value itself, though the polling instruction implies that status is obtained via get_app_status rather than the deploy response.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema by encoding combination rules the schema cannot express: which parameters are required for new apps vs updates, the mutual exclusivity of upload_id with files[]/deletePaths[], and the mandatory JSON-array shape for files[] with a concrete example.

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

Purpose5/5

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

The opening sentence states a specific verb (deploy/update), resource (website/web app), and outcome (get a public URL). It then splits the operation into new-app vs update modes, making the tool's single purpose — publish or refresh an app — unambiguous and clearly distinct from siblings like upload_assets or get_app_status.

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?

The description gives explicit when/when-not guidance: use upload_assets for binary assets versus files[] for inline text, use diffs[] only for template files, and use either changed files/deletePaths or upload_id but never both. It also names sibling tools directly (get_app_template, get_app_status, upload_assets) and prescribes the exact post-deploy polling and retry protocol.

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