Skip to main content
Glama

Update app settings

update_app
Idempotent

An app's bundle ids / package name / site domain, the reply time users are promised (e.g. "3 working days"), and its store pages / site (the button in emails). Owners only. Agent reply mode is set by a person in the dashboard.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNoRenames the app (users see it in the chat).
linksNoThe app's App Store / Play Store page and site (https), the button in emails to users. Empty removes one.
app_idNoThe app's id (from list_apps). Optional when there is only one.
deep_linkNoOpens the app from the button in emails: the app's URL scheme, e.g. yourapp://devreply (or an https universal / app link). Set it after the app calls DevReply.handle(url) for it (see the setup guide). Empty removes it.
bundle_idsNoBundle ID, package name or site domain by platform; only those given change. Empty removes one.
reply_withinNoThe reply time users are promised (the chat translates it).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesThe app's id.
nameYesThe app's name, as users see it in the chat.
pushYesPush setup (never the keys themselves).
linksYesStore pages and site by platform (ios, android, web): the button in emails.
usersYesThe app's users (not deleted or archived).
icon_urlYesThe app's icon, or null when none is set.
installsYesDevices that ever opened the chat.
deep_linkYesThe URL that opens the app from emails, or null.
platformsYesIts platforms: ios, android, web.
bundle_idsYesBundle ID, package name or site domain by platform, e.g. {"ios": "com.example.app"}.
public_keysYesActive public keys, one or more per platform.
setup_guideYesThe setup guide's URL, or null before the app has a platform.
reply_withinYesThe same as a preset: hour, hours, day, 2_days, 3_working_days or week.
agent_repliesYesWhat agents may do with reply_to_user: off, draft or send (set by a person in the dashboard).
waiting_on_teamYesOpen conversations whose last message is the user's.
open_conversationsYesConversations not resolved.
reply_time_promisedYesThe reply time users are promised, in English, e.g. "a day".
deep_link_seen_working_atYesWhen the app last opened a DevReply link, or null if never.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • addedInput schema / properties / bundle_ids / description
      Added value: +"Bundle ID, package name or site domain by platform; only those given change. Empty removes one."
    • addedInput schema / properties / bundle_ids / properties / android / description
      Added value: +"The Android package name, e.g. com.example.app."
    • addedInput schema / properties / bundle_ids / properties / ios / description
      Added value: +"The iOS bundle ID, e.g. com.example.app."
    • addedInput schema / properties / bundle_ids / properties / web / description
      Added value: +"The site's domain, e.g. example.com."
    • addedInput schema / properties / links / properties / android / description
      Added value: +"The Play Store page, e.g. https://play.google.com/store/apps/details?id=com.example.app."
    • addedInput schema / properties / links / properties / ios / description
      Added value: +"The App Store page, e.g. https://apps.apple.com/app/id123456789."
    • addedInput schema / properties / links / properties / web / description
      Added value: +"The app's site, e.g. https://example.com."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "agent_replies": {
      +      "description": "What agents may do with reply_to_user: off, draft or send (set by a person in the dashboard).",
      +      "type": "string"
      +    },
      +    "bundle_ids": {
      +      "description": "Bundle ID, package name or site domain by platform, e.g. {\"ios\": \"com.example.app\"}.",
      +      "type": "object"
      +    },
      +    "deep_link": {
      +      "description": "The URL that opens the app from emails, or null.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "deep_link_seen_working_at": {
      +      "description": "When the app last opened a DevReply link, or null if never.",
      +      "format": "date-time",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "icon_url": {
      +      "description": "The app's icon, or null when none is set.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "id": {
      +      "description": "The app's id.",
      +      "format": "uuid",
      +      "type": "string"
      +    },
      +    "installs": {
      +      "description": "Devices that ever opened the chat.",
      +      "type": "integer"
      +    },
      +    "links": {
      +      "description": "Store pages and site by platform (ios, android, web): the button in emails.",
      +      "type": "object"
      +    },
      +    "name": {
      +      "description": "The app's name, as users see it in the chat.",
      +      "type": "string"
      +    },
      +    "open_conversations": {
      +      "description": "Conversations not resolved.",
      +      "type": "integer"
      +    },
      +    "platforms": {
      +      "description": "Its platforms: ios, android, web.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "public_keys": {
      +      "description": "Active public keys, one or more per platform.",
      +      "items": {
      +        "description": "A platform's public key (pk_), the one the app's code uses.",
      +        "properties": {
      +          "key": {
      +            "description": "The public key, pk_…",
      +            "type": "string"
      +          },
      +          "platform": {
      +            "description": "ios, android or web.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "platform",
      +          "key"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "push": {
      +      "description": "Push setup (never the keys themselves).",
      +      "properties": {
      +        "android": {
      +          "description": "The Firebase service account, or null when none is uploaded.",
      +          "properties": {
      +            "client_email": {
      +              "description": "The service account's email.",
      +              "type": "string"
      +            },
      +            "last_error": {
      +              "description": "The last error from the push service, if any.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "last_sent_at": {
      +              "description": "The last push sent with this service account.",
      +              "format": "date-time",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "project_id": {
      +              "description": "The Firebase project id.",
      +              "type": "string"
      +            },
      +            "updated_at": {
      +              "description": "When it was uploaded.",
      +              "format": "date-time",
      +              "type": "string"
      +            }
      +          },
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        },
      +        "android_devices": {
      +          "description": "Android installs that can receive pushes.",
      +          "type": "integer"
      +        },
      +        "available": {
      +          "description": "Push is enabled on this DevReply server.",
      +          "type": "boolean"
      +        },
      +        "ios": {
      +          "description": "The APNs key, or null when none is uploaded.",
      +          "properties": {
      +            "bundle_id": {
      +              "description": "The bundle ID pushes go to.",
      +              "type": "string"
      +            },
      +            "key_id": {
      +              "description": "The APNs Key ID.",
      +              "type": "string"
      +            },
      +            "last_error": {
      +              "description": "The last error from the push service, if any.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "last_sent_at": {
      +              "description": "The last push sent with this key.",
      +              "format": "date-time",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "team_id": {
      +              "description": "The Apple Team ID.",
      +              "type": "string"
      +            },
      +            "updated_at": {
      +              "description": "When it was uploaded.",
      +              "format": "date-time",
      +              "type": "string"
      +            }
      +          },
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        },
      +        "ios_devices": {
      +          "description": "iOS installs that can receive pushes.",
      +          "type": "integer"
      +        },
      +        "taps_seen_at": {
      +          "description": "When the app last opened a DevReply notification (taps reach the chat).",
      +          "format": "date-time",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "available",
      +        "ios_devices",
      +        "android_devices",
      +        "taps_seen_at",
      +        "ios",
      +        "android"
      +      ],
      +      "type": "object"
      +    },
      +    "reply_time_promised": {
      +      "description": "The reply time users are promised, in English, e.g. \"a day\".",
      +      "type": "string"
      +    },
      +    "reply_within": {
      +      "description": "The same as a preset: hour, hours, day, 2_days, 3_working_days or week.",
      +      "type": "string"
      +    },
      +    "setup_guide": {
      +      "description": "The setup guide's URL, or null before the app has a platform.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "users": {
      +      "description": "The app's users (not deleted or archived).",
      +      "type": "integer"
      +    },
      +    "waiting_on_team": {
      +      "description": "Open conversations whose last message is the user's.",
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "name",
      +    "platforms",
      +    "bundle_ids",
      +    "public_keys",
      +    "installs",
      +    "users",
      +    "open_conversations",
      +    "waiting_on_team",
      +    "reply_time_promised",
      +    "reply_within",
      +    "links",
      +    "icon_url",
      +    "deep_link",
      +    "deep_link_seen_working_at",
      +    "agent_replies",
      +    "push",
      +    "setup_guide"
      +  ],
      +  "type": "object"
      +}
  2. Added

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the safety bar is lower. The description adds genuinely useful context beyond the annotations: the Owners-only authorization requirement and the fact that agent reply mode is out of scope here. It does not describe partial-update semantics or overwrite behavior.

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 text is compact and free of padding, but it is not front-loaded: it opens with a noun fragment and parenthetical examples instead of a purpose statement, forcing the reader to assemble the action from the name and title. Three short sentences, each carrying content, but the structure is weak.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the schema covers both field semantics and the 'only those given change' / 'empty removes one' behavior. What the description uniquely contributes — owner permission and the reply-mode exclusion — is helpful, but it omits any statement of the operation itself for a six-parameter, nested-object mutation.

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

Parameters3/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. The description largely restates fields the schema already documents in detail (links, bundle_ids, reply_within, app_id), adding no syntax, format, or interaction meaning beyond what the structured data provides.

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

Purpose3/5

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

The description enumerates the app attributes that can be changed (bundle ids, package name, site domain, promised reply time, store pages) but never states the action in a verb phrase; it reads as a fragment list rather than 'updates the app'. A reader must infer 'update' from the tool name and title. The scope is discernible, so it is not tautological, but the purpose is only implied.

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

Usage Guidelines3/5

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

It supplies a real prerequisite ('Owners only') and a clear exclusion ('Agent reply mode is set by a person in the dashboard'), which tells the agent one thing this tool cannot do. However, it names no alternative sibling (create_app, get_app, list_apps) or conditions for choosing between them. Usage is implied rather than guided.

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