Infrastructure You Can Trust for Agentic Products
© 2026 MewCP. All rights reserved.
Google Business Help Improve This Server Missing a tool?
Found a bug?
Have an idea for an improvement?
Share your feedback directly with the maintainers - every feedback helps make this server better for everyone.
Open GitHub Issues → 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.
Overview
The Google Business MCP Server provides full management of your Google Business Profile presence:
Manage business locations and profile information
Read, reply to, and track customer reviews
Create and delete business posts and updates
Fetch performance insights and review analytics
Perfect for:
Business owners automating review responses and post publishing
Marketing teams monitoring performance metrics across locations
Developers building Google Business Profile integrations
Profile & Locations
list_accounts — List all Business Profile accountsReturns all Google Business Profile accounts accessible by the authenticated user.
Inputs:
output:
[
{
"name" : "accounts/123456789" ,
"accountName" : "Acme Corp" ,
"type" : "PERSONAL" ,
"verificationState" : "VERIFIED" ,
"vettedState" : "NOT_VETTED"
}
]
list_locations — List locations under an accountReturns 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"
get_location — Get a specific business locationReturns 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" :
update_location — Update business profile fieldsUpdates 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 update output:
{
"name" : "accounts/123456789/locations/987654321"
Reviews
list_reviews — Fetch reviews for a locationReturns 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:
reply_to_review — Post or update a reply to a reviewPosts 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/rev 111 `
- `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"
delete_review_reply — Delete a reply to a reviewDeletes an existing reply to a customer review.
Inputs:
- `review_name` (string, required) — Review resource name, e.g. `accounts/ 123456789 /locations/ 987654321 /reviews/rev 111 ` output:
{
"success" : true ,
"message" : "Reply deleted for review: accounts/123456789/locations/987654321/reviews/rev111"
}
Posts & Updates
list_posts — List posts for a locationReturns 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" :
create_post — Create a post or updateCreates 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 posts
delete_post — Delete a postDeletes an existing post or update from a business location.
Inputs:
- `post_name` (string, required) — Post resource name, e.g. `accounts/ 123456789 /locations/ 987654321 /localPosts/post 111 ` output:
{
"success" : true ,
"message" : "Post deleted: accounts/123456789/locations/987654321/localPosts/post111"
}
Insights & Analytics
get_insights — Fetch performance insights for locationsReturns 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:
get_review_summary — Get review stats for a locationReturns 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" :
API Parameters Reference
Resource Name Formats All Google Business Profile resources use hierarchical resource names:
Account:
accounts/{ account_id }
Example: accounts/ 123456789 location:
accounts/{ account_id }/locations/{ location_id }
Example: accounts/ 123456789 /locations/ 987654321 review:
Post Topic Types
STANDARD — General update or announcement
EVENT — Time-bound event with title, start, and end datetime
OFFER — Promotional offer with optional coupon code and terms
PRODUCT — Product highlight with name and description
Review Star Ratings Google 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.
Troubleshooting
Missing or Invalid Headers
Cause: OAuth token not provided in request headers or incorrect format
Solution:
Verify Authorization: Bearer YOUR_TOKEN and X-Mewcp-Credential-Id: CREDENTIAL-ID headers are present
Check that your Google credential is active in your MewCP account
Insufficient Credits
Cause: API calls have exceeded your request limits
Solution:
Check credit usage in your Curious Layer dashboard
Upgrade to a paid plan or add credits for higher limits
Contact support for credit adjustments
Credential Not Connected
Cause: No Google Business Profile credential linked to your account
Solution:
Go to Credentials in your MewCP dashboard
Connect your Google account via OAuth
Retry the request with the correct X-Mewcp-Credential-Id header
Malformed Request Payload
Cause: JSON payload in location_data is invalid or update_mask fields do not match the payload keys
Solution:
Validate JSON syntax before sending
Ensure update_mask field names exactly match keys in your location_data JSON
Check parameter types match expected values
Server Not Found
Cause: Incorrect server name in the API endpoint
Solution:
Verify endpoint format: { server-name }/mcp/{ tool-name }
Use correct server name from documentation
Check available servers in your Curious Layer account
Google Business Profile API Error
Cause: Upstream Google Business Profile API returned an error (e.g. 403 Forbidden, 404 Not Found)
Solution:
Check the Google Workspace Status Dashboard for outages
Verify your Google account is an owner or manager of the business location
Ensure the business.manage scope is granted in your OAuth credential
,
"primaryCategory" : {
"displayName" : "Coffee Shop"
}
}
]
"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"
}
}
,
"locationName" : "Acme Corp - Downtown" ,
"primaryPhone" : "+1-555-555-0199" ,
"websiteUrl" : "https://acme.example.com/new" ,
"profile" : {
"description" : "Updated description for our downtown location."
}
}
"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!"
}
]
}
"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"
}
]
{
"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" : "LEARN_MORE" ,
"url" : "https://acme.example.com/event"
},
"state" : "LIVE" ,
"createTime" : "2025-01-15T09:00:00Z"
} "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" }
}
]
}
]
}
17
,
"rating_distribution" : {
"1" : 2 ,
"2" : 3 ,
"3" : 5 ,
"4" : 14 ,
"5" : 24
}
}
accounts/{ account_id }/locations/{ location_id }/reviews/{ review_id }
Example: accounts/ 123456789 /locations/ 987654321 /reviews/rev 111 accounts/{ account_id }/locations/{ location_id }/localposts/{ post_id }
Example: accounts/ 123456789 /locations/ 987654321 /localPosts/post 111