Google Cloud is a direct integration: Polycore hosts the connection to
Google’s own remote MCP servers, so there is no runner to deploy. An owner or
admin connects it once per project, and everyone in the connection’s audience
can ask about services and logs from Slack, the dashboard, an MCP client, or a
page.
Google ships one MCP server per product, so each product is its own
connection with its own tools and its own policy. Polycore governs two today:
Polycore holds no Google credential
Every other integration hands Polycore a secret. This one does not.
Instead you create a service account in your own project, grant it the roles
the connection needs, and let Polycore’s executor impersonate it. Polycore
asks Google for a token that lives ten minutes, uses it for one call, and
stores nothing. The authority is a binding in your IAM policy, not a credential
in Polycore’s database.
That has three consequences worth knowing:
- Nothing expires on you. There is no token to rotate and no connection
that dies in an hour, or when an employee leaves.
- You revoke it, not us. Removing the token creator binding stops every
call immediately, without waiting for Polycore to delete anything.
- Least privilege is yours to set. The connection reaches exactly what you
granted that service account, and you can see that in your own IAM.
What it can do
Polycore classifies every tool Google advertises:
Cloud Run. list_services and get_service are reads and run when they
are called. deploy_service_from_image, deploy_service_from_archive, and
deploy_service_from_file_contents are writes, so each one waits for a human
approval before anything reaches production.
Cloud Logging. list_log_entries, list_log_names, list_buckets,
get_bucket, list_views, and get_view are all reads.
Anything Google adds that Polycore has not classified is treated as unknown. It
is gated like a write, and it arrives disabled so an admin reviews it
before anyone can call it.
This is shared authority. Everyone in the connection’s audience acts through
the one service account, reaching projects their own Google account may not be
able to open. Every Google tool takes its target project as an argument, so
the service account’s IAM grants are the resource boundary. Grant them on the
projects this connection should reach, and no others.
Connect it
First, enable the products you want to reach through MCP in your Google Cloud
project. See Google’s
enable MCP servers
guide.
Then, in Polycore, open Project settings → Integrations, pick Google
Cloud Run or Google Cloud Logging, and choose Connect. The connect
screen generates the setup for that connection’s roles, including Polycore’s
executor identity, as either gcloud commands or Terraform. Both make the same
grant, so pick whichever matches how you manage the project. The commands look
like this:
The Terraform tab is the same grant as resources you paste into whatever
already manages the project, ending in a polycore_service_account output.
Optional roles arrive commented out in both tabs, so applying or pasting can
never widen the connection by accident.
roles/mcp.toolUser is required for any Google MCP call at all. The product
role decides what the connection can reach: roles/run.viewer for reads, or
roles/run.developer plus roles/iam.serviceAccountUser if you also want the
deploy tools to work. For Cloud Logging, roles/logging.viewer.
Paste the service account’s email back into Polycore, pick the environment it
belongs to, name its GCP project, and choose a namespace and audience.
Repeat for your other environments from the connection’s Environments
panel. Each one takes its own service account and project; the tools, their
hazards and their enable flags stay on the connection, so you classify Google’s
surface once rather than once per environment.
Using it
Ask in Slack, or from any front door:
Capabilities appear in the catalog under the connection’s namespace:
The connection supplies the project, so it is not asked for. That matters
beyond convenience: Google marks it required, and a model told an argument is
required will invent a value rather than leave it out.
A Cloud Run region is not part of the connection, because a region belongs to
a service rather than to an environment. Cloud Run’s tools take region: "-"
to mean every region, which is what the tool description tells a caller, so
listing services finds them wherever they run and each result carries the
region to use for anything more specific.
Where a connection covers more than one environment, its tools take a
project argument listing exactly those projects, and it is required. There is
no honest default across dev and prod, and Slack has no environment switcher,
so anything else means guessing: “get me the GCP logs” would answer about one
project while you were asking about another. Say which project you mean and you
get the credential bound to it. Because the list is closed, a project cannot be
invented, and naming one this connection has no credential for is refused
rather than answered from somewhere else.
A connection covering one environment asks for nothing, since there is only one
target the call can mean.
Agent and MCP tool names are direct__<namespace>__<tool>. The audit row
records the caller, the connection, the tool, and the service account the call
acted as.
Limits
- Two products. Google publishes MCP servers for around sixty. More arrive
as they are classified.
- One credential per environment. A connection covers every environment of
a project under one namespace, but each environment needs its own service
account and GCP project added to it. An environment with none has no tools
there rather than falling back to another environment’s credential.
- Impersonation, not OAuth. Connecting as your own Google account is not
supported, and would inherit your full cloud access if it were.
Removing it
Remove connection stops calls at once and drops the tools from the catalog.
Because Polycore stores no Google credential, there is nothing to rotate
afterwards, but removing the roles/iam.serviceAccountTokenCreator binding in
your own project is what makes it permanent. The audit history stays.