Announcing CIMD support for MCP Client registration
Learn more

Looker MCP vs Looker API for AI Agents (2026)

Nityashree Yadunath
Product Marketing Manager

TL;DR

  • The Looker-managed MCP server is in preview and runs only on Looker-hosted instances. Customer-hosted deployments are not supported, and every tool ships disabled until a Looker admin turns it on.
  • Dynamic Client Registration is not supported in preview. A Looker admin must register every agent as an OAuth client through register_oauth_client_app before it connects, which is a manual step in every customer onboarding.
  • Fine-grained OAuth scopes are not supported. Access control is an instance-wide tool allowlist plus the user's Looker permissions, so there is no per-agent scope.
  • The MCP tool catalog covers models, queries, Looks, dashboards, instance health, and LookML authoring. Scheduled plans, folders, content deletion, and user administration are absent. Looker API 4.0 has all of them.
  • Scalekit's Google Looker connector ships 31 Looker tools over per-user OAuth with vaulted tokens, so the MCP versus API choice stops dictating your credential infrastructure.

Your agent needs to answer questions out of Looker. Looker now ships a managed MCP server built into the platform, and it has shipped a REST API for a decade. Both paths reach the same semantic layer, but they hand you different tool surfaces, different consent flows, and a very different amount of admin coordination before anything runs in production. For a multi-tenant agent, one of those differences is a hard onboarding blocker rather than a preference.

What Looker MCP and the Looker API actually are

Two objects are worth separating before comparing them. Google ships a managed MCP server inside the Looker platform, and it separately maintains MCP Toolbox for Databases, an open source server you run yourself. Google's own documentation states the Toolbox is provided as-is, is not a supported Google Cloud product, and carries no SLA. For a production B2B agent, the managed server is the object that matters, so that is what this article compares.

The Looker-managed MCP server

The managed server embeds an MCP endpoint directly into a Looker instance at LOOKER_INSTANCE_URL/mcp. It is in preview, available on Looker-hosted Looker (Google Cloud core) and Looker (original) instances, and explicitly unavailable on customer-hosted deployments.

Authentication is OAuth 2.1. The client runs an Authorization Code flow with PKCE against /auth on the UI host and /api/token on the API host, requesting the cors_api scope with no client secret. Once connected, the agent inherits the Looker roles and content access of the user who authenticated.

The Looker API 4.0

Looker API 4.0 is the current generally available version, with 3.x on a published deprecation path. It exposes the full instance: queries, Looks, dashboards, folders, scheduled plans, LookML projects, connections, users, groups, and roles.

Auth is a client ID and client secret pair bound to a Looker user account. You exchange them at POST /api/4.0/login for a short-term access token, then send it as Authorization: token <access_token>, not as a bearer token. Expired tokens fail with 401 Authorization Required, and logout invalidates a live token.

Comparing them where it matters for agents

The interesting comparison is not raw endpoint count. It is which of the two surfaces can carry the workflow your agent actually runs, and what breaks when it cannot.

What your agent can actually do

Google documents one tool catalog covering 30 tools across four families: model and query tools, content tools, instance health tools, and LookML authoring tools. The shape of that catalog tells you what the MCP path was designed for.

Capability
Looker-managed MCP
Looker API 4.0
List models, Explores, dimensions, measures
Yes: get_models, get_explores, get_dimensions, get_measures
Yes
Run an ad-hoc query against an Explore
Yes: query
Yes
Return the SQL Looker generates for a query
Yes: query_sql
Yes
Run a saved Look
Yes: run_look
Yes
Create a Look or dashboard
Yes: make_look, make_dashboard, add_dashboard_element
Yes
Update or move an existing Look or dashboard
No
Yes
Delete a Look, dashboard, or folder
No
Yes
Create and organize folders
No
Yes
Create, list, and trigger scheduled plans
No
Yes
Read and write LookML project files
Yes: get_project_file, create_project_file, update_project_file, delete_project_file
Yes
Toggle Development Mode for the session
Yes: dev_mode
Yes
Instance health analysis
Yes: health_pulse, health_analyze, health_vacuum
Composite, you build it
Manage users, groups, roles, user attributes
No
Yes
Push notification on a data change
No
Partial, through scheduled plans and alerts

Where the MCP ceiling sits

The managed server is built for a developer or analyst sitting in an IDE. It reads the semantic layer, runs queries, drafts content, and edits LookML. It does not manage the objects around that content.

That gap is specific. No scheduled plans means an agent cannot set up or fire a delivery, which is the single most common "do something with this analysis" action in Looker. No folder tools and no delete or update tools means any agent doing content lifecycle work hits a wall after the create call.

What MCP makes easier than the API

The LookML authoring family is the real MCP advantage. An agent that can call dev_mode, read project files, write them back, and introspect connection schemas is doing work that costs meaningful adapter code against the API.

The health family is the other one. health_pulse, health_analyze, and health_vacuum are composite analyses, not single endpoints. Reproducing them on the API means writing the analysis yourself against System Activity.

The governance side of that advantage

LookML write access is a two-sided capability. An agent with dev_mode and update_project_file enabled can change the definitions of your governed metrics. The tool allowlist is instance-wide, so enabling those tools for a LookML copilot also enables them for every other agent connected to that instance.

If your product ships a read-only Looker assistant to customers, you do not want LookML authoring in the allowlist. On the managed server you cannot have it both ways on one instance.

The auth path each one puts you on

Both paths run as a specific Looker user, which is the correct security posture. They differ sharply in what it takes to get there and in what happens when the credential goes stale.

MCP: OAuth 2.1, gated behind an admin registration step

Dynamic Client Registration is not supported in the preview. Before any agent can connect, a Looker admin has to register it as an OAuth client by calling register_oauth_client_app, which is POST /api/4.0/oauth_client_apps/{client_guid} with a redirect_uri and a display name.

That is a per-agent, per-instance, admin-only step. For a B2B product whose customers each run their own Looker instance, it is a manual coordination item in every onboarding, and it lands on someone with the Admin Looker role rather than on the developer integrating your product.

The API: credentials bound to a Looker user

API credentials are always bound to a Looker user account, and requests execute as that user. Looker's own guidance is to avoid credentials bound to admin accounts in production and instead create minimal-privilege API-only service accounts scoped to the intended activity.

Notably, Looker API authentication is independent of user login protocols. Two-factor, LDAP, and SAML do not apply to API credentials. That decoupling is convenient for background agents and inconvenient for offboarding, because removing a user from your IdP does not by itself kill their API credentials.

The Looker (Google Cloud core) failure mode worth knowing

On Looker (Google Cloud core), user authentication runs through Google OAuth, and API credentials inherit that authorization. If a user's Google OAuth authorization expires or is revoked, their API credentials stop working and any live access tokens stop working with them.

Recovery is not automatic. The user has to log back into the Looker UI for each affected instance before their credentials work again. Google's documented mitigation is to use API-only service accounts for API access so agent credentials do not ride on an interactive user's consent.

What this means for multi-tenant agents

Looker's per-user model is the reason to care. User attributes and access filters enforce row-level security against the authenticated identity, so a sales rep's agent sees only that rep's territory. Run the agent on a shared service account and that enforcement collapses to a single data slice for everyone.

So a multi-tenant Looker agent needs one credential per user per instance. MCP gives you an OAuth token per user; the API gives you a credential pair per user. Neither path stores them, refreshes them, or revokes them for you. This is where access control for multi-tenant AI agents becomes a real engineering concern rather than a theoretical one.

What you own in production

The managed server removes infrastructure work and adds coordination work. Knowing which of the two your team is short on is most of the decision.

Allowlists are instance-wide, not per-agent

Because fine-grained OAuth scopes are not supported, access control on the managed server is the instance-wide tool allowlist plus the user's base Looker permissions. You cannot give a reporting agent five tools and a LookML copilot twenty on the same instance.

Changes to that allowlist are not pushed to connected clients either. Google's documented procedure is to wait 30 seconds after editing the list, then reconnect each client to refresh its tool manifest.

Schema drift and preview constraints

Google notes that the prebuilt tools are pre-1.0 and that tool changes between versions should be expected. An agent built against a specific tool signature is consuming a contract that can move without a version bump you control. The API 4.0 surface is versioned explicitly, which is why deterministic pipelines belong there.

The preview also runs on fixed capacity. Google says occasional timeouts during peak usage are expected behavior, which is a retry-policy requirement rather than a bug.

Quota, cost, and network boundaries

The managed server is free, but tool calls consume the instance's standard administrative and query-based API quotas. An agent that issues several sequential queries per user turn burns quota faster than a traditional integration, and the same calls bill the underlying warehouse. Budget for Snowflake or BigQuery spend, not just Looker capacity.

Network boundaries mostly hold. The managed endpoint respects VPC Service Controls and is CMEK-compliant with no extra configuration. One asymmetry to plan around: the managed server is not compatible with IP allowlists on Looker (original), though it is on Looker (Google Cloud core). Browser-based MCP clients also need their domain added to the Embedded Domain Allowlist for CORS.

What you get for free on either path

Audit is the genuinely good news. Every action an agent takes through the managed MCP server is recorded in Looker System Activity, in the History and Event Attribute Explores, and Looker (Google Cloud core) instances also capture it in Cloud Audit Logs.

That is instance-side attribution, and it is only as useful as the identity behind it. If your agent runs on one shared service account, every row in that audit trail names the same actor. The broader challenge of audit trails for agent auth in B2B SaaS applies here exactly as it does everywhere else.

When to use Looker MCP, when to use the Looker API

The split is cleaner here than with most tools in this series, because the managed server's tool catalog is openly aimed at a developer workflow rather than an embedded product workflow.

Use the Looker-managed MCP server when

  • Your analysts and analytics engineers work in Gemini CLI, Claude Code, Cursor, or VS Code and want to explore models, run queries, and iterate on LookML in place
  • The agent's job includes LookML authoring or instance health analysis, where dev_mode, the project file tools, and the health_* tools save real adapter code
  • The instance is Looker-hosted, and a Looker admin is available to register each agent as an OAuth client and maintain the tool allowlist
  • One shared allowlist is an acceptable policy surface because every agent on the instance has similar privileges

Use the Looker API 4.0 when

  • Your agent creates, triggers, or manages scheduled plans, which is the usual endpoint of any "analyze this and deliver it" workflow
  • The agent manages content lifecycle: moving, renaming, archiving, or deleting Looks, dashboards, and folders
  • You are shipping a multi-tenant product across customer Looker instances and cannot ask every customer's admin to register your agent as an OAuth client by hand
  • The instance is customer-hosted, which the managed server does not support in preview
  • You need a versioned contract because the agent runs a deterministic pipeline where an unannounced tool schema change is an incident

The credential problem that exists on both paths

This is where both paths converge, and where the interesting engineering actually lives.

What Looker gives you

Looker's identity model is correct. Every MCP tool call and every API call runs as an authenticated user, with their roles, content access, user attributes, and access filters applied. Auditors like it, and it is the reason a Looker agent can be safely exposed to end users at all.

But Looker enforces identity. It does not manage the credential lifecycle on your behalf.

What you still have to build

For a B2B agent serving 60 analysts across 12 customer Looker instances, that is 60 OAuth grants or credential pairs to store encrypted and isolated per tenant, 60 short-term tokens to refresh before they expire, and 60 to revoke when someone leaves. Add the registration records for each instance's OAuth client on the MCP path.

Then add the failure modes. A revoked Google OAuth authorization silently kills a Looker (Google Cloud core) user's API credentials. A 401 Authorization Required is the only signal your agent gets, and it arrives mid-task. Understanding how to handle token refresh for AI agents is not optional at this scale — it is foundational.

The problem is structurally identical whichever path you picked. The token type differs; the infrastructure required does not.

Where Scalekit fits

Scalekit's Google Looker connector runs the per-user OAuth flow, stores each user's tokens in a vault outside your agent runtime, and refreshes them automatically. The connector ships 31 Looker tools, including the scheduled plan and folder tools the managed MCP server does not expose.

The practical effect is that the MCP versus API question stops being a credential architecture question. It becomes a tool coverage question, which is much easier to answer. For a deeper look at credential ownership across agent tool-calling patterns, the tradeoffs become even clearer.

Connecting a Looker agent with Scalekit

Setup is a one-time Google Cloud OAuth client in the project that hosts the Looker instance, registered once in the Scalekit dashboard. After that, everything is per user.

Register the connection once

Create a Web application OAuth client in Google Cloud Console, paste the redirect URI from the Scalekit dashboard into its authorized redirect URIs, then add the client ID and secret under AgentKit, Connections. Keep Access Type set to Offline so Scalekit receives a refresh token.

One Looker-specific requirement: each connected account carries the user's Looker instance hostname, without the scheme, for example your-company.cloud.looker.com. That is how one connection serves users across different Looker instances.

Authorize a user

The authorization link is generated per user and redirects them through Google's consent screen. Scalekit stores the resulting tokens and marks the connected account active.

import os from scalekit import ScalekitClient from dotenv import load_dotenv load_dotenv() scalekit_client = ScalekitClient( env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"), client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), ) actions = scalekit_client.actions # connection_name must match the Connection name in the Scalekit dashboard exactly CONNECTION_NAME = "googlelooker" IDENTIFIER = "analyst_42" link_response = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=IDENTIFIER, ) print("Authorize Google Looker:", link_response.link)

In TypeScript, pass the user's instance hostname through state so the connected account is bound to the right Looker instance.

import { ScalekitClient } from '@scalekit-sdk/node' import 'dotenv/config' const scalekit = new ScalekitClient( process.env.SCALEKIT_ENVIRONMENT_URL!, process.env.SCALEKIT_CLIENT_ID!, process.env.SCALEKIT_CLIENT_SECRET!, ) const { link } = await scalekit.actions.getAuthorizationLink({ connectionName: 'googlelooker', // must match the dashboard Connection name identifier: 'analyst_42', state: { instanceUrl: 'your-company.cloud.looker.com' }, }) console.log('Authorize Google Looker:', link)

Load the tools this user is authorized to call

Before wiring anything into an agent, retrieve the tools bound to this user's connected account. The agent is not loading a flat catalog of every Looker tool Scalekit offers; it is loading the surface this specific user's connected account authorizes, which is what keeps a multi-tenant agent from over-reaching.

from scalekit.v1.tools.tools_pb2 import ScopedToolFilter scoped = scalekit_client.tools.list_scoped_tools( IDENTIFIER, filter=ScopedToolFilter(connection_names=[CONNECTION_NAME]), page_size=50, ) for tool in scoped.tools: print(tool.name)

Run the agent loop with LangChain

The LangChain adapter converts that same scoped list into StructuredTool objects. Filtering by tool name here is how you give a read-only reporting agent a narrow surface while a separate agent role gets a wider one. This pattern is central to how LangChain tool calling works at the auth boundary.

from langchain_anthropic import ChatAnthropic from langgraph.prebuilt import create_react_agent tools = scalekit_client.actions.langchain.get_tools( identifier=IDENTIFIER, connection_names=[CONNECTION_NAME], tool_names=[ "googlelooker_list_models", "googlelooker_list_explores", "googlelooker_run_inline_query", "googlelooker_search_looks", "googlelooker_run_look", ], page_size=50, ) agent = create_react_agent( model=ChatAnthropic(model="claude-sonnet-4-6", max_tokens=2048), tools=tools, ) result = agent.invoke({ "messages": [{ "role": "user", "content": ( "Using the ecommerce model, what was total revenue by channel " "for the last 30 days? Return the top five channels." ), }] }) print(result["messages"][-1].content)

A note on googlelooker_run_inline_query: it takes model, view, fields, and result_format, and Looker applies a 120 second timeout. Point agents at aggregated Explores rather than wide raw ones, or long-running queries will surface as tool failures.

Reach the rest of the Looker API

For anything outside the tool catalog, request proxies an authenticated call to the Looker API 4.0 using the connected account's credentials. Scalekit resolves the instance host from the connected account and injects the token, so no Looker credential reaches your agent runtime.

response = scalekit_client.actions.request( connection_name=CONNECTION_NAME, identifier=IDENTIFIER, path="/api/4.0/scheduled_plans", method="POST", body={ "name": "Weekly revenue digest", "look_id": "42", "crontab": "0 9 * * 1", "timezone": "America/New_York", "scheduled_plan_destination": [{ "format": "wysiwyg_pdf", "address": "revops@example.com", "type": "email", }], }, ) print(response.status_code, response.json())

This is the practical answer to the MCP versus API tradeoff: the tool catalog covers the common path, and the proxy covers the rest of API 4.0 without you building a second credential path.

Where this changes the operational math

Two capabilities matter more for Looker agents than for most connectors, because BI data is sensitive and Looker agents tend to sit alongside three or four other tools in the same workflow.

Per-user attribution in downstream tool-call logs

Looker's own System Activity records what the authenticated user did inside Looker. It cannot tell you which of your product's users triggered the agent run, or which agent role made the call, because that context lives on your side of the boundary.

Scalekit logs every execute_tool call against the connected account that made it, so a Looker query is attributable to a specific end user rather than to a shared service identity. Pair that with Looker's System Activity and you get both halves of the trail. More on that pattern in agent tool observability and audit trails for agent auth.

Virtual MCP servers for multi-tool, multi-tenant agents

Most real Looker agents are not Looker-only. A revenue commentary agent reads Looker, pulls context from a CRM, and posts to Slack. Wiring three MCP servers together means three consent flows, three allowlists, and every tool from all three in the model's context.

Virtual MCP servers collapse that into one scoped endpoint. You declare which connections and which specific tools an agent role can see, and mint a short-lived session token per user before each run. The default session token expiry is about an hour, adjustable with the expiry parameter on create_session_token.

Why the scoping matters beyond security

Token cost is the unglamorous reason. A server exposing 40 tools at roughly 200 tokens each spends about 8,000 tokens of context before the agent does any work. Scoping to five or ten tools cuts that by roughly 80%.

That is the per-agent scope the managed Looker MCP server does not currently offer, and it works the same way whether the underlying call lands on a Looker tool or a Slack one. The cost argument for why MCP can be significantly more expensive than CLI covers the fuller token math in detail.

Which one to build against

If your users are analytics engineers working inside an IDE on a Looker-hosted instance, and a Looker admin is on hand to register agents and curate the allowlist, the managed MCP server is the right path. Nothing else gives you LookML authoring and instance health analysis for free.

If you are shipping a Looker capability inside a product, build against API 4.0. The manual OAuth client registration per instance does not survive customer onboarding at scale, scheduled plans and content lifecycle are absent from the MCP catalog, and customer-hosted instances are not supported in preview at all.

The question that decides it

Does a Looker admin at every customer have to touch your integration before it works? If yes, and that is unacceptable, you are on the API path. The credential management problem is identical either way, and that is the part worth putting production-grade infrastructure behind.

Build your Looker agent

Start with the connector docs and the working code samples, then bring the hard questions to an engineer.

Building Looker agents and want to compare notes on instance registration, allowlists, or per-user scoping? Join the Scalekit Slack community, or talk to an engineer if you need an answer today.

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.