Announcing CIMD support for MCP Client registration
Learn more

For Tool Calling, Use Google Business Profile MCP or API in Your AI Agent?

Nishant Choudhary
Tech Evangelist

TL;DR

  • Google has not shipped a first-party Model Context Protocol (MCP) server for Business Profile. It has for Google Ads and Google Analytics. Every Google Business Profile MCP server available today is a wrapper someone else built over the same REST endpoints, which means the real question is who controls the wrapper.
  • The Business Profile APIs expose exactly one OAuth scope: https://www.googleapis.com/auth/business.manage. There is no read-only variant, no per-resource scope, and no documented API key path. Consent to read insights is consent to delete locations.
  • Access is gated before either path. New Google Cloud projects start at 0 quota, and Google reviews access applications within 14 days at the project level.
  • Write quotas bite harder than read quotas. Location edits are capped at 10 per minute per Business Profile and Google states that ceiling cannot be increased.
  • Neither path solves per-merchant credential isolation. Scalekit's Google Business Profile connector ships 56 prebuilt tools, vaults the refresh token per merchant, and exposes the same surface as a scoped Virtual MCP endpoint, so the MCP-versus-API choice stops being an auth decision.

Your agent needs to read insights, reply to reviews, and push hours updates to Google Business Profile. You go looking for the MCP server the way you would for Notion or GitHub, and the search results are a wall of third-party gateways. That is not a discovery failure. Google genuinely has not published one, which means the usual comparison collapses into a different question: not MCP or API, but whose MCP wrapper, over an API that only issues one all-or-nothing scope. Here is how to pick.

What Google Business Profile MCP and the Business Profile API actually are

These two paths are not peers the way they are for other connectors. One is a protocol layer that anyone can build; the other is the only real capability surface underneath it. Getting that relationship right is what makes the rest of the decision tractable.

There is no official Google Business Profile MCP server

Google ships official MCP servers for some products. The Google Ads MCP server is documented on Google's developer portal, and the Google Analytics MCP server has its own guide. Business Profile has neither.

The Business Profile latest updates page tracks shipped changes through mid-2026: review reply URLs, policy violation visibility, recurring post scheduling. No MCP server. So when you evaluate "Google Business Profile MCP," you are evaluating a wrapper, and the operative question is who maintains it and whose credentials it holds.

What the Business Profile APIs actually expose

The Business Profile APIs are not one API. They are a federated set of separately enabled Google services, plus a legacy endpoint that still carries a lot of the interesting surface.

Location data, categories, and attributes live on the Business Information API. Account and admin management lives on the Account Management API. Metrics live on the Business Profile Performance API at businessprofileperformance.googleapis.com. Verifications, Notifications, Place Actions, and Lodging each have their own service.

Reviews, local posts, and media did not migrate. They still resolve against mybusiness.googleapis.com/v4, the legacy Google My Business API. A review-reply agent is therefore a legacy-endpoint agent, whatever the rest of your integration looks like.

The access gate that comes before either path

Neither path starts working when you enable the API. Google's prerequisites documentation requires a verified Business Profile active for 60 or more days, a website representing that business, and a submitted application for Basic API Access.

Approval is granted per Google Cloud project and reviewed within 14 days. Until then, quota reads 0, and Google's guidance is explicit: a 0 quota means you were never approved, so do not file a quota increase.

Plan the approval window into your roadmap. It is the longest lead time in the whole build, and no protocol choice shortens it.

What your agent can actually do

Because both paths terminate at the same REST services, capability differences do not come from the protocol. They come from which endpoints the wrapper author bothered to implement, and from how much of Google's field-mask semantics survive the translation into an LLM-callable schema.

Coverage against the Scalekit tool surface

The table below compares Scalekit's Google Business Profile connector, which ships 56 prebuilt tools, against writing your own HTTP calls to Google directly. Any other MCP wrapper should be evaluated on the same rows.

Capability
MCP tool surface
Direct Business Profile API
List accounts, locations, and admins
Yes
Yes
Read location fields via readMask
Yes
Yes, with full field selection
Partial listing update via update_mask
Yes, mask exposed as a tool parameter
Yes, mask fully under your control
Reviews: list, get, reply
Yes, on the legacy v4 endpoint
Yes, on the legacy v4 endpoint
Local posts: create, update, delete
Yes, on the legacy v4 endpoint
Yes
Media: add and delete by source URL
Yes
Yes, plus resumable upload paths
Daily performance metrics, single and multi
Yes
Yes
Monthly search keyword impressions
Yes
Yes
Questions and answers
Yes
Yes
Verification: options, start, complete, history
Yes
Yes
Pub/Sub notification settings
Yes, settings only
Yes, and you own the subscriber
Food Menus, Lodging, Place Actions
Not in the prebuilt tool list
Yes
Endpoints Google ships next quarter
Only once the wrapper ships them
Available on release day

Where any MCP wrapper loses ground

The last two rows are the honest gap. A wrapper is a snapshot of the API at the moment it was written. Google added recurring post scheduling in April 2026 and review reply URLs in July 2026; each of those reached wrapper users later than it reached direct API callers.

Lodging and Place Actions matter less to most builders, but if you serve hotels or booking-heavy verticals, that gap is your whole product. Check the tool list against your vertical before you commit.

Where a tool layer beats raw HTTP

The Business Profile APIs are unusually hostile to naive LLM tool generation. Resource names are nested strings like accounts/{account_id}/locations/{location_id}/questions/{question_id}. Performance metrics take year, month, and day as separate integer fields rather than a date string. Categories resolve through opaque identifiers such as categories/gcid:restaurant.

Writing the schema is the hard part. Not the API call. Every one of those shapes has to be described well enough that a model fills it correctly, and every one of them is a place a hand-rolled schema produces hallucinated parameters.

The auth path each one puts you on

This is where Google Business Profile diverges sharply from the other connectors in this series. For Notion or GitHub, the direct API path buys you auth options that MCP does not offer. Here it buys you nothing, because there is only one door.

One scope, no granularity

Google's OAuth implementation guide states the requirement plainly: requests require https://www.googleapis.com/auth/business.manage, or the deprecated plus.business.manage retained for backward compatibility. That is the entire scope vocabulary.

There is no business.readonly. There is no reviews-only scope. A merchant who authorizes your read-only insights dashboard has, at the OAuth layer, also authorized deleting locations, transferring them to another account, and removing administrators.

For a human-driven SaaS product that is uncomfortable. For an autonomous agent choosing its own tool calls, it is a design problem you have to solve above OAuth, because OAuth will not solve it for you. This is the same structural challenge covered in OAuth vs API keys for AI agents — static, overly broad credentials become liabilities at scale.

What MCP changes and what it does not

An MCP endpoint does not widen or narrow that scope. The token underneath is the same business.manage grant, obtained through the same Authorization Code flow (RFC 6749) with the same merchant consent dialog.

What MCP can change is the tool surface the model sees. If the endpoint exposes only googlebusinessprofile_get_insights and googlebusinessprofile_search_keywords, the destructive operations are not in context to be selected, even though the token would permit them.

That is enforcement at the tool layer standing in for enforcement Google does not offer at the scope layer. It is the single strongest argument for routing this connector through MCP rather than raw HTTP. Understanding tool calling authentication for AI agents makes this tradeoff clearer — the protocol you choose shapes what enforcement mechanisms are available.

The multi-tenant consequence

Both paths give you one token per merchant. An agency platform managing 400 client profiles holds 400 refresh tokens, each revocable independently from the merchant's Google Account permissions page.

Google documents no push signal for OAuth revocation. Pub/Sub notifications cover NEW_REVIEW, GOOGLE_UPDATE, and LOSS_OF_VOICE_OF_MERCHANT, not "this merchant just disconnected you." You discover revocation when a call fails.

Cross-tenant tool calling requires per-tenant authorization. There is no shortcut, and the protocol you picked does not change the arithmetic. The patterns that emerge here are the same ones explored in how tool calling auth changes when you move from single-tenant to multi-tenant.

What you own in production

Staging hides all of this. In staging you have one approved project, one merchant, one location, and fresh tokens. Production has 400 merchants, thousands of locations, and a quota ceiling you will find by hitting it.

Quotas, 429s, and the pacing problem

Google publishes default quota limits of 300 queries per minute for Business Information, Account Management, Performance, Verifications, Lodging, Place Actions, and Notifications. Exceeding them returns 429 Too Many Requests.

300 QPM is 5 requests per second, and Google explicitly discourages spiky traffic. Its own guidance recommends pacing with a delay between calls and retrying with exponential backoff plus jitter.

Here is the trap specific to agents. The v1 Performance API dropped the v4 batch pattern that let one request span multiple listings, so a nightly metrics sweep across 400 locations is 400 sequential calls, not one. An agent that fans those out in parallel because parallelism is faster will produce exactly the burst pattern Google penalizes.

The write ceiling nobody plans for

Read quota is generous. Write quota is not, and the numbers are asymmetric in a way that catches teams late.

Create Location is capped at 300 per day. SearchGoogleLocation is 300 per day. Update Location is 10,000 per day. Then the one that actually breaks agents: edits are limited to 10 per minute per Business Profile, and Google states that this ceiling cannot be increased.

An agent doing an iterative correction loop on one location, updating hours, then the phone number, then the category, will hit that ceiling inside a single reasoning cycle. Design for batched writes, not conversational ones.

The update_mask hazard

googlebusinessprofile_update_listing takes an update_mask naming which fields to change. Google clears any field named in the mask that arrives blank in the request body.

Read that again in the context of an LLM composing the arguments. A model that names title,phoneNumbers,regularHours in the mask but only supplies title does not partially update the listing. It wipes the phone number and the opening hours from Google Search and Maps.

This is the highest-severity failure mode in the entire connector, and it is a schema-quality problem, not a model-quality problem. Constrain the mask, or accept that a bad tool call is a live customer-facing outage.

Legacy v4 endpoints and 403 ambiguity

Reviews, posts, media, and Q&A route to the legacy v4 API. Scalekit's connector documentation flags that these tools can return 403 when the OAuth client has not been allow-listed for those legacy endpoints.

That matters operationally because a 403 there is a configuration state, not a code defect. Teams lose days treating it as a bug in their request construction. Check allow-list status first, then debug the payload.

Voice of Merchant, the gate behind the gate

A location can be authorized, quota-approved, and still silently reject edits. Google gates whether your changes surface on Search and Maps behind a state called Voice of Merchant: verified, not suspended, and eligible.

Call googlebusinessprofile_get_voice_of_merchant_state before any write path and surface the blocking condition. An agent that reports "updated successfully" for a location that lacks Voice of Merchant is lying to your customer, and the API will not tell you unless you ask.

When to use MCP, when to use the API

Because both paths hit identical endpoints, this is not a capability decision. It is a decision about where you want scope enforcement, schema maintenance, and credential handling to live.

Use an MCP endpoint when

  • You are building an interactive local-marketing assistant where a merchant asks about impressions, call clicks, and direction requests in natural language, and the tool surface should be read-only regardless of what the business.manage token permits.
  • You are running a review-response agent across many merchants and want the destructive location operations absent from context entirely, not merely discouraged by a prompt.
  • You are orchestrating Google Business Profile alongside other connectors in one agent, and want a single endpoint rather than one auth integration per tool.
  • You are prototyping and the 56 prebuilt tools cover your vertical, so the schema work is already done.

Use the direct API when

  • You need Lodging, Place Actions, or Food Menus, which no prebuilt tool list currently covers.
  • You are running a high-volume nightly sync across hundreds of locations where you need explicit control over request pacing, backoff, and the 429 retry envelope.
  • You own the Pub/Sub subscriber for NEW_REVIEW and GOOGLE_UPDATE events and are building an event-driven pipeline rather than an agent loop.
  • You need a Google API feature the same week Google ships it, and cannot wait for a wrapper to catch up.

Most production builds end up doing both, and that is fine. Scalekit's request method exists precisely so the escape hatch runs through the same vaulted credential as the prebuilt tools.

The credential problem that exists on both paths

Both paths hand you a refresh token per merchant. Neither hands you a vault, a rotation policy, or a revocation flow. That gap is identical whether you chose MCP or raw HTTP, because the gap is not in the protocol.

N merchants, N refresh tokens

An agency platform with 400 client profiles stores 400 refresh tokens, encrypted at rest, isolated per tenant, never written to a log. Access tokens expire hourly. Refresh must be proactive rather than triggered by a 401, because reactive refresh across concurrent agent threads produces exactly the race conditions that make background execution unstable. The right approach to this is covered in detail in how to handle token refresh for AI agents.

Merchants revoke from their Google Account whenever a business relationship ends, with no callback to you. Every one of those becomes a silently failing scheduled agent until someone notices the dashboard stopped updating.

Where Scalekit fits

Scalekit's Google Business Profile connector handles the Authorization Code flow, per-tenant token storage, and refresh orchestration for both paths, so the MCP-versus-API decision does not change your auth infrastructure. Credentials never touch the agent runtime.

The connector-level detail that matters here: because business.manage cannot be narrowed at the scope layer, Scalekit's per-user scoped tool surface is doing the least-privilege work Google's OAuth implementation leaves undone.

Building a Google Business Profile agent with Scalekit

The flow is the same in Python and TypeScript: configure the connection once, authorize each merchant once, retrieve the tools that merchant's connected account authorizes, then run the agent loop. Full setup steps are in the connector documentation.

Set up the connection

Register your Google OAuth client in the Scalekit dashboard under AgentKit, then Connections. You supply the client ID and secret from your approved Google Cloud project along with the business.manage scope, and Scalekit supplies the redirect URI to paste into Google Cloud Console.

One detail costs people an afternoon: the connection name Scalekit generates is not googlebusinessprofile. It may be something like local-seo-agent-googlebusinessprofile. Copy the exact value from the dashboard and use it as connection_name everywhere.

pip install scalekit-sdk-python anthropic SCALEKIT_ENVIRONMENT_URL=<your-environment-url> SCALEKIT_CLIENT_ID=<your-client-id> SCALEKIT_CLIENT_SECRET=<your-client-secret>

Authorize the merchant

Each merchant authorizes once. Scalekit creates a connected account holding that merchant's tokens and tracking their auth state, keyed by whatever identifier your application already uses.

import os from scalekit import ScalekitClient scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions CONNECTION = "googlebusinessprofile" # use the exact name from your dashboard IDENTIFIER = "merchant_acme_coffee" response = actions.get_or_create_connected_account( connection_name=CONNECTION, identifier=IDENTIFIER, ) if response.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION, identifier=IDENTIFIER, ) print("Authorize Google Business Profile:", link.link) input("Press Enter after authorizing...")

Scope the tool surface before the model sees it

This is the step that compensates for the single-scope problem. The agent does not load a connector catalog; it loads the tools this merchant's connected account is authorized to call, filtered to the subset this agent role needs.

The arithmetic is worth stating. On Scalekit's own estimate of roughly 200 tokens per tool definition, all 56 Google Business Profile tools cost about 11,000 tokens of context before the agent does any work. Scoping to six read tools removes most of that and removes googlebusinessprofile_delete_location from the decision space entirely.

READ_ONLY_TOOLS = [ "googlebusinessprofile_list_accounts", "googlebusinessprofile_list_locations", "googlebusinessprofile_get_location", "googlebusinessprofile_get_insights", "googlebusinessprofile_search_keywords", "googlebusinessprofile_get_voice_of_merchant_state", ] scoped_response, _ = actions.tools.list_scoped_tools( identifier=IDENTIFIER, filter={ "connection_names": [CONNECTION], "tool_names": READ_ONLY_TOOLS, }, page_size=100, )

Run the agent loop with the Claude SDK

Scalekit returns schemas with input_schema, the exact shape Anthropic's tool use API expects, so no conversion layer sits between the two. The loop below is complete: message construction, the messages.create call, the stop_reason check, tool result construction, and the message append.

import anthropic from google.protobuf.json_format import MessageToDict client = anthropic.Anthropic() llm_tools = [ { "name": MessageToDict(t.tool).get("definition", {}).get("name"), "description": MessageToDict(t.tool).get("definition", {}).get("description", ""), "input_schema": MessageToDict(t.tool).get("definition", {}).get("input_schema", {}), } for t in scoped_response.tools ] messages = [{ "role": "user", "content": ( "For every location on this account, pull call clicks and website clicks " "for June 2026 and tell me which three locations declined the most." ), }] while True: response = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, tools=llm_tools, messages=messages, ) if response.stop_reason == "end_turn": print(response.content[0].text) break tool_results = [] for block in response.content: if block.type == "tool_use": result = actions.execute_tool( tool_name=block.name, identifier=IDENTIFIER, tool_input=block.input, ) tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": str(result.data), }) messages.append({"role": "assistant", "content": response.content}) messages.append({"role": "user", "content": tool_results})

Note what the model never receives: the merchant's access token, the refresh token, or the Google client secret. execute_tool resolves the credential server-side at request time.

The same flow in TypeScript

The Node SDK mirrors the Python surface with camelCase naming. This variant scopes to the review-response tools, which is the other common Google Business Profile agent shape.

npm install @scalekit-sdk/node @anthropic-ai/sdk
import { ScalekitClient } from '@scalekit-sdk/node'; import { ConnectorStatus } from '@scalekit-sdk/node/lib/pkg/grpc/scalekit/v1/connected_accounts/connected_accounts_pb'; import Anthropic from '@anthropic-ai/sdk'; const scalekit = new ScalekitClient( process.env.SCALEKIT_ENVIRONMENT_URL!, process.env.SCALEKIT_CLIENT_ID!, process.env.SCALEKIT_CLIENT_SECRET!, ); const anthropic = new Anthropic(); const CONNECTION = 'googlebusinessprofile'; const IDENTIFIER = 'merchant_acme_coffee'; const { connectedAccount } = await scalekit.actions.getOrCreateConnectedAccount({ connectionName: CONNECTION, identifier: IDENTIFIER, }); if (connectedAccount?.status !== ConnectorStatus.ACTIVE) { const { link } = await scalekit.actions.getAuthorizationLink({ connectionName: CONNECTION, identifier: IDENTIFIER, }); console.log('Authorize Google Business Profile:', link); } const { tools } = await scalekit.tools.listScopedTools(IDENTIFIER, { filter: { connectionNames: [CONNECTION], toolNames: [ 'googlebusinessprofile_list_reviews', 'googlebusinessprofile_get_review', 'googlebusinessprofile_reply_to_review', ], }, pageSize: 100, }); const llmTools = tools.map(t => ({ name: t.tool.definition.name, description: t.tool.definition.description, input_schema: t.tool.definition.input_schema, })); const messages: Anthropic.MessageParam[] = [{ role: 'user', content: 'Find unanswered reviews below 3 stars from the last week and draft a reply to each.', }]; while (true) { const response = await anthropic.messages.create({ model: 'claude-sonnet-4-6', max_tokens: 1024, tools: llmTools, messages, }); if (response.stop_reason === 'end_turn') { const text = response.content.find(b => b.type === 'text'); if (text?.type === 'text') console.log(text.text); break; } const toolResults: Anthropic.ToolResultBlockParam[] = []; for (const block of response.content) { if (block.type === 'tool_use') { const result = await scalekit.actions.executeTool({ toolName: block.name, identifier: IDENTIFIER, toolInput: block.input as Record<string, unknown>, }); toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: JSON.stringify(result.data), }); } } messages.push({ role: 'assistant', content: response.content }); messages.push({ role: 'user', content: toolResults }); }

A production version of this agent should gate googlebusinessprofile_reply_to_review behind human approval. Replying overwrites any existing reply, and the write is immediately public on Google Maps.

Reach endpoints no prebuilt tool covers

When you need Lodging, Place Actions, or an endpoint Google shipped last week, request proxies raw HTTP through the same connected account. Scalekit injects the merchant's token; you write the path.

response = actions.request( connection_name=CONNECTION, identifier=IDENTIFIER, path="/v1/locations/12345678901234567890/lodging", method="GET", ) print(response.status_code, response.json())

The escape hatch runs through the vault, so bypassing the prebuilt tool list does not mean bypassing tenant isolation or the audit trail.

One Virtual MCP endpoint for multi-tool, multi-tenant agents

A standard MCP server exposes everything it has. For a connector whose OAuth scope already grants destructive access, that default is the wrong one. Virtual MCP servers invert it: you declare which tools an agent can see and whose credentials it acts with, with no MCP server to deploy, host, or maintain.

Create the server once per agent role

Setup happens once per agent role, not once per merchant. The response carries a static mcp_server_url you reuse for every merchant and every session.

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp_response = scalekit_client.actions.mcp.create_config( name="local-visibility-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="googlebusinessprofile", tools=[ "googlebusinessprofile_list_locations", "googlebusinessprofile_get_insights", "googlebusinessprofile_search_keywords", "googlebusinessprofile_list_reviews", ], ), McpConfigConnectionToolMapping( connection_name="slack", tools=["slack_post_message"], ), ], ) config_id = vmcp_response.config.id mcp_server_url = vmcp_response.config.mcp_server_url

Four Google Business Profile tools and one Slack tool. googlebusinessprofile_delete_location and googlebusinessprofile_update_listing are not reachable from this endpoint regardless of what the underlying business.manage token permits.

Mint a session token per run

The endpoint is static; the identity is not. Before each run, confirm the merchant's connections are still active, then mint a short-lived token bound to that merchant.

from datetime import timedelta accounts_response = scalekit_client.actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier=IDENTIFIER, include_auth_link=True, ) for account in accounts_response.connected_accounts: if account.connected_account_status != "ACTIVE": print(f"{account.connection_name} needs auth: {account.authentication_link}") token_response = scalekit_client.actions.mcp.create_session_token( mcp_config_id=config_id, identifier=IDENTIFIER, expiry=timedelta(minutes=30), ) token = token_response.token

That active-connection check is how you catch a merchant who revoked access from their Google Account. You find out before the run starts rather than three tool calls in.

Attach it to LangChain

With the URL and token in hand, any MCP-capable framework connects over bearer auth. LangChain reaches it through langchain-mcp-adapters.

pip install langchain-mcp-adapters langchain-openai
import asyncio from langchain_mcp_adapters.client import MultiServerMCPClient from langchain.agents import create_agent async def run(): client = MultiServerMCPClient({ "gbp": { "transport": "streamable_http", "url": mcp_server_url, "headers": {"Authorization": f"Bearer {token}"}, } }) tools = await client.get_tools() agent = create_agent("openai:gpt-4.1", tools) result = await agent.ainvoke({ "messages": "Summarize last month's call clicks per location and post it to #local-marketing." }) print(result["messages"][-1].content) asyncio.run(run())

One server definition serves every merchant on the platform. Each run gets a token scoped to one merchant's connected accounts, so no credential is shared across tenants and no per-merchant server configuration exists to drift.

Observability: who did what, in whose name

Google's own logs will show the merchant's OAuth identity replying to a review. They will not show which of your users triggered the agent, which agent role executed it, or which tenant it ran under. That distinction is the entire compliance question.

Four identities in one Business Profile action

A single review reply touches the triggering user inside your product, the agent process that executed it, the merchant's OAuth grant that authorized the API call, and the tenant the run belonged to. Standard application logging captures one of those four.

When an agency's account manager asks why a reply went out under the wrong client's brand voice, "the Google API shows the merchant token replied" is not an answer. It is the absence of one.

What the audit trail needs to carry

Scalekit logs every execute_tool call with an execution ID, tied to the identifier that authorized it. Authorization events, token lifecycle events, and revocation state are captured at the connection layer; your application adds the agent-side events that link a user request to an execution.

The connection_id is the join key. It is what ties an action taken on Google Search and Maps back to the specific merchant consent that permitted it, which is what SOC 2 CC6.1 evidence actually requires. There is more on this pattern in audit trails for agent auth and agent tool observability.

Which one to build against

If your agent is interactive, read-heavy, or multi-tool, run it through a scoped MCP endpoint. Google issues one all-or-nothing scope, so restricting what the model can see is the only least-privilege control you get, and MCP is where it lives.

If your agent is a nightly sync, a Pub/Sub consumer, or reaches into Lodging and Place Actions, call the API directly and own the pacing and retry envelope.

Either way: 400 merchants means 400 refresh tokens, an unnotified revocation path, and an audit trail Google will not assemble for you. Pick the protocol for the ergonomics. Solve the credentials at the infrastructure layer, because that is what decides whether this survives its second tenant.

Build with other Google Business Profile agent builders

Browse the Google Business Profile connector or the full agent connector catalog. Tool calling and audit logs start free; see pricing.

Building something in this space and want to compare notes on the 10-edits-per-minute ceiling or the update_mask hazard? Join the Scalekit Slack community, or talk to an engineer if you need an answer today.

Keep going from here

Recommended reading: Google Ads MCP vs Google Ads API for AI Agents covers the connector where Google did ship an official server, and the read-only tradeoff that came with it.

Related agent templates: Competitive intelligence briefing agent and support triage agent are the closest patterns to a local-visibility briefing and a review triage loop respectively.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
zero upfront cost.

Every feature unlocked. No hidden fees.