Skip to main content
Glama

Deploy app

deploy_app
Destructive

Call this tool to publish or update an app at a public URL. Strictly follow get_deploy_instructions preflight, hard rules and workflow. Pass app_name, app_type, model and intent. New apps also need app_id:null, description, frontend_template and text files; optionally bind resource_upload_ids and secret_entry_ids. Updates/retries use app_id with files/diffs and deletePaths, or omit edits to retry saved source. Updates can overwrite source files and replace the running deployment. Optional: initiator, type. MCP version 2.12.

Tool call template

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

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "app_type": "<app_type>",
      "app_name": "<app_name>"
    },
    "name": "deploy_app"
  }
}

Input Schema

NameRequiredDescriptionDefault
typeNoOptional deploy change type, for example 'fix', 'feature', 'refactor', 'performance', 'test', 'docs', 'chore', or 'style'.
filesNoText source files and diffs. Omit for an existing-app redeploy of the saved source snapshot.
modelNoCoding model used; use 'chat' if unknown.
app_idNoMANDATORY: existing app id to update, or null for new app
intentNoShort summary of the requested app change.
app_nameYesshort display name
app_typeYesapp architecture: frontend-only or frontend+backend
initiatorNoRequest initiator, e.g. user or agent.
deletePathsNoPaths to delete. ONLY for updates (app_id required). Cannot delete package.json or framework entry points.
descriptionNoshort description of what the app does
mcp_versionNoSet to "2.12", the MCP version in this tool's description. Use this tool's version, not another tool's version.
secret_entry_idsNoSubmitted secret entry IDs for a new app. Existing apps use set_app_secrets.
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_upload_idsNoCompleted upload IDs to bind when creating a new app. Existing apps use set_app_resources.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / mcp_version / description
      Previous value: -"Set to \"2.11.7\", the MCP version in this tool's description. Use this tool's version, not another tool's version."New value: +"Set to \"2.12\", the MCP version in this tool's description. Use this tool's version, not another tool's version."
  2. Changed1 schema field changed
    • changedInput schema / properties / mcp_version / description
      Previous value: -"Set to \"2.11.0\", the MCP version in this tool's description. Use this tool's version, not another tool's version."New value: +"Set to \"2.11.7\", the MCP version in this tool's description. Use this tool's version, not another tool's version."
  3. Changed15 schema fields changed
    • changedInput schema / additionalProperties
      Previous value: -{}New value: +false
    • changedInput schema / properties / deletePaths / description
      Previous 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."New value: +"Paths to delete. ONLY for updates (app_id required). Cannot delete package.json or framework entry points."
    • removedInput schema / properties / features
      Removed 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"
      -    }
      -  ],
      -  "description": "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 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": {},
      +      "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 source content; JSON objects are accepted for JSON files."
      +        },
      +        "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"
      +            }
      +          ]
      +        },
      +        "encoding": {
      +          "anyOf": [
      +            {
      +              "const": "utf-8",
      +              "type": "string"
      +            },
      +            {
      +              "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: +"Text source files and diffs. Omit for an existing-app redeploy of the saved source snapshot."
    • removedInput schema / properties / finalize_resources
      Removed 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"
      -}
    • changedInput schema / properties / initiator / description
      Previous value: -"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."New value: +"Request initiator, e.g. user or agent."
    • changedInput schema / properties / intent / description
      Previous 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'."New value: +"Short summary of the requested app change."
    • addedInput schema / properties / mcp_version
      Added value: +{
      +  "description": "Set to \"2.11.0\", the MCP version in this tool's description. Use this tool's version, not another tool's version.",
      +  "maxLength": 32,
      +  "minLength": 1,
      +  "pattern": "^\\d+\\.\\d+(?:\\.\\d+)?$",
      +  "type": "string"
      +}
    • changedInput schema / properties / model / description
      Previous value: -"MANDATORY: LLM model name generating this deploy (e.g. 'claude-sonnet-4', 'gpt-4o'). If unavailable, use 'chat'."New value: +"Coding model used; use 'chat' if unknown."
    • removedInput schema / properties / resource_only
      Removed 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"
      -}
    • removedInput schema / properties / resource_requirements
      Removed 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 / resource_upload_ids
      Added value: +{
      +  "description": "Completed upload IDs to bind when creating a new app. Existing apps use set_app_resources.",
      +  "items": {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 20,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / secret_entry_ids / description
      Previous value: -"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."New value: +"Submitted secret entry IDs for a new app. Existing apps use set_app_secrets."
    • removedInput schema / properties / upload_id
      Removed 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."
      -}
  4. 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"
      +  }
      +]
  5. 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"
      +  }
      +]
  6. 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"
      +}
  7. 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."
  8. 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."
  9. 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"
      +  }
      +]
  10. 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"
      -]
  11. 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"
      +]
  12. First observed

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds needed context beyond them: updates 'can overwrite source files and replace the running deployment,' and an update with no edits silently redeploys the saved snapshot. That is real consequence disclosure. It omits permissions/auth and failure behavior, so 4 rather than 5.

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

Conciseness4/5

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

Front-loaded with the action and the preflight obligation, then the create/update parameter shapes; no filler sentences. It is dense to the point of being a run-on, and the phrase 'hard rules and workflow' is vague without saying what those rules are.

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 14-parameter mutation tool with no output schema, the description covers the critical decisions: create vs. update, edits vs. retry, file/diff/delete semantics, and the version handshake. It does not tell the agent what a successful deploy returns (URL, status), but no output schema exists so that gap is more forgivable here.

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?

With 100% schema coverage the baseline is 3, but the description adds conditional meaning the schema doesn't encode on its own: which parameters belong to the create path (app_id:null, description, frontend_template, secret_entry_ids, resource_upload_ids) versus the update path (app_id, files/diffs, deletePaths). It also states the required MCP version value ('2.12'), tying the mcp_version parameter to a concrete literal.

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 and resource — 'publish or update an app at a public URL' — and immediately splits the two modes (new app vs. update/retry) so an agent knows which shape applies. It names the required preflight sibling get_deploy_instructions, which distinguishes it from the other app tools.

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

Usage Guidelines4/5

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

Gives clear when-to-use guidance: new apps need app_id:null plus description/frontend_template/files; updates/retries use app_id with diffs/deletePaths, or omit edits to retry saved source. It mandates the get_deploy_instructions preflight, which is an explicit prerequisite. It lacks an explicit 'do not use for deletion, use delete_app' exclusion, so not a 5.

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