mcp-google-business
This server lets an AI app read and manage Google Business Profile locations, performance, reviews, and local posts through natural language.
Account & location management – list accounts and locations, get location details, update profile fields, and manage categories/attributes.
Performance analytics – fetch daily metrics, multiple metrics at once, and monthly search keyword impressions.
Review handling – list/get reviews, draft and publish replies, and delete review replies.
Local posts – list, create, update, and delete What's New/Event/Offer posts.
Categories & attributes – search business categories and available attributes, and update location attributes.
Chain search – find business chains and relate locations to brands.
Raw API access – call any Google Business Profile endpoint directly as an escape hatch.
Safety controls – read-only tools vs. live-change tools are clearly marked, with confirmation boundaries for writes and destructive actions.
Provides tools for managing Google Business Profiles, including listing locations, replying to reviews, creating local posts, and retrieving performance metrics.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-google-businessList my business locations and show the newest unanswered reviews."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Business Profile MCP
English | Русский
A1 Google Business Profile MCP lets an AI app work with your Google Business Profile locations in natural language. Inspect locations and performance, respond to reviews, prepare local posts and update profile information deliberately.
It connects to Google’s current Business Profile APIs and the legacy API where reviews and posts still live. A Google account and OAuth credentials alone are not enough: Google must approve Basic API Access for the Cloud project.
20 tools. Location and account data, performance, reviews, local posts, categories and attributes.
Real approval gate. Projects start at 0 QPM; every API call fails until Google approves the Basic API Access application.
Separate release boundary. A prepared reply, post or location update changes public business information only after the client confirms the write operation.
Four API surfaces. Account Management, Business Information, Performance and legacy v4 work through one
business.manageOAuth scope.
Start with a read-only question:
List my locations and show the newest reviews that do not have a reply.
Connect the server · Explore use cases · Open technical documentation
See it work in a minute
You: List my locations and show the newest reviews that do not have a reply.
Assistant: Shows the locations and recent reviews. Nothing changes.
You: Draft a reply to the newest three-star review at the downtown location. Apologize and offer to help.
Assistant: Shows the location, review and proposed reply, then asks for confirmation before publishing it.
You: Confirm.
Assistant: Publishes the reply. It does not alter the review, other locations or posts.
Related MCP server: Local Business Data MCP Server
Contents
Quick start
You need Node.js 20+, a verified Google Business Profile, a Google Cloud OAuth client and an approved Basic API Access application.
Add the server to your AI app.
Start with the read-only question above.
In Settings → MCP servers, select Add server, choose STDIO, enter the command npx -y mcp-google-business@latest and environment variables GOOGLE_BUSINESS_CLIENT_ID, GOOGLE_BUSINESS_CLIENT_SECRET, GOOGLE_BUSINESS_REFRESH_TOKEN, then select Save and Restart.
codex mcp add google-business \
--env GOOGLE_BUSINESS_CLIENT_ID=your_client_id \
--env GOOGLE_BUSINESS_CLIENT_SECRET=your_client_secret \
--env GOOGLE_BUSINESS_REFRESH_TOKEN=your_refresh_token \
-- npx -y mcp-google-business@latest
codex mcp listclaude mcp add \
--env GOOGLE_BUSINESS_CLIENT_ID=your_client_id \
--env GOOGLE_BUSINESS_CLIENT_SECRET=your_client_secret \
--env GOOGLE_BUSINESS_REFRESH_TOKEN=your_refresh_token \
--transport stdio --scope user google-business \
-- npx -y mcp-google-business@latest
claude mcp listThe current official path is Settings → Extensions. For a custom desktop extension, open Advanced settings → Extension Developer → Install Extension…, select a .mcpb file and follow the prompts.
This repository currently publishes an npm stdio package and does not contain a .mcpb bundle. For Claude Desktop builds that still support local configuration, use the following JSON stdio configuration as a fallback:
{"mcpServers":{"google-business":{"command":"npx","args":["-y","mcp-google-business@latest"],"env":{"GOOGLE_BUSINESS_CLIENT_ID":"your_client_id","GOOGLE_BUSINESS_CLIENT_SECRET":"your_client_secret","GOOGLE_BUSINESS_REFRESH_TOKEN":"your_refresh_token"}}}}In those builds, save it to ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows.
Claude Desktop MCP documentation
Add {"mcpServers":{"google-business":{"type":"stdio","command":"npx","args":["-y","mcp-google-business@latest"],"env":{"GOOGLE_BUSINESS_CLIENT_ID":"your_client_id","GOOGLE_BUSINESS_CLIENT_SECRET":"your_client_secret","GOOGLE_BUSINESS_REFRESH_TOKEN":"your_refresh_token"}}}} to ~/.cursor/mcp.json on macOS/Linux or %USERPROFILE%\.cursor\mcp.json on Windows. Cursor MCP documentation
Run MCP: Open User Configuration and add:
{"servers":{"google-business":{"type":"stdio","command":"npx","args":["-y","mcp-google-business@latest"],"env":{"GOOGLE_BUSINESS_CLIENT_ID":"${input:gbp_client_id}","GOOGLE_BUSINESS_CLIENT_SECRET":"${input:gbp_client_secret}","GOOGLE_BUSINESS_REFRESH_TOKEN":"${input:gbp_refresh_token}"}}},"inputs":[{"type":"promptString","id":"gbp_client_id","description":"Google OAuth client ID"},{"type":"promptString","id":"gbp_client_secret","description":"Google OAuth client secret","password":true},{"type":"promptString","id":"gbp_refresh_token","description":"Google OAuth refresh token","password":true}]}Check it with MCP: List Servers. VS Code MCP documentation
What you can ask it to do
List locations, categories, attributes and current profile information.
Show calls, direction requests and search keyword impressions for a chosen period.
Find fresh reviews, draft a reply and publish it after confirmation.
Prepare, update or remove a local post.
Update a selected location field or attribute after showing the exact change.
What can change
Operation | What happens | Confirmation boundary |
Accounts, locations, categories, attributes, performance, reviews and posts | Reads existing profile data | No change |
Update a location or its attributes | Changes public business profile data | Changes a location |
Reply to a review | Publishes a public owner reply | Changes public content |
Create or update a local post | Publishes or changes public local content | Changes public content |
Delete a review reply or local post | Removes public content | Destructive |
Raw API request | May call any write or delete endpoint | Potentially destructive |
The AI client controls confirmations; the server marks tools so the client can distinguish inspection from a live change.
Getting access
Google requires both OAuth and Basic API Access approval.
Use a verified and active Business Profile that has existed for at least 60 days; apply from an owner or manager account and have a business website that matches the application.
Create a Google Cloud project, enable My Business Account Management API, Business Information API, Business Profile Performance API and Google My Business API (legacy v4).
Submit the GBP API contact form as Application for Basic API Access. Before approval, quota is 0 QPM; approved projects receive 300 QPM per API.
Create an OAuth client, obtain a refresh token for
https://www.googleapis.com/auth/business.manage, and set the threeGOOGLE_BUSINESS_*variables.
Treat the client secret and refresh token as passwords. An access token is a short-lived alternative for one-off use.
Configuration
Variable | Required | Description |
| Yes* | OAuth client ID. |
| Yes* | OAuth client secret. |
| Yes* | OAuth refresh token with |
| Yes* | Short-lived alternative to the OAuth trio. |
| No | Per-request timeout; default |
| No | Temporary-error retries; default |
* Provide either the OAuth trio or an access token. API host overrides are documented in the tool reference.
Data, limits and background work
Google receives the profile requests. Anonymous telemetry includes installation and version data plus tool names, never OAuth secrets, profile data, arguments or prompts. Set
ASKADS_TELEMETRY=0to opt out.Real edit caps. Approved projects receive 300 QPM per API; Google also limits each Business Profile to 10 edits per minute. Performance metrics can lag by a few days, and review replies require verified locations.
No background monitoring. The server runs only while called. If your AI app supports scheduled tasks, it can periodically review new feedback or metrics.
Technical documentation
MCP capability catalog — task-oriented pages for every tool.
Support
Found a bug or need a scenario? Create an issue or write in Telegram.
Available Tools
20 toolscreate_local_postCreate a local postA
Publishes a new local post on the Business Profile. Pass the LocalPost as post. LocalPost fields: languageCode; summary (the post text); topicType (STANDARD | EVENT | OFFER | ALERT); callToAction {actionType: BOOK | ORDER | SHOP | LEARN_MORE | SIGN_UP | CALL, url}; event {title, schedule{startDate{year,month,day}, startTime{hours,minutes}, endDate, endTime}} — required for EVENT and OFFER; offer {couponCode, redeemOnlineUrl, termsConditions}; media [{mediaFormat: "PHOTO", sourceUrl}]. ALERT posts are restricted to Google-initiated campaigns and are typically rejected. Returns the created post with its name and state (a fresh post is usually PROCESSING before it goes LIVE). Counts against the 10 edits/min per-profile cap. Local posts live only on the legacy v4 API (mybusiness.googleapis.com) — they were never migrated to v1.
| Name | Required | Description | Default |
|---|---|---|---|
| post | Yes | The LocalPost to create, e.g. {"languageCode": "en", "topicType": "STANDARD", "summary": "Fresh croissants every morning!", "callToAction": {"actionType": "LEARN_MORE", "url": "https://example.com"}}. | |
| accountId | Yes | Account id — bare "123" or "accounts/123". | |
| locationId | Yes | Location id — bare "456", "locations/456" or "accounts/1/locations/456". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set readOnlyHint=false and idempotentHint=false, but the description adds the return state (usually PROCESSING before LIVE), the rate limit, and the legacy-v4-API restriction. This goes beyond annotations and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph, front-loaded with the action and then systematically covering return format, ALERT restrictions, rate limits, and API scope. Every clause earns its place; no filler or schema repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex nested LocalPost object and three required parameters, the description is thorough: it discloses the return value with state, warns about ALERT rejections, and informs about rate and API-version constraints. This is complete for a successful invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While schema coverage is 100%, the description explains the nested `post` object fields in detail: topicType options, callToAction structure, required event/offer fields, and media format. This significantly helps construct a valid request beyond the schema's brief example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Publishes a new local post on the Business Profile' with a specific verb and resource. This clearly distinguishes it from sibling tools like list_local_posts, update_local_post, and delete_local_post by focusing on creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly warns that ALERT posts are restricted to Google-initiated campaigns and are typically rejected, and notes that local posts exist only on the legacy v4 API. It also mentions the 10 edits/min rate cap, providing clear when/when-not context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_local_postDelete a local postADestructiveIdempotent
Deletes a local post from the Business Profile. Empty response on success. Local posts live only on the legacy v4 API (mybusiness.googleapis.com) — they were never migrated to v1.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | Yes | Local post id (last segment of the post's `name`). | |
| accountId | Yes | Account id — bare "123" or "accounts/123". | |
| locationId | Yes | Location id — bare "456", "locations/456" or "accounts/1/locations/456". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds the behavior that a successful delete returns an empty response and that this tool is exclusive to the legacy v4 API, going beyond what annotations provide. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, each delivering distinct value: the action, the success response, and the critical legacy API context. No filler or redundancy, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive delete operation with no output schema, the description covers the action, the response format, and an important API constraint. It does not elaborate on error cases or idempotency details, but the annotations (destructive and idempotent hints) fill those gaps, making the description sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with each parameter clearly documented (e.g., postId as the last segment of the post's name). The description adds no additional parameter semantics, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Deletes') and resource ('local post from the Business Profile'), clearly differentiating this from sibling tools like create_local_post, update_local_post, and list_local_posts. It also notes the empty response and legacy v4 API context, leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides essential context that local posts live only on the legacy v4 API and were never migrated to v1, implicitly guiding when this tool is applicable. It does not explicitly list alternatives or when-not-to-use scenarios, but the legacy API note is a clear usage signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_review_replyDelete a review replyADestructiveIdempotent
Deletes the business's reply to a review (the review itself is the customer's and cannot be deleted). Empty response on success. Reviews live only on the legacy v4 API (mybusiness.googleapis.com) — they were never migrated to v1.
| Name | Required | Description | Default |
|---|---|---|---|
| reviewId | Yes | Review id (from list_reviews `reviewId` or `name`). | |
| accountId | Yes | Account id — bare "123" or "accounts/123". | |
| locationId | Yes | Location id — bare "456", "locations/456" or "accounts/1/locations/456". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds beyond annotations: empty response on success, legacy v4 only, and the scope (only the reply is deleted, not the review). This complements the destructiveHint and idempotentHint annotations; no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with verb+resource, each sentence adds value. Extremely concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with no output schema, the description covers success behavior (empty response), scope, and API migration status. Enough for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all three parameters. The description adds no additional parameter-level detail, meeting the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Deletes' plus resource 'the business's reply to a review' clearly defines the action. The clarification that the review itself cannot be deleted distinguishes this from broader review deletion tools and prevents misuse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear when-not: the review itself is customer-owned and cannot be deleted. It also notes the v4-only availability, guiding API choice. However, it doesn't explicitly name sibling tools like reply_to_review as the alternative for creating/updating replies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_multi_daily_metricsMultiple daily metrics at onceARead-onlyIdempotent
Returns daily time series for SEVERAL performance metrics of a location in one call — same data as get_daily_metrics, but batched. Response: multiDailyMetricTimeSeries[].dailyMetricTimeSeries[] of {dailyMetric, timeSeries.datedValues[]}; values are int64 strings. Prefer this over several get_daily_metrics calls to save quota. Metrics for the most recent days are not available immediately (multi-day lag, typically a few days) — empty values near today are normal, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | Yes | Range end (inclusive), e.g. 2026-07-31. | |
| startDate | Yes | Range start (inclusive), e.g. 2026-07-01. | |
| locationId | Yes | Location id from list_locations (the unobfuscated listing id; locations/123 also works). | |
| dailyMetrics | Yes | The metrics to fetch (one or more). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, and the description adds valuable behavioral context beyond that: the multi-day lag for recent metrics and that empty values near today are normal, not errors. It also discloses the response shape and that values are int64 strings, which is useful for parsing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense, covering purpose, relationship to sibling, response format, value types, quota benefit, and a critical data-lag caveat in just three sentences. Every sentence earns its place with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explicitly outlines the nested response structure (multiDailyMetricTimeSeries[].dailyMetricTimeSeries[] of {dailyMetric, timeSeries.datedValues[]}), value type, and the lag behavior. This is complete for a complex batch tool, and the sibling differentiation and quota rationale cover the operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all four parameters, so the schema already documents their meaning and constraints. The description adds context about batching and response structure, but does not add meaning for the parameters themselves beyond what the schema provides, so it stays at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns daily time series for several performance metrics in one batched call, and explicitly differentiates it from the sibling tool get_daily_metrics by noting it returns 'same data as get_daily_metrics, but batched.' This is a specific verb+resource+scope definition with no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Prefer this over several get_daily_metrics calls to save quota.' It also names the alternative (get_daily_metrics) and describes the batching advantage, making the choice between sibling tools clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_metricsDaily metric time seriesARead-onlyIdempotent
Returns a daily time series for ONE performance metric of a location: impressions by surface (Maps/Search × desktop/mobile), direction requests, call clicks, website clicks, conversations, bookings, food orders or menu clicks. Response: timeSeries.datedValues[] of {date{year,month,day}, value} — value is int64 serialized as a string; a missing value means no data for that day. Metrics for the most recent days are not available immediately (multi-day lag, typically a few days) — empty values near today are normal, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | Yes | Range end (inclusive), e.g. 2026-07-31. | |
| startDate | Yes | Range start (inclusive), e.g. 2026-07-01. | |
| locationId | Yes | Location id from list_locations (the unobfuscated listing id; locations/123 also works). | |
| dailyMetric | Yes | The metric to fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds crucial behavioral details beyond those: the multi-day lag, the meaning of missing values, and the int64-as-string serialization. This substantially improves agent understanding of response semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet information-dense, using two sentences to cover purpose, response shape, serialization, and lag. The structure is front-loaded with the core function, then details, and every clause carries value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple parameter set and no output schema, the description fully equips the agent: it explains the response structure, value type, missing-data semantics, and latency behavior. This is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter already has a clear description. The description adds no parameter-specific meaning beyond what the schema provides; it only repeats metric categories already captured by the enum. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a daily time series for one performance metric, listing the specific metric types. The 'ONE' qualifier distinguishes it from the sibling fetch_multi_daily_metrics, making the purpose and scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for single-metric queries but does not explicitly reference alternatives or when not to use the tool. It lacks the direct 'use X instead' guidance seen in high-scoring examples, so the guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_locationGet a locationARead-onlyIdempotent
Returns one location by id (Business Information API; v1 uses the bare locations/{id} name, no account prefix). The readMask picks which fields come back: title, categories, storefrontAddress, phoneNumbers, websiteUri, regularHours, specialHours, openInfo, profile (description), storeCode, latlng, metadata (mapsUri, newReviewUri, placeId).
| Name | Required | Description | Default |
|---|---|---|---|
| readMask | No | Comma-separated FieldMask of Location fields to return, e.g. "name,title,storefrontAddress,regularHours,metadata". The API requires it; omit to use the default "name,title,storefrontAddress,phoneNumbers,categories,websiteUri,metadata". | |
| locationId | Yes | Location id — bare "123", "locations/123" or "accounts/1/locations/123" all work. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint true, and destructiveHint false, so the safety profile is clear. The description adds useful behavioral context about the API version, path naming convention, and that the readMask controls which fields are returned, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and directly states the core purpose, followed by a useful list of field options. It is front-loaded with the primary action and avoids irrelevant details, earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the rich parameter descriptions in the schema, the description is adequately complete. It explains the API version, return a single location, and how readMask influences output. There's no output schema, but the description plus schema sufficiently cover what's needed for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters have descriptions. The description adds extra value by enumerating all possible readMask field choices (title, categories, etc.) and clarifying the acceptable formats for locationId, complementing the schema's example. This goes beyond what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Returns one location by id', specifying the exact resource and operation. It also distinguishes from sibling tools like list_locations and get_review by indicating it's a single-location lookup within the Business Information API.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool (fetching a single location by ID) and includes a subtle usage note about v1's bare path name. However, it does not explicitly mention alternatives or when not to use it, though the context implies it for single-location retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reviewGet a reviewARead-onlyIdempotent
Returns one review by id — same shape as a list_reviews entry (starRating is an enum ONE..FIVE, reviewReply present only if the business already answered). Reviews live only on the legacy v4 API (mybusiness.googleapis.com) — they were never migrated to v1.
| Name | Required | Description | Default |
|---|---|---|---|
| reviewId | Yes | Review id (from list_reviews `reviewId` or `name`). | |
| accountId | Yes | Account id — bare "123" or "accounts/123". | |
| locationId | Yes | Location id — bare "456", "locations/456" or "accounts/1/locations/456". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive. The description adds valuable behavioral details beyond annotations: the return shape matches list_reviews, starRating is an enum ONE..FIVE, reviewReply is conditional, and the API legacy constraint. This greatly enriches what an agent knows about the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, then delivering two high-value clarifications (return shape and API version). No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter, the description covers return shape via the list_reviews reference, enumerates the starRating values, specifies when reviewReply is present, and warns about the API version. With no output schema, this is sufficient context, and sibling tools (list_reviews, reply_to_review) make the ecosystem clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema fully documents all three parameters (100% coverage), including formats and source of reviewId. The description adds no parameter-specific meaning beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns one review by id, with a specific verb and resource. It also explicitly distinguishes itself from list_reviews by noting the same shape as a list_reviews entry, making its scoped purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides important context: reviews live only on the legacy v4 API and were never migrated to v1, which guides when this tool should be used. It implicitly distinguishes from list_reviews (single vs. many) but does not explicitly name alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList Business Profile accountsARead-onlyIdempotent
Lists all Google Business Profile accounts the authenticated user can access (the personal account first). Each account has name (accounts/{id} — the id feeds the accountId of other tools), accountName, type (PERSONAL / LOCATION_GROUP / USER_GROUP / ORGANIZATION), role, and verificationState. The API caps pageSize at 20 (unusually small), so follow nextPageToken to see every account.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Filter expression, e.g. "type=USER_GROUP". Omit to list every account. | |
| pageSize | No | Accounts per page (1..20 — the API's hard cap; default 20). | |
| pageToken | No | nextPageToken from the previous page. | |
| parentAccount | No | Account id or accounts/{id}: list this account's sub-accounts instead of top-level ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, etc.), the description adds valuable behavioral context: the personal account ordering, the unusually small pageSize cap at 20, and the need to follow nextPageToken. It also explains how the 'name' field feeds accountId into other tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact, information-dense sentences with no fluff. Front-loaded with the core purpose, then response fields, then a critical pagination caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the burden of explaining return values. It lists all major fields, explains the id format, covers pagination, and specifies the pageSize cap. This is complete for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 does not add much about parameters themselves beyond what the schema already provides, though it reinforces the pageSize cap and nextPageToken behavior. The main added value is about the response structure, not the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Lists') and resource ('Google Business Profile accounts'), clearly distinguishing it from sibling tools like list_locations. It also defines the exact scope ('the authenticated user can access') and provides response field details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (to get accounts and account IDs for other tools) and notes the pagination cap. It does not explicitly name alternatives or exclusions, but context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_attribute_metadataList available attributesARead-onlyIdempotent
Lists which attributes (e.g. wheelchair accessibility, wi-fi, payment options) are legal for a location or for a category+region. Pass locationId for a concrete location, OR categoryName+regionCode to explore. Each entry has parent (the attribute id for update_location_attributes), valueType (BOOL / ENUM / REPEATED_ENUM / URL), displayName, repeatable and valueMetadata (legal values).
| Name | Required | Description | Default |
|---|---|---|---|
| showAll | No | Return the whole attribute catalog (requires regionCode + languageCode). | |
| pageSize | No | Attributes per page (default 200). | |
| pageToken | No | nextPageToken from the previous page. | |
| locationId | No | Location id to list attributes for (alternative to categoryName+regionCode). | |
| regionCode | No | ISO 3166-1 alpha-2 country code (with categoryName). | |
| categoryName | No | Category, e.g. "gcid:restaurant" or "categories/gcid:restaurant". | |
| languageCode | No | BCP 47 language for display names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds valuable context by outlining the structure of each returned entry (parent, valueType, displayName, repeatable, valueMetadata), which is not present in the schema or annotations. It stops short of discussing pagination or potential edge cases, but the added detail is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, then usage alternatives, then return-field details. Every sentence earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params, no output schema, rich annotations), the description covers the essential behaviors: what it lists, the two invocation modes, and the shape of each entry. It is fully sufficient for an agent to understand and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description enriches this by explaining the OR relationship between locationId and categoryName+regionCode, and clarifying that 'parent' corresponds to the attribute id used in update_location_attributes. This adds semantic meaning beyond individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Lists') and clearly defines the resource ('attributes') with concrete examples and scope ('for a location or for a category+region'). It distinguishes from siblings like list_categories and update_location_attributes by focusing on attribute metadata and legal values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs when to pass locationId versus categoryName+regionCode, and references update_location_attributes as the consumer of the 'parent' id. While it doesn't name alternative tools for contrast, the usage pattern is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesSearch business categoriesARead-onlyIdempotent
Lists/searches the reference taxonomy of business categories (e.g. gcid:restaurant). Category names (categories/gcid:...) feed location.categories on update_location and categoryName on list_attribute_metadata. view=FULL also returns serviceTypes and moreHoursTypes per category; filter narrows by display name, e.g. "displayName=coffee".
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | BASIC (default) returns name + displayName; FULL adds serviceTypes and moreHoursTypes. | |
| filter | No | Filter, e.g. "displayName=coffee". | |
| pageSize | No | Categories per page (1..100; default 100). | |
| pageToken | No | nextPageToken from the previous page. | |
| regionCode | Yes | ISO 3166-1 alpha-2 country code the categories should be valid in, e.g. "US". | |
| languageCode | Yes | BCP 47 language for display names, e.g. "en". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as read-only, idempotent, and non-destructive. The description adds meaningful behavioral detail about the taxonomy's downstream use and the additional data returned by view=FULL, going beyond what annotations convey without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and every clause provides useful context—usage, parameter effects, and relationships to sibling operations. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description outlines the primary returned fields (name, displayName, serviceTypes, moreHoursTypes) and explains how the taxonomy connects to other functions. It sufficiently covers the tool's purpose, parameters, and behavior for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since schema coverage is 100%, the schema already documents all parameters. The description adds contextual meaning by explaining that filter narrows by display name and that category names are used as identifiers in other tools, providing value beyond raw parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('Lists/searches') and a clear resource ('the reference taxonomy of business categories'), immediately distinguishing it from sibling tools like list_locations or list_attribute_metadata. The example 'gcid:restaurant' and the connection to other tools clarify its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly guides when to use the tool by stating that category names feed location.categories and categoryName, and explains how view and filter parameters affect results. It lacks an explicit 'when not to use' but provides clear contextual alignment with related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_local_postsList local postsARead-onlyIdempotent
Lists the local posts (What's New / Event / Offer updates shown on the Business Profile) of a location. Each post has name (accounts//locations//localPosts/{post_id}), summary, topicType, state (LIVE / PROCESSING / REJECTED), searchUrl, createTime and updateTime. Local posts live only on the legacy v4 API (mybusiness.googleapis.com) — they were never migrated to v1.
| Name | Required | Description | Default |
|---|---|---|---|
| pageSize | No | Posts per page (default 20). | |
| accountId | Yes | Account id — bare "123" or "accounts/123". | |
| pageToken | No | nextPageToken from the previous page. | |
| locationId | Yes | Location id — bare "456", "locations/456" or "accounts/1/locations/456". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds valuable context: the API version caveat (legacy v4 API, never migrated to v1) and the fields returned. This provides behavioral insight beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, with the main verb and resource in the first sentence, followed by a concise list of fields in the second. Every sentence contributes value, with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, the returned post fields, and the API version caveat. While it doesn't mention pagination explicitly, the schema provides pageSize and pageToken, so the context is reasonably complete for a list operation without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description does not need to explain parameters. The schema already documents each parameter (pageSize, accountId, pageToken, locationId) with clear descriptions. The description does not add extra parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists local posts for a location, with specific detail about post types (What's New / Event / Offer) and the resource name pattern. This distinguishes it from sibling create/update/delete tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for reading posts rather than modifying them, but it does not explicitly state when to use this tool over siblings or give exclusions. A brief alternative reference (e.g., 'use create_local_post to create') would improve clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_locationsList locations of an accountARead-onlyIdempotent
Lists the business locations under an account (Business Information API). Each location's name is locations/{id} — that id feeds locationId everywhere else (including the Performance API and, together with the account id, the v4 reviews/posts tools). totalSize is only present when filter is set. Fields are limited by readMask; ask for metadata to get mapsUri/placeId/newReviewUri.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Filter expression, e.g. 'title="Coffee Corner"'. Also enables totalSize in the response. | |
| orderBy | No | Sort order, e.g. "title" or "title, storeCode desc". | |
| pageSize | No | Locations per page (1..100; default 10). | |
| readMask | No | Comma-separated FieldMask of Location fields to return, e.g. "name,title,storefrontAddress,regularHours,metadata". The API requires it; omit to use the default "name,title,storefrontAddress,phoneNumbers,categories,websiteUri,metadata". | |
| accountId | Yes | Account id — bare "123" or "accounts/123" (get it from list_accounts). | |
| pageToken | No | nextPageToken from the previous page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, covering safety. The description adds valuable behavioral details: totalSize presence depends on filter, fields are controlled by readMask, and metadata must be requested for mapsUri/placeId/newReviewUri. This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose, id linkage, and conditional behavior. Front-loaded with the core verb and resource, no fluff or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with no output schema, the description covers key caveats: id naming convention, totalSize condition, readMask effect, and metadata fields. It does not explicitly describe pagination behavior or default values, but the schema documents pageToken and pageSize defaults. Overall fairly complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all 6 parameters, so baseline is 3. The description adds some context about how the response id feeds locationId elsewhere, but this is output-related rather than param-specific. It reinforces readMask guidance already in the schema but doesn't materially extend parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Lists the business locations under an account', a specific verb+resource that clearly differentiates from siblings like get_location or list_accounts. It also states the API context (Business Information API) and explains how the returned id feeds other tools, further clarifying its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on when to use this tool: to get location IDs that feed locationId elsewhere (Performance API, reviews/posts). It also notes that totalSize only appears with a filter and that readMask limits fields, guiding usage. It does not explicitly name alternatives or say 'when not to use', but the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reviewsList reviewsARead-onlyIdempotent
Lists reviews of a location, newest-updated first by default. Response: reviews[] of {name, reviewId, reviewer{displayName, isAnonymous}, starRating (ONE..FIVE enum, not a number), comment, createTime, updateTime, reviewReply{comment, updateTime} if answered}, plus averageRating (1–5) and totalReviewCount. pageSize caps at 50. Reviews live only on the legacy v4 API (mybusiness.googleapis.com) — they were never migrated to v1.
| Name | Required | Description | Default |
|---|---|---|---|
| orderBy | No | Sort order; default "updateTime desc". | |
| pageSize | No | Reviews per page (1..50 — API cap; default 50). | |
| accountId | Yes | Account id — bare "123" or "accounts/123". | |
| pageToken | No | nextPageToken from the previous page. | |
| locationId | Yes | Location id — bare "456", "locations/456" or "accounts/1/locations/456". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent, but the description adds substantial behavioral detail: the exact response shape (reviews[] with name, reviewer, starRating, etc.), that starRating is an enum not a number, a pageSize cap of 50, and that reviews exist only on the legacy v4 API. This goes beyond structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver core behavior, response contract, and a critical API-version caveat. Every clause is information-dense without redundancy, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description compensates by fully describing the return shape, averageRating, totalReviewCount, and pagination cap. It also warns about the legacy v4 API. It doesn't cover error conditions or pageToken mechanics beyond schema, but that's acceptable for a read-only list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 5 parameters have full schema descriptions (100% coverage), so the baseline is 3. The description adds minimal parameter-specific value beyond the schema—the pageSize cap and default ordering are already in the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Lists reviews of a location' which is a specific verb-plus-resource, and adds 'newest-updated first by default' to clarify ordering. It clearly distinguishes from sibling get_review by focusing on plural reviews and includes the notable legacy v4 API context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: what it lists, default sort, pageSize cap, and the legacy v4 API caveat. However, it does not explicitly compare with get_review or state when not to use it, so it falls short of explicit alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_search_keyword_impressionsMonthly search keywordsARead-onlyIdempotent
Returns the search keywords that surfaced the business on Google, month by month. Response: searchKeywordsCounts[] of {searchKeyword, insightsValue} — insightsValue is a UNION: either an exact {value} or a {threshold} for low-volume keywords (the true count is below it; never sum thresholds as exact counts). Months are calendar months; data for the current month appears with a lag.
| Name | Required | Description | Default |
|---|---|---|---|
| endMonth | Yes | Last month (inclusive), e.g. 2026-06. | |
| pageSize | No | Keywords per page (1..100; default 100). | |
| pageToken | No | nextPageToken from the previous page. | |
| locationId | Yes | Location id from list_locations (the unobfuscated listing id; locations/123 also works). | |
| startMonth | Yes | First month (inclusive), e.g. 2026-01. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, openWorldHint, and idempotentHint annotations, the description discloses a critical behavioral nuance: insightsValue is a union that can be either an exact value or a threshold for low-volume keywords, and it explicitly warns against summing thresholds as exact counts. It also clarifies that months are calendar months and that the current month's data lags, which is useful for interpreting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is just two sentences. The first establishes the primary purpose, and the second covers the response union and the key caveat about thresholds. Every sentence earns its place, and the most important warning is prominently placed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a union return type and time-sensitive data, the description fully covers the essential aspects: response shape, union semantics, month calendar handling, and the lag. Since the schema already documents all parameters and there is no output schema, this description is complete enough for an agent to invoke the tool and correctly interpret returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All five parameters are already thoroughly described in the input schema (100% coverage), including formats, defaults, and the relationship of locationId to list_locations. The description does not add parameter-specific details, such as how startMonth and endMonth interact with the lag, so it remains at the schema-documented baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Returns the search keywords that surfaced the business on Google, month by month.' This clearly communicates what the tool does and distinguishes it from siblings such as get_daily_metrics or search_chains by emphasizing monthly, keyword-level Google impression data. The title 'Monthly search keywords' reinforces the same.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool—when you need monthly search keyword impressions—and adds practical context by noting that current month data appears with a lag, which helps set expectations. However, it does not explicitly mention alternatives, such as 'use search_chains for chain-level data' or 'use get_daily_metrics for daily trends,' and there are no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raw_requestRaw Google Business Profile API callADestructive
Escape hatch to call any Google Business Profile endpoint directly, for endpoints without a dedicated tool. service picks the host: accounts (mybusinessaccountmanagement, v1), businessinfo (mybusinessbusinessinformation, v1), performance (businessprofileperformance, v1) or v4 (legacy mybusiness.googleapis.com — reviews, posts, media). path is relative to the host, e.g. "v1/accounts" or "v4/accounts/1/locations/2/media". Remember v1 quirks: readMask/updateMask go in query. The Bearer token is attached automatically; a path resolving to a foreign origin is rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | JSON request body (POST/PUT/PATCH). | |
| path | Yes | API path relative to the host, e.g. "v1/accounts". | |
| query | No | Query parameters (arrays become repeated params). | |
| method | No | HTTP method; defaults to GET. | |
| service | Yes | Which API host to call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive and non-idempotent. The description adds valuable behavioral details: Bearer token auto-attachment, rejection of foreign-origin paths, and the v1 quirk that readMask/updateMask belong in query parameters. This goes beyond the annotations to explain safety and request construction nuances.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph but each sentence contributes meaning—purpose, service selection, path format, and quirks. It is front-loaded with the primary use case and remains appropriately sized for the tool's complexity, though it could benefit from a slight structural split.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema, the description covers the essential operational context: supported services, path construction, auth, and a safety constraint. Since this is a raw API caller, the return format is inherently whatever the underlying API returns, so not describing it is acceptable. The description handles the critical gotchas.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already describes each parameter, the description adds essential semantics for the service parameter by mapping each enum value to its host and API version. It also provides concrete path examples, which helps the agent construct valid paths beyond the schema's minimal definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this tool is an 'escape hatch to call any Google Business Profile endpoint directly, for endpoints without a dedicated tool.' This uses a specific verb and resource, and immediately distinguishes it from the many sibling tools by specifying when it should be used.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool 'for endpoints without a dedicated tool,' which is a clear usage guideline. It also explains how to choose the correct service and describes the path format, giving the agent the context needed to decide when raw_request is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_reviewReply to a reviewAIdempotent
Creates OR replaces the business's public reply to a review (PUT upsert — there is no separate create, and calling it again overwrites the previous reply). Only works on verified locations. Returns the ReviewReply {comment, updateTime}. Counts against the 10 edits/min per-profile cap. Reviews live only on the legacy v4 API (mybusiness.googleapis.com) — they were never migrated to v1.
| Name | Required | Description | Default |
|---|---|---|---|
| comment | Yes | The public reply text (plain text; keep it concise — very long replies may be rejected). | |
| reviewId | Yes | Review id (from list_reviews `reviewId` or `name`). | |
| accountId | Yes | Account id — bare "123" or "accounts/123". | |
| locationId | Yes | Location id — bare "456", "locations/456" or "accounts/1/locations/456". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds several behavioral details beyond the annotations: PUT upsert overwriting, verified-location requirement, rate limit of 10 edits/min, and v4-only availability. These complement the idempotent hint and readOnly=false without contradicting any annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences pack a large amount of relevant detail without redundancy. Information is ordered from the core verb to the implications, making it front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 4 required params and no output schema, the description covers prerequisites (verified locations), return value format (ReviewReply {comment, updateTime}), rate-limit implications, and API version. This is comprehensive for an AI agent to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 4 params with descriptions, but the description adds meaning about the upsert effect on the existing reply and the reply text constraints. It clarifies that comment will replace any prior reply, which is not encoded in the schema, and notes the return value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Creates OR replaces the business's public reply to a review,' which clearly identifies the action and resource. It also distinguishes itself from sibling tools like delete_review_reply and get_review by explaining the PUT upsert semantics and that it returns the ReviewReply.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains that this only works on verified locations, clarifies there is no separate create (calling again overwrites), and notes the legacy v4 API constraint. However, it doesn't explicitly name alternative tools for specific conditions (e.g., 'use delete_review_reply to remove'), so it misses the explicit alternatives benchmark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_chainsSearch chainsARead-onlyIdempotent
Searches business chains by name (exact/partial/fuzzy), ranked by relevance. Each chain has name (chains/{chain_id}), chainNames, websites and locationCount. Use the chain name when relating a location to its brand (location.relationshipData).
| Name | Required | Description | Default |
|---|---|---|---|
| pageSize | No | Matches to return (1..500; default 10). | |
| chainName | Yes | Chain name to search for, e.g. "walmart". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds value by disclosing search behavior (exact/partial/fuzzy, relevance ranking) and the structure of each chain (name, chainNames, websites, locationCount), which enriches the agent's understanding beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and search mode, followed by concise details about the return fields and usage hint. Every sentence earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with two parameters and no output schema, the description is complete: it explains what is searched, how it is matched, what is returned, and how to interpret the result for downstream usage. This fully equips the agent to invoke the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both pageSize and chainName are already documented with descriptive text. The description reinforces that search is by name but doesn't add parameter-specific constraints or syntax beyond what the schema provides. It does add context about returned fields, but that's more output semantics than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches business chains by name with exact/partial/fuzzy matching, and specifies the resource (business chains) and the outcome (ranked by relevance). It distinguishes itself from sibling tools like list_locations by focusing on chain-level search rather than listing locations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use this tool (searching for a chain by name) and even explains how to use the result ('Use the chain name when relating a location to its brand'). It doesn't explicitly mention alternatives or exclusions, but the intended use case is well implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_local_postUpdate a local postAIdempotent
Updates fields of an existing local post (PATCH with a required updateMask — only masked fields change, e.g. updateMask "summary" with post {"summary": "New text"}). LocalPost fields: languageCode; summary (the post text); topicType (STANDARD | EVENT | OFFER | ALERT); callToAction {actionType: BOOK | ORDER | SHOP | LEARN_MORE | SIGN_UP | CALL, url}; event {title, schedule{startDate{year,month,day}, startTime{hours,minutes}, endDate, endTime}} — required for EVENT and OFFER; offer {couponCode, redeemOnlineUrl, termsConditions}; media [{mediaFormat: "PHOTO", sourceUrl}]. ALERT posts are restricted to Google-initiated campaigns and are typically rejected. Returns the updated post. Counts against the 10 edits/min per-profile cap. Local posts live only on the legacy v4 API (mybusiness.googleapis.com) — they were never migrated to v1.
| Name | Required | Description | Default |
|---|---|---|---|
| post | Yes | Partial LocalPost with the new field values. | |
| postId | Yes | Local post id (last segment of the post's `name`). | |
| accountId | Yes | Account id — bare "123" or "accounts/123". | |
| locationId | Yes | Location id — bare "456", "locations/456" or "accounts/1/locations/456". | |
| updateMask | Yes | Comma-separated FieldMask of post fields to overwrite, e.g. "summary,callToAction". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, idempotentHint=true, etc.), the description discloses the updateMask partial-update behavior, ALERT rejection risk, rate limit, legacy v4 API constraint, and return value. This is rich context that annotations alone do not provide. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence provides actionable information: patch semantics, field structure, restrictions, rate limit, API compatibility. No filler words or redundant repetition of schema content. Appropriately front-loaded with the core action and key constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 5 required params, nested objects, and no output schema, the description is complete: it explains the updateMask behavior, nested field hierarchy, required fields for EVENT/OFFER, media format, ALERT restrictions, rate limit, and legacy API context. An agent has all needed information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema covers each top-level parameter (100% coverage), the description adds substantial meaning for nested objects (callToAction, event, offer, media) with allowed values, required conditions, and examples for updateMask. This goes far beyond the schema's minimal descriptions, especially for the unstructured 'post' object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Updates fields of an existing local post' with a specific verb and resource, and distinguishes it from sibling tools like create_local_post and delete_local_post by emphasizing 'existing' and the PATCH/updateMask mechanism. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for existing posts and gives important context: ALERT posts are restricted/rejected and the 10 edits/min cap. It does not explicitly name alternatives like create_local_post for new posts, but the distinction is clear enough for an agent. Lacking explicit 'when not to use' but context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_locationUpdate a locationAIdempotent
Updates fields of a location (PATCH with a required updateMask — only masked fields change). Pass the new values in location, e.g. {"title": "New name"} with updateMask "title". Set validateOnly to check the change without applying it. Note: every profile has a hard cap of 10 edits per minute (not raisable) — batch your changes into one call where possible. Returns the updated Location.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Location object with the new field values (only fields named in updateMask are applied). | |
| locationId | Yes | Location id — bare "123", "locations/123" or "accounts/1/locations/123" all work. | |
| updateMask | Yes | Comma-separated FieldMask of the fields to overwrite, e.g. "title,phoneNumbers.primaryPhone". | |
| validateOnly | No | If true, validate the update without applying it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish mutation (readOnlyHint=false) and idempotency, but the description adds critical non-obvious behavior: PATCH semantics with updateMask, the 10-edits-per-minute hard cap, validateOnly behavior, and that it returns the updated Location. This exceeds what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the core purpose, then usage, then the rate-limit caveat, and ends with return type. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers update semantics, an example, validation mode, rate limiting, batching advice, and return value. Sibling tools overlap but the description is complete enough to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a concrete example showing how location and updateMask interact, and clarifies validateOnly. This exceeds mere schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Updates fields of a location') and clearly differentiates from sibling tools like update_location_attributes. It also specifies the PATCH method and the required updateMask, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: how to pass new values, the role of updateMask, validateOnly for dry-run checks, and a rate limit note advising batching. It does not explicitly mention when to use this instead of alternatives, but the context is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_location_attributesUpdate location attributesAIdempotent
Updates attributes of a location (PATCH). Each attribute needs its name (attributes/{attribute_id} from list_attribute_metadata's parent field) plus values (BOOL/ENUM), uriValues (URL) or repeatedEnumValue ({setValues, unsetValues}). attributeMask defaults to the names of the attributes you pass; name an attribute in the mask with no values to clear it. Counts against the 10 edits/min per-profile cap.
| Name | Required | Description | Default |
|---|---|---|---|
| attributes | Yes | Attribute objects to set, e.g. [{"name": "attributes/wi_fi", "repeatedEnumValue": {"setValues": ["free_wi_fi"]}}]. | |
| locationId | Yes | Location id — bare "123", "locations/123" or "accounts/1/locations/123" all work. | |
| attributeMask | No | Comma-separated attribute names to update. Defaults to the names of `attributes`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations, detailing PATCH semantics, the attributeMask default/clearing behavior, the required value formats (BOOL/ENUM, uriValues, repeatedEnumValue), and the rate limit cap. This adds significant behavioral context beyond the readOnlyHint/destructiveHint/idempotentHint annotations, with no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with four sentences each containing essential information: purpose, attribute format, mask default/clearing, and rate limit. It is front-loaded with the tool's action and has no filler, making every sentence earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (attribute update with flexible value types, mask logic) and the availability of strong annotations, the description covers all necessary aspects for selection and invocation. It explains how to use the tool effectively, including edge cases like clearing attributes, and even mentions the per-profile rate cap. No output schema exists, but the description's operational detail is sufficient for an update operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description enriches parameter understanding substantially. It explains the source of attribute names from list_attribute_metadata's parent field, the allowed value shapes for the attributes array, and the default behavior of attributeMask. This goes beyond the schema's individual parameter descriptions and provides critical usage nuance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Updates attributes of a location (PATCH)' with a specific verb and resource. It distinguishes itself from siblings like update_location by focusing on attributes, and references list_attribute_metadata for attribute IDs, providing scope and precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context, including how to construct attributes (name + value types), how attributeMask defaults to passed attribute names, and how to clear attributes by naming them in the mask with no values. It also mentions the rate limit cap. While it doesn't explicitly contrast with alternatives, the context makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
20 tool updates
v0.1.0- First observed
create_local_post - First observed
delete_local_post - First observed
delete_review_reply - First observed
fetch_multi_daily_metrics - First observed
get_daily_metrics - First observed
get_location - First observed
get_review - First observed
list_accounts - First observed
list_attribute_metadata - First observed
list_categories - First observed
list_local_posts - First observed
list_locations - First observed
list_reviews - First observed
list_search_keyword_impressions - First observed
raw_request - First observed
reply_to_review - First observed
search_chains - First observed
update_local_post - First observed
update_location - First observed
update_location_attributes
TDQS
Scored across 20 tools
Each tool targets a distinct resource and action: accounts, locations, categories, attributes, metrics, reviews, and posts are all clearly separated. The only pair that could seem similar is get_daily_metrics and fetch_multi_daily_metrics, but their names and descriptions make the single-vs-batch distinction unambiguous.
All tool names follow a consistent snake_case verb_noun pattern (list_accounts, get_location, update_location, create_local_post, delete_review_reply). The only outlier is raw_request, which is intentional as an escape hatch and does not disrupt the overall pattern.
With 20 tools, the set is slightly on the heavier side but still well-scoped for Google Business Profile's broad domain. Each tool earns its place, covering accounts, locations, attributes, metrics, reviews, and posts, plus a raw request fallback.
The set covers most core workflows—locations (list/get/update), reviews (list/get/reply/delete reply), posts (CRUD), and metrics. However, there are notable gaps: no create_location or delete_location tools, and no way to read a location's attributes directly (only list metadata and update attributes).
Maintenance
Related MCP Connectors
Read and filter your Google Business Profile reviews, get stats, and send review requests.
Live Google Maps business search, review, and photo data for AI agents over MCP.
Find local businesses, enrich them with emails and socials, and run lead pipelines from your AI.
Local business intel for AI agents: audits, lead scoring, tech stack, prospecting.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to fetch, analyze, and respond to Google Business Profile reviews with AI-generated replies through secure OAuth integration with Google's My Business API.8MIT
- AlicenseBqualityDmaintenanceEnables access to Google Maps business data including search, reviews, photos, and geocoding. Supports searching businesses by location, area, or coordinates, retrieving detailed business information, reviews, and performing reverse geocoding operations.13MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Google Business Profiles by creating posts, replying to reviews, listing locations, and more through natural language commands.1-
- AlicenseBqualityDmaintenanceEnables managing Google Analytics 4 properties, data streams, conversions, and running reports using natural language through the Admin and Data APIs.23MIT