Manage your Google Business Profile - reviews, posts, locations, and insights - with Agents.
A Model Context Protocol (MCP) server that exposes Google Business Profile's API for managing business locations, customer reviews, posts, and performance analytics.
The Google Business MCP Server provides full management of your Google Business Profile presence:
Perfect for:
Returns all Google Business Profile accounts accessible by the authenticated user.
Inputs:
noneoutput:
[
{
"name": "accounts/123456789",
"accountName": "Acme Corp",
"type": "PERSONAL",
"verificationState": "VERIFIED",
"vettedState": "NOT_VETTED"
}
]Returns all business locations under a given account.
Inputs:
- `account_name` (string, required) — Account resource name, e.g. `accounts/123456789`output:
[
{
"name": "accounts/123456789/locations/987654321",
"locationName": "Acme Corp - Downtown",
"primaryPhone": "+1-555-555-0100",
"websiteUrl": "https://acme.example.com",
"primaryCategory": {
"displayName": "Coffee Shop"
}
}
]Returns detailed information about a specific business location.
Inputs:
- `location_name` (string, required) — Location resource name, e.g. `accounts/123456789/locations/987654321`output:
{
"name": "accounts/123456789/locations/987654321",
"locationName": "Acme Corp - Downtown",
"primaryPhone": "+1-555-555-0100",
"websiteUrl": "https://acme.example.com",
"address": {
"addressLines": ["123 Main St"],
"locality": "San Francisco",
"administrativeArea": "CA",
"postalCode": "94105",
"regionCode": "US"
},
"primaryCategory": {
"displayName": "Coffee Shop",
"categoryId": "gcid:coffee_shop"
}
}Updates business profile fields such as description, phone number, website, or hours. Only fields specified in update_mask are changed.
Inputs:
- `location_name` (string, required) — Location resource name, e.g. `accounts/123456789/locations/987654321`
- `update_mask` (string, required) — Comma-separated fields to update, e.g. `profile.description,phoneNumbers`
- `location_data` (string, required) — JSON string of the location fields to updateoutput:
{
"name": "accounts/123456789/locations/987654321",
"locationName": "Acme Corp - Downtown",
"primaryPhone": "+1-555-555-0199",
"websiteUrl": "https://acme.example.com/new",
"profile": {
"description": "Updated description for our downtown location."
}
}Returns customer reviews for a business location, ordered by update time or rating.
Inputs:
- `location_name` (string, required) — Location resource name, e.g. `accounts/123456789/locations/987654321`
- `page_size` (integer, optional) — Number of reviews to return, max 50. Default: `20`
- `order_by` (string, optional) — Sort order: `updateTime desc`, `rating desc`, or `rating asc`. Default: `updateTime desc`output:
[
{
"name": "accounts/123456789/locations/987654321/reviews/rev111",
"author": "Jane Smith",
"rating": "FIVE",
"comment": "Amazing coffee and friendly staff!",
"createTime": "2025-01-10T14:00:00Z",
"reply": null
},
{
"name": "accounts/123456789/locations/987654321/reviews/rev222",
"author": "Bob Jones",
"rating": "THREE",
"comment": "Good place but can get crowded.",
"createTime": "2025-01-08T09:30:00Z",
"reply": "Thanks for the feedback, Bob!"
}
]Posts a new reply or updates an existing reply to a customer review.
Inputs:
- `review_name` (string, required) — Review resource name, e.g. `accounts/123456789/locations/987654321/reviews/rev111`
- `reply_text` (string, required) — The reply text to post (max 4096 characters)output:
{
"comment": "Thank you so much for the kind words, Jane! We look forward to seeing you again.",
"updateTime": "2025-01-11T10:00:00Z"
}Deletes an existing reply to a customer review.
Inputs:
- `review_name` (string, required) — Review resource name, e.g. `accounts/123456789/locations/987654321/reviews/rev111`output:
{
"success": true,
"message": "Reply deleted for review: accounts/123456789/locations/987654321/reviews/rev111"
}Returns recent posts and updates published to a business location.
Inputs:
- `location_name` (string, required) — Location resource name, e.g. `accounts/123456789/locations/987654321`
- `page_size` (integer, optional) — Number of posts to return, max 100. Default: `10`output:
[
{
"name": "accounts/123456789/locations/987654321/localPosts/post111",
"topicType": "STANDARD",
"summary": "We are now open on Sundays from 9am to 5pm!",
"state": "LIVE",
"createTime": "2025-01-12T08:00:00Z",
"updateTime": "2025-01-12T08:00:00Z"
}
]Creates a new post on a business location. Supports STANDARD, EVENT, OFFER, and PRODUCT post types.
Inputs:
- `location_name` (string, required) — Location resource name, e.g. `accounts/123456789/locations/987654321`
- `summary` (string, required) — Main post text (max 1500 characters)
- `topic_type` (string, optional) — Post type: `STANDARD` | `EVENT` | `OFFER` | `PRODUCT`. Default: `STANDARD`
- `call_to_action_type` (string, optional) — CTA button: `BOOK` | `ORDER` | `SHOP` | `LEARN_MORE` | `SIGN_UP` | `CALL`
- `call_to_action_url` (string, optional) — URL for the CTA button
- `event_title` (string, optional) — Title for EVENT posts
- `event_start` (string, optional) — ISO 8601 event start datetime
- `event_end` (string, optional) — ISO 8601 event end datetime
- `offer_coupon` (string, optional) — Coupon code for OFFER posts
- `offer_terms` (string, optional) — Terms and conditions for OFFER postsoutput:
{
"name": "accounts/123456789/locations/987654321/localPosts/post222",
"topicType": "EVENT",
"summary": "Join us for our grand re-opening celebration!",
"event": {
"title": "Grand Re-Opening",
"schedule": {
"startDateTime": "2025-02-01T10:00:00Z",
"endDateTime": "2025-02-01T18:00:00Z"
}
},
"callToAction": {
"actionType"
Deletes an existing post or update from a business location.
Inputs:
- `post_name` (string, required) — Post resource name, e.g. `accounts/123456789/locations/987654321/localPosts/post111`output:
{
"success": true,
"message": "Post deleted: accounts/123456789/locations/987654321/localPosts/post111"
}Returns performance metrics (views, searches, customer actions) for one or more locations over a date range.
Inputs:
- `location_names` (string, required) — Comma-separated location resource names
- `start_date` (string, required) — Start date in `YYYY-MM-DD` format
- `end_date` (string, required) — End date in `YYYY-MM-DD` format
- `metric_requests` (string, optional) — Metrics to fetch. Use `ALL` or a comma-separated subset: `QUERIES_DIRECT`, `QUERIES_INDIRECT`, `VIEWS_MAPS`, `VIEWS_SEARCH`, `ACTIONS_WEBSITE`, `ACTIONS_PHONE`, `ACTIONS_DRIVING_DIRECTIONS`. Default: `ALL`output:
{
"locationMetrics": [
{
"locationName": "accounts/123456789/locations/987654321",
"timeZone": "America/Los_Angeles",
"metricValues": [
{
"metric": "QUERIES_DIRECT",
"totalValue": { "metricOption": "AGGREGATED_TOTAL", "value": "320" }
},
{
"metric": "VIEWS_SEARCH",
"totalValue": { "metricOption": "AGGREGATED_TOTAL", "value": "1540" }
},
{
"metric": "ACTIONS_WEBSITE",
"totalValue": { "metricOption": "AGGREGATED_TOTAL", "value": "87" }
}
]
}
]
}Returns a computed summary of review statistics including total count, average rating, reply rate, and rating distribution.
Inputs:
- `location_name` (string, required) — Location resource name, e.g. `accounts/123456789/locations/987654321`output:
{
"total_reviews": 48,
"average_rating": 4.35,
"replied_to": 31,
"unreplied": 17,
"rating_distribution": {
"1": 2,
"2": 3,
"3": 5,
"4": 14,
"5": 24
}
}All Google Business Profile resources use hierarchical resource names:
Account:
accounts/{account_id}
Example: accounts/123456789location:
accounts/{account_id}/locations/{location_id}
Example: accounts/123456789/locations/987654321review:
accounts/{account_id}/locations/{location_id}/reviews/{review_id}
Example: accounts/123456789/locations/987654321/reviews/rev111post:
accounts/{account_id}/locations/{location_id}/localposts/{post_id}
Example: accounts/123456789/locations/987654321/localPosts/post111STANDARD — General update or announcementEVENT — Time-bound event with title, start, and end datetimeOFFER — Promotional offer with optional coupon code and termsPRODUCT — Product highlight with name and descriptionGoogle returns star ratings as strings: ONE, TWO, THREE, FOUR, FIVE.
The get_review_summary tool maps these to numeric values (1–5) for the rating distribution output.
Authorization: Bearer YOUR_TOKEN and X-Mewcp-Credential-Id: CREDENTIAL-ID headers are presentX-Mewcp-Credential-Id headerlocation_data is invalid or update_mask fields do not match the payload keysupdate_mask field names exactly match keys in your location_data JSON{server-name}/mcp/{tool-name}business.manage scope is granted in your OAuth credential