Skip to main content
Glama

Stage a Google listing change for approval

prepare_google_change

Validate one exact change against what Google allows for this location (and rehearse it with Google where possible) and stage it for the owner’s approval. NOTHING on Google changes. Show the owner the exact proposed content and returned summary and limitations, then call approve_google_change with the returned approval_id and payload_hash only after approval. A broad request like “improve my listing” is not approval for unspecified changes. Needs the site on Pro. photo_upload adds still images; video_upload adds listing-gallery video, separate from local posts. place_action_update edits an existing eligible booking link. Read industry details/allowed values before attribute edits and get_google_industry_schema before menu/lodging edits. Google post publishing through Mondovo supports text or one photo only.

Input Schema

NameRequiredDescriptionDefault
changeYes
site_idYesThe site whose Google Business Profile location to use.
user_goalNoOptional: the user's goal behind this call, in one short sentence of plain words (e.g. "add a page so customers can book tables"). No names, emails or other personal details.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / change / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "profile_update",
      -        "type": "string"
      -      },
      -      "changes": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "clear": {
      -              "description": "Required to clear a field (value null).",
      -              "type": "boolean"
      -            },
      -            "field": {
      -              "enum": [
      -                "title",
      -                "description",
      -                "phone",
      -                "website",
      -                "address",
      -                "regularHours",
      -                "specialHours",
      -                "primaryCategory",
      -                "serviceItems",
      -                "openStatus"
      -              ],
      -              "type": "string"
      -            },
      -            "value": {
      -              "description": "The exact value to publish. Hours: [{day:\"MONDAY\",open:\"09:00\",close:\"17:00\"}]. Address: {regionCode:\"IN\",addressLines:[...],locality,administrativeArea,postalCode}. Category: {name:\"categories/gcid:...\"} from the category search. null clears (needs clear:true)."
      -            }
      -          },
      -          "required": [
      -            "field"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 10,
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "changes"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "attributes_update",
      -        "type": "string"
      -      },
      -      "changes": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "name": {
      -              "description": "attributes/{id} as get_google_industry_details lists it",
      -              "type": "string"
      -            },
      -            "setValues": {
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            "unsetValues": {
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            "uris": {
      -              "items": {
      -                "format": "uri",
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            "values": {
      -              "items": {},
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "name"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 30,
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "changes"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "place_action_create",
      -        "type": "string"
      -      },
      -      "isPreferred": {
      -        "type": "boolean"
      -      },
      -      "placeActionType": {
      -        "description": "One of the types the location offers (get_google_industry_details).",
      -        "type": "string"
      -      },
      -      "uri": {
      -        "format": "uri",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "uri",
      -      "placeActionType"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "place_action_delete",
      -        "type": "string"
      -      },
      -      "name": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "food_menus_update",
      -        "type": "string"
      -      },
      -      "menus": {
      -        "description": "Google FoodMenus.menus, complete (replaces the menu).",
      -        "items": {},
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "menus"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "lodging_update",
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": {},
      -        "description": "Top-level lodging groups to replace, e.g. {policies:{...}}.",
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "values"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "review_reply",
      -        "type": "string"
      -      },
      -      "reviewId": {
      -        "description": "The Google review id (review_id from list_google_reviews).",
      -        "type": "string"
      -      },
      -      "text": {
      -        "maxLength": 4000,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "reviewId",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "review_reply_delete",
      -        "type": "string"
      -      },
      -      "reviewId": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "reviewId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "photo_upload",
      -        "type": "string"
      -      },
      -      "category": {
      -        "enum": [
      -          "COVER",
      -          "PROFILE",
      -          "LOGO",
      -          "EXTERIOR",
      -          "INTERIOR",
      -          "PRODUCT",
      -          "AT_WORK",
      -          "FOOD_AND_DRINK",
      -          "MENU",
      -          "COMMON_AREA",
      -          "ROOMS",
      -          "TEAMS",
      -          "ADDITIONAL"
      -        ],
      -        "type": "string"
      -      },
      -      "sourceUrl": {
      -        "format": "uri",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "sourceUrl"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "action": {
      -        "const": "photo_delete",
      -        "type": "string"
      -      },
      -      "name": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "profile_update",
      +        "type": "string"
      +      },
      +      "changes": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "clear": {
      +              "description": "Required to clear a field (value null).",
      +              "type": "boolean"
      +            },
      +            "field": {
      +              "enum": [
      +                "title",
      +                "description",
      +                "phone",
      +                "website",
      +                "address",
      +                "regularHours",
      +                "specialHours",
      +                "primaryCategory",
      +                "serviceItems",
      +                "openStatus"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "The exact value to publish. Hours: [{day:\"MONDAY\",open:\"09:00\",close:\"17:00\"}]. Address: {regionCode:\"IN\",addressLines:[...],locality,administrativeArea,postalCode}. Category: {name:\"categories/gcid:...\"} from the category search. null clears (needs clear:true)."
      +            }
      +          },
      +          "required": [
      +            "field"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 10,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "changes"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "attributes_update",
      +        "type": "string"
      +      },
      +      "changes": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "name": {
      +              "description": "attributes/{id} as get_google_industry_details lists it",
      +              "type": "string"
      +            },
      +            "setValues": {
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "unsetValues": {
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "uris": {
      +              "items": {
      +                "format": "uri",
      +                "pattern": "^https:\\/\\/",
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "values": {
      +              "items": {},
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "name"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 30,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "changes"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "place_action_create",
      +        "type": "string"
      +      },
      +      "isPreferred": {
      +        "type": "boolean"
      +      },
      +      "placeActionType": {
      +        "description": "One of the types the location offers (get_google_industry_details).",
      +        "type": "string"
      +      },
      +      "uri": {
      +        "$ref": "#/properties/change/anyOf/1/properties/changes/items/properties/uris/items"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "uri",
      +      "placeActionType"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "place_action_update",
      +        "type": "string"
      +      },
      +      "isPreferred": {
      +        "type": "boolean"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "placeActionType": {
      +        "type": "string"
      +      },
      +      "uri": {
      +        "$ref": "#/properties/change/anyOf/1/properties/changes/items/properties/uris/items"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "name",
      +      "uri",
      +      "placeActionType"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "place_action_delete",
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "food_menus_update",
      +        "type": "string"
      +      },
      +      "menus": {
      +        "description": "Google FoodMenus.menus, complete (replaces the menu).",
      +        "items": {},
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "menus"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "lodging_update",
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": {},
      +        "description": "Top-level lodging groups to replace, e.g. {policies:{...}}.",
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "values"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "review_reply",
      +        "type": "string"
      +      },
      +      "reviewId": {
      +        "description": "The Google review id (review_id from list_google_reviews).",
      +        "type": "string"
      +      },
      +      "text": {
      +        "maxLength": 4000,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "reviewId",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "review_reply_delete",
      +        "type": "string"
      +      },
      +      "reviewId": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "reviewId"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "photo_upload",
      +        "type": "string"
      +      },
      +      "category": {
      +        "enum": [
      +          "COVER",
      +          "PROFILE",
      +          "LOGO",
      +          "EXTERIOR",
      +          "INTERIOR",
      +          "PRODUCT",
      +          "AT_WORK",
      +          "FOOD_AND_DRINK",
      +          "MENU",
      +          "COMMON_AREA",
      +          "ROOMS",
      +          "TEAMS",
      +          "ADDITIONAL"
      +        ],
      +        "type": "string"
      +      },
      +      "sourceUrl": {
      +        "$ref": "#/properties/change/anyOf/1/properties/changes/items/properties/uris/items"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "sourceUrl"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "photo_delete",
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "video_upload",
      +        "type": "string"
      +      },
      +      "sourceUrl": {
      +        "description": "Public HTTPS video URL from the owner’s library or upload. Adds a listing-gallery video, not a local post.",
      +        "format": "uri",
      +        "pattern": "^https:\\/\\/",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "sourceUrl"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "action": {
      +        "const": "media_delete",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Owner media resource from get_google_media, never customer media.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Added

TDQS

A4.7/5.0
Behavior5/5

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

Annotations mark it non-readOnly and non-idempotent, and the description supplies the missing context: nothing on Google changes at this step, the change is validated and rehearsed where possible, and the caller must show the owner the exact content plus returned summary and limitations. It also discloses real capability limits (Mondovo Google posts support text or one photo only) that no structured field carries.

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 core action and the 'NOTHING on Google changes' safety statement, then the approval handoff, then per-action notes. It is long and clause-dense, but almost every sentence carries an operational constraint; no filler.

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?

With no output schema, the description correctly explains that an approval_id and payload_hash come back and what the owner must be shown. Prerequisites, the approval boundary, and the main action caveats are covered; only the optional user_goal parameter and the remaining action variants are left to the schema.

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

Parameters4/5

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

Schema coverage is 67% and the schema itself is a large action union, so the description adds genuine value by explaining the semantics and boundaries of photo_upload (still images), video_upload (gallery video, not a local post) and place_action_update (existing eligible booking link). It does not touch several other actions (profile_update, review_reply, food_menus_update, lodging_update), so the coverage of the parameter space is good but partial.

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 chain (validate, rehearse, stage) against a well-scoped resource (one exact Google listing change) and immediately distinguishes itself from approve_google_change, the sibling that actually applies it. An agent can select this tool without opening the schema.

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

Usage Guidelines5/5

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

Explicitly says to call approve_google_change with the returned approval_id and payload_hash only after the owner approves, and explicitly says a vague request like 'improve my listing' is not approval. It also gates the tool on the site being on Pro and routes attribute/menu/lodging edits to get_google_industry_details/get_google_industry_schema first.

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