Looker MCP Server
The Looker MCP Server provides AI assistants direct access to a Looker instance through ~160 tools across 15 groups. Key capabilities include:
Semantic Layer Querying
query— Run queries via the Looker semantic model (no raw SQL required)query_sql— Generate SQL without executing it (for debugging)run_look,run_query,run_dashboard— Execute saved Looks, Queries, or full dashboardsquery_url— Generate pre-populated Explore URLssearch_content— Full-text search across dashboards, Looks, and folders
LookML Model Exploration
Browse models, explores, dimensions, measures, filters, and parameters
List all configured database connections
Database Schema Inspection
List databases, schemas, tables, and columns across Looker connections
Content Management
Create, read, update, and delete Looks and dashboards
Add dashboard elements and filters
Generate SSO-authenticated embed URLs
Validate content references for broken links
LookML & Git Operations
Manage LookML projects, files, and branches
Deploy to production, run validation, trigger datagroups, manage PDT builds
Administration
CRUD users, roles, permission sets, model sets, groups, schedules, and database connections
Manage user attributes and credentials (API3, LDAP, SAML, OIDC, Google)
Audit & Monitoring
Query history, content usage, PDT build logs, schedule history, user activity, and active sessions
Health & Analysis
Instance health checks (
health_pulse), usage analysis (health_analyze), and orphan/unused object detection (health_vacuum)
Authentication & Deployment
Supports service accounts, OAuth pass-through, and per-call admin impersonation (
act_as_user)MCP-level OAuth 2.1 with
dev,public, andlooker_oauthmodesDual transport: stdio (local/CLI) and streamable-http (production)
Selective tool loading via
--groupsto limit exposed functionality
Provides tools for interacting with the Looker API, enabling AI assistants to query the semantic model, manage content (Looks, dashboards, folders), edit LookML projects, and administer users, roles, and permissions.
Click on "Install 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., "@Looker MCP Servershow top 10 products by revenue last month"
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.
looker-mcp-server
A full-featured Model Context Protocol (MCP) server for the Looker API. Gives AI assistants direct access to your Looker instance — querying the semantic model, managing content, editing LookML, and administering users — all through a standard MCP interface.
Features
160 tools across 15 groups covering the full Looker API surface
Semantic layer queries — query through LookML models, not raw SQL
OAuth pass-through — forward user tokens from an upstream gateway or MCP OAuth flow
User impersonation — admin sudo on self-hosted Looker, OAuth on Google Cloud core
Dual transport — stdio for local/CLI use, streamable-http for production deployment
Selective tool loading — enable only the tool groups you need via
--groupsPluggable identity — swap in custom authentication via the
IdentityProviderprotocolHealth endpoints —
/healthzand/readyzfor container orchestration
Related MCP server: Amplitude MCP Server
Quick Start
Installation
pip install looker-mcp-server
# or
uv add looker-mcp-serverEnvironment Variables
At minimum, set your Looker instance URL and API3 credentials:
export LOOKER_BASE_URL="https://mycompany.looker.com"
export LOOKER_CLIENT_ID="your-api3-client-id"
export LOOKER_CLIENT_SECRET="your-api3-client-secret"Run with stdio (for Claude Code, Claude Desktop, etc.)
looker-mcp-server --groups explore,query,schemaRun with HTTP (for production deployment)
LOOKER_TRANSPORT=streamable-http looker-mcp-server --groups all --port 8080MCP Client Configuration
Claude Code
Add to your Claude Code MCP settings:
{
"mcpServers": {
"looker": {
"command": "looker-mcp-server",
"args": ["--groups", "explore,query,schema,content"],
"env": {
"LOOKER_BASE_URL": "https://mycompany.looker.com",
"LOOKER_CLIENT_ID": "your-client-id",
"LOOKER_CLIENT_SECRET": "your-client-secret"
}
}
}
}Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"looker": {
"command": "looker-mcp-server",
"args": ["--groups", "explore,query,schema,content"],
"env": {
"LOOKER_BASE_URL": "https://mycompany.looker.com",
"LOOKER_CLIENT_ID": "your-client-id",
"LOOKER_CLIENT_SECRET": "your-client-secret"
}
}
}
}Tool Groups
Tools are organized into groups that can be selectively enabled. Default groups are marked with *.
Group | Tools | Description |
explore* |
| Browse LookML models, explores, and fields |
query* |
| Run queries through the semantic layer |
schema* |
| Inspect underlying database schema |
content* |
| Manage Looks and dashboards |
board |
| Curate content with boards, sections, and items |
folder |
| Navigate and manage the folder hierarchy |
health* |
| Instance health checks and usage analysis |
modeling |
| LookML project lifecycle, file edits, syntax validation, datagroup cache + trigger management, and PDT build administration |
git |
| Git branch lifecycle, production deploy, SSH deploy-key rotation, and git-connection diagnostics |
admin |
| User, role, RBAC, group, and schedule management |
connection |
| Database connection CRUD and health checks |
user_attributes |
| User attribute definitions plus per-group and per-user value overrides (row-level security, per-developer credentials, filter defaults) |
credentials |
| Non-email credentials — API3 key-pair rotation plus get/delete for LDAP, SAML, OIDC, and Google SSO links |
audit |
| Query history, content usage, PDT build + schedule + event logs via system__activity, plus live-ops (running queries, sessions, CI runs) |
workflows |
| Task-oriented Layer 2 compositions — provisioning workflows (bootstrap, deploy, provision users) plus ops/audit workflows (offboard, rotate credentials, audit, cleanup) |
Selecting Groups
# Default groups only (explore, query, schema, content, health)
looker-mcp-server
# Specific groups
looker-mcp-server --groups explore,query
# All groups (including board, folder, modeling, git, admin, connection, user_attributes, credentials, audit, workflows)
looker-mcp-server --groups allConfiguration Reference
All settings are configured via environment variables with the LOOKER_ prefix, or via a .env file.
Variable | Default | Description |
| (required) | Base URL of the Looker instance |
| API3 client ID for service account | |
| API3 client secret for service account | |
|
| Looker API version |
|
|
|
|
|
|
|
| HTTP bind address |
|
| HTTP port |
|
| Enable user impersonation when identity headers are present |
|
| Attribute sudo activity to admin ( |
|
| HTTP header carrying user email for sudo impersonation |
|
| HTTP header carrying pre-exchanged OAuth token |
|
| HTTP request timeout in seconds |
|
| Default maximum rows for query tools |
|
| Verify TLS certificates |
|
| Logging level |
|
|
|
| Authorization server JWK Set URL (RFC 7517). Required when | |
| Expected | |
| This server's canonical URI for RFC 8707 audience binding and the RFC 9728 PRM | |
|
| Comma-separated OAuth scopes advertised in the |
| Static bearer token for MCP-level authentication. Deprecated — emits a warning in |
Authentication & Impersonation
The server supports three authentication modes, selected automatically based on configuration and request headers.
Mode 1: Service Account (API Key)
The simplest mode — all API calls use the configured service-account credentials.
export LOOKER_CLIENT_ID="your-api3-client-id"
export LOOKER_CLIENT_SECRET="your-api3-client-secret"
export LOOKER_SUDO_AS_USER=falseMode 2: Admin Sudo (Self-Hosted Looker)
An admin service account impersonates individual users via Looker's login_user API. The user is identified by an email address in the request headers (typically set by an upstream gateway).
export LOOKER_CLIENT_ID="admin-api3-client-id"
export LOOKER_CLIENT_SECRET="admin-api3-client-secret"
export LOOKER_DEPLOYMENT_TYPE=self_hosted
export LOOKER_SUDO_AS_USER=trueWhen a request arrives with X-User-Email: alice@company.com, the server:
Logs in with admin credentials
Looks up Alice's Looker user ID by email
Creates a sudo session as Alice via
login_userExecutes the tool call as Alice
Logs out both sessions
Note: On Looker (Google Cloud core),
login_useronly works for Embed-type users. Regular users require OAuth mode.
Mode 3: OAuth Pass-Through (Google Cloud Core)
For Looker (Google Cloud core) deployments where regular users cannot be impersonated via sudo. An upstream gateway performs OAuth token exchange and passes the user's token in a header.
export LOOKER_CLIENT_ID="fallback-api3-client-id"
export LOOKER_CLIENT_SECRET="fallback-api3-client-secret"
export LOOKER_DEPLOYMENT_TYPE=google_cloud_core
export LOOKER_SUDO_AS_USER=trueWhen a request arrives with X-User-Token: <oauth-access-token>, the server uses that token directly — no login/logout cycle needed.
If no token header is present, the server falls back to service-account mode.
Automatic Mode Selection
When LOOKER_SUDO_AS_USER=true (the default), the server uses a DualModeIdentityProvider that automatically routes:
Self-hosted → sudo (via
X-User-Emailheader)Google Cloud core → OAuth (via
X-User-Tokenheader)No identity headers → service account fallback
Per-Call Admin Impersonation (act_as_user)
Looker dev mode (workspace_id=dev) is per-user-isolated by design. Each user has their own dev workspace; uncommitted LookML changes, the active branch, and dev-mode local branches all live in the calling user's workspace. That means an admin running delete_git_branch against the admin's dev workspace does nothing about a stuck branch in another user's dev workspace.
The git tools accept an optional act_as_user argument so an admin can perform the call as a different user — typically to clean up someone else's stuck dev-workspace state without leaving the MCP for raw HTTP. Accepts either a numeric user ID or an email address (resolved to an ID via Looker's user-search API).
// Example: admin sweeping a stale CI branch out of ci-bot's dev workspace
{
"tool": "delete_git_branch",
"arguments": {
"project_id": "acme_analytics",
"branch_name": "tmp_ci_5bd8888773",
"act_as_user": "ci-bot@example.com"
}
}Configuration. Per-call admin impersonation is gated by LOOKER_SUDO_AS_USER — that flag is the single kill switch for sudo-capable behavior in the OSS server, and act_as_user respects it. Set LOOKER_SUDO_AS_USER=true (the default when admin credentials are configured) to enable. With LOOKER_SUDO_AS_USER=false, passing act_as_user raises a clear validation error rather than silently running the call under the configured identity — surfacing the misconfiguration at the call site instead of letting it route to the wrong user.
Security model. The MCP forwards capability — it does not gate it. Sudo permission is enforced by Looker server-side: if the configured LOOKER_CLIENT_ID does not have sudo capability, login_user returns HTTP 403 and the tool fails. There is no MCP-side "who may impersonate whom" policy in the open-source server; layer one in via a wrapping IdentityProvider if you need it (see the next section).
Tool coverage. All eight git/workspace-scoped tools accept act_as_user: get_git_branch, list_git_branches, get_git_branch_by_name, create_git_branch, switch_git_branch, delete_git_branch, deploy_to_production, reset_to_production. The five query tools accept it too — query, query_sql, query_url, run_query, run_look — for the CI pattern where queries against a feature branch must run under a dedicated service user's dev workspace rather than the calling admin's. Project-level tools (deploy keys, connection diagnostics) deliberately do not — they don't depend on per-user dev workspace state.
Audit log. Every argument-driven sudo emits an INFO-level structlog line:
{
"event": "looker.audit.act_as_user",
"tool": "delete_git_branch",
"target_user_id": "77",
"target_user_email": "ci-bot@example.com",
"triggered_by": "argument",
"configured_user": "admin-api3-client-id"
}This is independent of the trace-level looker.session.sudo debug line and is the right hook for downstream audit pipelines. Header-driven sudo (gateway pattern) is tagged triggered_by="header" on the debug line — looker.audit.act_as_user fires only for explicit per-call admin impersonation.
Mode interaction. act_as_user overrides the inner identity, including OAuth and header-based sudo. This is intentional — an explicit admin override should win over implicit gateway routing — but the underlying credentials must still have sudo capability, which Looker enforces. On Google Cloud core only Embed-type users can be impersonated; for regular GCC users use Mode 3 (OAuth pass-through) instead.
Failure modes.
act_as_useris neither all-digits nor an email (no@) → validation error rejected up front, before any Looker call. Avoids forwarding garbage to/login/{value}where it would surface as an opaque HTTP 400.Email does not match any Looker user → validation error. Fail-loud is deliberate; silently falling back to the configured identity would let a typo'd email run the action under the wrong user.
LOOKER_SUDO_AS_USER=falseandact_as_useris passed → validation error explaining how to fix (enable sudo or remove the argument).Configured credentials lack sudo capability → Looker returns 403 on
login_user, surfaced asPermission denied — the current user lacks access.
Dev Mode and Branch Validation
The query tools (query, query_sql, query_url, run_query, run_look) and the modeling/git tools accept three optional arguments — dev_mode, branch, and project_id — that together let you run operations against the LookML in a Looker dev workspace rather than production. This is what makes feature-branch validation possible from the MCP without falling back to raw REST.
How Looker scopes workspaces. Workspace selection (production vs. dev) is a property of the API session token, not the call. The MCP issues PATCH /session {"workspace_id": "dev"} immediately after authentication when dev_mode=True is set; this affects every subsequent call routed through the same session. The setting does not persist across logins, so each MCP call sets it explicitly.
Branch state is per-Looker-user, server-side. Each Looker user has exactly one dev workspace, with one currently-checked-out branch per LookML project. The branch checkout persists across logouts and concurrent calls — it's mutable shared state on Looker's server. Two operations against the same user fight over this single cell.
Atomic branch swap
Set branch="<feature-branch>" and project_id="<lookml-project>" on a query tool to atomically:
Save the user's currently-checked-out branch on the project.
PUT the target branch.
Run the query.
Restore the saved branch in
finally(even if the query raises).
branch implies dev_mode=True. The save and restore are no-ops when the dev workspace is already on the target branch.
Canonical workflows
One-shot CI: validate a PR's LookML against real data. Single tool call, atomic. The dedicated CI service user's dev workspace is borrowed for the duration; the saved branch is restored before the call returns.
{
"tool": "query",
"arguments": {
"model": "ecommerce",
"view": "orders",
"fields": ["orders.region", "orders.total_revenue"],
"branch": "feature/new-aggregation",
"project_id": "ecommerce",
"act_as_user": "ci-bot@example.com"
}
}Production vs. PR comparison. Two calls — the LLM diffs the results in its own context.
{ "tool": "query", "arguments": { "model": "ecommerce", "view": "orders", "fields": [...] } }
{ "tool": "query", "arguments": { "model": "ecommerce", "view": "orders", "fields": [...],
"branch": "feature/new-aggregation", "project_id": "ecommerce",
"act_as_user": "ci-bot@example.com" } }Iterative human debug. The branch state is sticky in the dev workspace, so set it once with switch_git_branch and run multiple queries with dev_mode=True (no branch arg). Restore the user's normal branch with another switch_git_branch when done.
{ "tool": "switch_git_branch", "arguments": { "project_id": "ecommerce", "branch_name": "feature/new-aggregation" } }
{ "tool": "query", "arguments": { "model": "ecommerce", "view": "orders", "fields": [...], "dev_mode": true } }
{ "tool": "update_lookml_file", "arguments": { ... } }
{ "tool": "query", "arguments": { "model": "ecommerce", "view": "orders", "fields": [...], "dev_mode": true } }
{ "tool": "switch_git_branch", "arguments": { "project_id": "ecommerce", "branch_name": "main" } }Cleanup another user's stuck dev workspace. Combine act_as_user with the git tools to operate on someone else's per-user state.
{
"tool": "switch_git_branch",
"arguments": { "project_id": "ecommerce", "branch_name": "main", "act_as_user": "alice@example.com" }
}Concurrency caveat
Looker's per-user-per-project branch checkout is a single mutable cell. Two concurrent operations on the same act_as_user (or the same configured admin identity, when act_as_user is omitted) race on it. The atomic save+restore prevents accidental state leaks, but it does not serialize concurrent calls — if your CI fans out across many open PRs against a single ci-bot user, you'll see non-deterministic results.
For parallel PR validation, provision multiple Looker users (e.g. ci-bot-1, ci-bot-2, …) and have your CI fan-out logic rotate through them via act_as_user. There is no MCP-side mutex; this is an operational choice the deployer makes.
What dev_mode does not cover (v1)
Multi-project manifest imports. If your LookML project imports another project, the import stays on whatever branch is currently checked out in the dev workspace for that imported project. The atomic swap is single-project; recursive manifest-aware swapping is a v2 concern.
Cross-call session continuity. Each tool call gets its own ephemeral API session (login → operation → logout), so
dev_mode=Trueonly takes effect within a single call. The branch state persists across calls because Looker stores it server-side per-user; the workspace setting does not.
Coverage by tool group
dev_mode, branch, and act_as_user are propagated through the tool groups that work with workspace-scoped LookML state. Tools that read workspace-agnostic metadata don't accept these args.
Tool group | Workspace-aware tools | Production-only tools |
git |
|
|
query |
|
|
modeling — file ops |
| — |
modeling — validation |
| — |
modeling — data tests |
| — |
modeling — project metadata | — |
|
run_lookml_tests — PR data-regression checks
run_lookml_tests(project_id="ecommerce", branch="feature-x", act_as_user="ci-bot@example.com") is the primary primitive for catching data-regression bugs introduced by a PR. Looker compiles each test's explore_source query, runs it against the warehouse, and evaluates the assertion expression against the result rows. Failures come back with assertion-level detail (model_name, test_name, errors[]).
Default per-call timeout is 1800s (30 min) because data tests run real warehouse queries with assertions and can take a long time on large tables — same default Spectacles uses.
Extending with Custom Identity Providers
The IdentityProvider protocol is the primary extension point for integrating with custom authentication systems.
from looker_mcp_server.identity import IdentityProvider, LookerIdentity, RequestContext
from looker_mcp_server.server import create_server
from looker_mcp_server.config import LookerConfig
class MyIdentityProvider:
"""Custom identity provider that integrates with your auth system."""
async def resolve(self, context: RequestContext) -> LookerIdentity:
# Extract identity from headers, tokens, etc.
token = context.headers.get("authorization", "").removeprefix("Bearer ")
if token:
# Exchange for a Looker-scoped token via your auth system
looker_token = await my_token_exchange(token)
return LookerIdentity(mode="oauth", access_token=looker_token)
# Fall back to service account
return LookerIdentity(
mode="api_key",
client_id="your-client-id",
client_secret="your-client-secret",
)
# Wire it up
config = LookerConfig()
mcp, client = create_server(config, identity_provider=MyIdentityProvider())The RequestContext provides:
headers— HTTP request headers (empty in stdio mode)tool_name— name of the MCP tool being invokedtool_group— which group the tool belongs toarguments— arguments passed to the tool
MCP-Level Authentication
MCP-level authentication (who can connect to the server) has three modes, selected by LOOKER_MCP_MODE.
LOOKER_MCP_MODE=dev (default) — permissive
Intended for local development, stdio deployments, and trust-network scenarios behind an upstream gateway. Two sub-options:
No MCP-level auth (default) — any client that can reach the transport can connect.
Static bearer token (deprecated) — set
LOOKER_MCP_AUTH_TOKENand clients must present it. Emits aDeprecationWarningat startup because RFC 9068 §2.1 forbids symmetric static bearers for OAuth 2.1 access tokens, and because static bearers don't carry per-user identity or expiry. Scheduled for removal in a future major release — migrate toLOOKER_MCP_MODE=public.
LOOKER_MCP_MODE=public — OAuth 2.1 resource-server (MCP 2025-11-25)
Internet-exposed / compliance-gated deployments. The server:
Validates every request's
Authorization: Bearer <JWT>header as an OAuth 2.1 access token.Accepts only
RS256andES256signatures (RFC 9068 §2.1). HS256 is hard-rejected at header inspection to close the algorithm-confusion attack vector (CVE-2015-9235).Caches the authorization server's JWKS (RFC 7517) with a 1-hour TTL and throttled kid-miss refresh (≤1 forced refresh per 5 minutes).
Enforces
iss(RFC 8414) andaud(RFC 8707) claim binding.Serves an RFC 9728 Protected Resource Metadata document for client auto-discovery. The spec-canonical URL follows RFC 9728 §3 construction:
/.well-known/oauth-protected-resourcewhenLOOKER_MCP_RESOURCE_URIis an origin-only identifier, or/.well-known/oauth-protected-resource<resource-path>when it carries a path. The origin-rooted path is also served as a defensive fallback.Emits realm-bearing
WWW-Authenticatechallenges on 401 (RFC 7235 §4.1 + RFC 9728 §5.1) pointing clients at the PRM URL.Rejects URL-query bearer tokens (
?access_token=,?authorization=) with a 400invalid_requestper OAuth 2.1 §5.1.1 — URL-bound tokens leak into referrer headers, proxy logs, and browser history regardless of destination.Rejects
LOOKER_MCP_AUTH_TOKENoutright — if the static bearer env var is set alongsideLOOKER_MCP_MODE=public, the server fails to start.
Required configuration:
export LOOKER_MCP_MODE=public
export LOOKER_MCP_JWKS_URI="https://auth.example.com/.well-known/jwks.json"
export LOOKER_MCP_ISSUER_URL="https://auth.example.com"
export LOOKER_MCP_RESOURCE_URI="https://looker-mcp.example.com/mcp"All three URIs must be absolute https:// URLs; the server fails closed at startup with a typed DeploymentPostureError if any are missing, malformed, or use http://. The LOOKER_MCP_RESOURCE_URI must not carry a fragment (RFC 9728 §3).
LOOKER_MCP_MODE=looker_oauth — Looker is the authorization server
For deployments where you want Looker itself to be the authorization server and the MCP server to hold no admin credentials and no sudo capability at all. The client runs a Looker PKCE flow directly against the Looker instance, obtains an opaque per-user Looker access token, and presents it to the MCP server as Authorization: Bearer <opaque-token>. The server:
Advertises Looker (the
LOOKER_BASE_URL) as the authorization server in its RFC 9728 Protected Resource Metadata, so MCP clients auto-discover the Looker OAuth endpoints to run PKCE against.Verifies every inbound token by calling Looker's
GET /userintrospection endpoint — the request is accepted iff Looker returns a valid user, and rejected (401invalid_token) on an expired / revoked / malformed token, a non-200 response, or a Looker transport failure (fail-closed).Forwards the verified opaque token to Looker as the session token, so the user's own Looker permissions govern every API call. This sidesteps the
X-User-*identity envelope entirely.Keeps the same HTTP contract as
publicmode: 400 on URL-query bearers (OAuth 2.1 §5.1.1), realm-bearingWWW-Authenticatechallenges on 401, anonymous/.well-known/*+/healthz+/readyz+/_introspect.Rejects
LOOKER_MCP_AUTH_TOKENoutright — a shared static bearer would defeat the per-user identity this posture exists to enforce.
Required configuration (the Looker base URL + this MCP server's own public URI — no JWKS, issuer, or admin credentials):
export LOOKER_MCP_MODE=looker_oauth
export LOOKER_BASE_URL="https://yourco.looker.com" # Looker instance; must be https
# This MCP server's own public URI: the RFC 9728 `resource` identifier and the
# host of the `resource_metadata` PRM URL clients fetch. Must be this server,
# NOT Looker — the MCP server serves the PRM. Required; no default.
export LOOKER_MCP_RESOURCE_URI="https://looker-mcp.example.com/mcp" # must be https
export LOOKER_TRANSPORT=streamable-httpLOOKER_BASE_URL must be an absolute https:// URL — opaque tokens travel over this connection and must not cross a plaintext hop. The server fails closed at startup with a typed DeploymentPostureError otherwise.
Deprecation timeline for LOOKER_MCP_AUTH_TOKEN
This release (0.13.0) — deprecated in
devmode (warning emitted), rejected inpublicmode (startup failure).Future major release — removed entirely.
If you currently rely on LOOKER_MCP_AUTH_TOKEN for gateway-level MCP protection, plan the migration now: either stand up an authorization server that issues OAuth 2.1 access tokens bound to aud=<LOOKER_MCP_RESOURCE_URI>, or keep the server in dev mode behind a trusted network perimeter.
PDT Administration Workflows
PDT (Persistent Derived Table) lifecycle is split across two tool groups: the connection group's update_connection toggles PDT control on a connection and the modeling group's start_pdt_build / check_pdt_build / stop_pdt_build (build management), trigger_datagroup (force rebuild + cache invalidation), and graph_derived_tables_for_* (dependency inspection) cover the per-PDT operations.
Two opinionated recipes for connection-level workflows:
Disable PDT workflow on a connection
When you need to quiesce all PDT builds on a connection (warehouse maintenance, cost spike investigation, etc.):
// 1. Stop new builds at the source — Looker will reject any further enqueues
{ "tool": "update_connection", "args": { "name": "my_warehouse", "pdt_api_control_enabled": false } }
// 2. Inspect what's currently materialized so you know what's at risk
{ "tool": "graph_derived_tables_for_model", "args": { "model": "ecommerce", "color": true } }
// 3. (Optional) Stop any in-flight builds you have materialization_ids for
{ "tool": "stop_pdt_build", "args": { "materialization_id": "mat-abc" } }
// 4. Verify the connection is quiesced
{ "tool": "test_connection", "args": { "name": "my_warehouse", "tests": ["pdt"] } }Enable PDT workflow on a connection
When you're ready to re-enable PDT builds after maintenance:
// 1. Re-enable PDT API control
{ "tool": "update_connection", "args": { "name": "my_warehouse", "pdt_api_control_enabled": true } }
// 2. Verify the connection is healthy for PDT builds
{ "tool": "test_connection", "args": { "name": "my_warehouse", "tests": ["pdt"] } }
// 3. (Optional) Force-rebuild gating datagroups so downstream PDTs catch up
{ "tool": "trigger_datagroup", "args": { "datagroup_id": "dg1" } }
// 4. (Optional) Pre-warm specific PDTs
{ "tool": "start_pdt_build", "args": { "model_name": "ecommerce", "view_name": "orders_pdt" } }
{ "tool": "check_pdt_build", "args": { "materialization_id": "mat-…" } } // poll until status == "complete"These recipes are intentionally exposed as separate primitives rather than a single disable_pdt_workflow(connection) composite tool. Each call emits its own audit line in the looker.session.sudo debug log when run under act_as_user, which is the right granularity for compliance review. A composite tool would hide steps from the LLM-as-operator and make failure paths less legible.
Health Endpoints
When running in HTTP mode, the server exposes:
GET /healthz— liveness probe (always returns 200 if server is running)GET /readyz— readiness probe (verifies Looker connectivity with a login/logout cycle)GET /.well-known/oauth-protected-resource— RFC 9728 Protected Resource Metadata (served whenLOOKER_MCP_MODE=publicorLOOKER_MCP_MODE=looker_oauth). Inpublicmode it advertises the configuredLOOKER_MCP_ISSUER_URLas the authorization server; inlooker_oauthmode it advertises the Looker base URL. When the resource identifier has a path, the same document is also served at/.well-known/oauth-protected-resource<resource-path>— that is the spec-canonical URL per RFC 9728 §3, and the one referenced byresource_metadata=...in 401WWW-Authenticatechallenges.
Development
# Clone
git clone https://github.com/ultrathink-solutions/looker-mcp-server.git
cd looker-mcp-server
# Install dependencies
uv sync --locked --dev
# Run quality checks
uv run ruff check . # lint
uv run ruff format . # format
uv run pyright # type check
uv run pytest tests/ -v # testsSee CONTRIBUTING.md for contribution guidelines.
License
Available Tools
33 toolsadd_dashboard_elementA
Add a visualization tile to a dashboard. Requires a query definition (model, view, fields) or a saved Look ID.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboard_id | Yes | ID of the dashboard | |
| title | Yes | Title for the tile | |
| type | No | Element type: 'vis' (visualization), 'text', 'filter' | vis |
| look_id | No | ID of a saved Look to embed | |
| query_model | No | LookML model for an inline query | |
| query_view | No | Explore/view for an inline query | |
| query_fields | No | Fields for an inline query |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral traits. It reveals the requirement for either a query definition or a saved Look ID, which is helpful. However, it does not describe side effects (e.g., whether existing tiles are affected), error behavior, or permission requirements, limiting transparency for a tool that modifies a dashboard.
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 extremely concise: two sentences with no unnecessary words. The core purpose is front-loaded, and every sentence adds critical information (purpose and requirements). This is an exemplar of conciseness.
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 that there are 7 parameters with 2 required, no annotations, but an output schema exists, the description adequately covers the essential usage. It misses details like whether text or filter types require additional inputs, or what happens on failure, but it is sufficient for an agent to understand how to invoke the tool for the primary use case.
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% coverage with descriptions for all 7 parameters. The description adds the constraint that either a query definition (model, view, fields) or a look_id must be provided, but this is already implied by the schema's nullable defaults and descriptions. Thus, the description adds minimal value beyond the schema.
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 explicitly that the tool adds a visualization tile to a dashboard, and specifies the two ways to define content (query definition or saved Look ID). This clearly differentiates it from sibling tools like add_dashboard_filter, which adds a filter, and create_dashboard, which creates the dashboard itself.
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 the tool (when you want to add a tile to a dashboard), but does not explicitly state when not to use it or contrast with alternatives like create_look or run_dashboard. No exclusions or alternatives are mentioned, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_dashboard_filterC
Add a filter to a dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboard_id | Yes | ID of the dashboard | |
| title | Yes | Filter display title | |
| dimension | Yes | Fully-qualified dimension name (e.g. 'orders.region') | |
| type | No | Filter type: 'field_filter', 'date_filter' | field_filter |
| default_value | No | Default filter value |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only states the action without disclosing behavioral traits such as whether the filter overrides existing ones, any required permissions, or side effects. This leaves the agent with insufficient information.
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 sentence with no unnecessary words. It is concise, though it lacks structural elements like headings or examples.
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 presence of an output schema and 5 parameters (3 required), the description is too minimal. It does not explain the filter's effect on the dashboard or the return value, which an agent needs for correct 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% with descriptions for all 5 parameters, so the baseline is 3. The description adds no additional meaning beyond the schema, but it does not harm clarity either.
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 action and resource (add a filter to a dashboard), and it distinguishes from sibling tools like 'add_dashboard_element' which add other elements. However, it is brief and could be more specific about what kind of filter.
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 no guidance on when to use this tool versus alternatives (e.g., update_dashboard or add_dashboard_element). There is no context about prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_dashboardA
Create a new empty dashboard in the specified folder.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title for the new dashboard | |
| folder_id | Yes | Folder ID to save the dashboard in | |
| description | No | Description |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It indicates a write operation ('create') but does not disclose side effects, permissions, or limitations. The behavior is clear but lacks depth.
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, efficient sentence with no wasted words. It conveys the essential purpose succinctly.
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 simplicity of the tool (3 parameters, output schema exists), the description is complete enough. It covers the basic purpose and constraints.
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% with detailed parameter descriptions. The description adds context ('empty', 'in the specified folder') but adds little beyond what the schema already 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 the action (create), the resource (dashboard), and the condition (empty, in specified folder). It distinguishes from sibling tools like add_dashboard_element and update_dashboard.
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 (when creating a new dashboard) but does not explicitly provide guidance on alternatives or when not to use. No exclusions or comparisons are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_lookB
Create a new saved Look with a query definition. The Look is saved in the specified folder.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title for the new Look | |
| model | Yes | LookML model name | |
| view | Yes | Explore/view name | |
| fields | Yes | Fields to include in the query | |
| folder_id | Yes | Folder ID to save the Look in | |
| filters | No | Query filters | |
| sorts | No | Sort expressions | |
| limit | No | Row limit for the query | |
| description | No | Description of the Look |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fails to disclose behavioral traits such as side effects, required permissions, or state changes. It only states the action without warning about potential issues like overwriting or folder validation.
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 concise sentence that efficiently conveys the core purpose without unnecessary words. It is front-loaded and easy to parse.
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 complexity of 9 parameters and no annotations, the description is incomplete. It lacks explanation of the Look concept, expected output schema, and how the query definition is constructed. Sibling tools indicate a rich ecosystem, but the description does not help navigate 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?
The input schema has 100% description coverage, so the description adds minimal meaning beyond the schema. It provides context ('query definition') but does not elaborate on parameter relationships or constraints.
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 creates a new saved Look with a query definition and saves it in a specified folder. It uses a specific verb and resource, distinguishing it from sibling tools like update_look or delete_look.
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 no explicit guidance on when to use this tool versus alternatives like run_look or update_look. Usage must be inferred from the verb 'create' and the term 'saved Look', but no when-not-to or prerequisite information is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_dashboardB
Delete a dashboard. This action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboard_id | Yes | ID of the dashboard to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations present, so description carries full burden. It only notes irreversibility but omits other important behaviors like required permissions, side effects, or compliance considerations.
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 concise sentences with front-loaded purpose, no extraneous information.
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 presence of an output schema, the description covers the basics. However, it lacks differentiation from sibling tools like update_dashboard or delete_look.
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 the parameter description is sufficient. The tool description does not add extra semantic value beyond the schema.
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 'Delete a dashboard,' which is a specific verb+resource combination. It also highlights irreversibility, 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?
No guidance on when to use this tool versus alternatives like update_dashboard or delete_look. No prerequisites or context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_lookA
Delete a saved Look. This action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| look_id | Yes | ID of the Look to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full burden. It discloses irreversibility, which is a critical behavioral trait for a deletion tool.
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 action, no redundant words. Every sentence earns 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 (one required param, output schema exists), the description covers essential information: action and irreversibility. No annotations needed.
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% with one parameter 'look_id' having a clear description. The tool description does not add extra meaning beyond the schema, so baseline 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 'Delete a saved Look', using a specific verb and resource. This distinguishes it from sibling tools like create_look, update_look, and run_look.
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 notes that the action cannot be undone, implying caution, but does not provide explicit guidance on when to use this tool versus alternatives or when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_embed_urlA
Generate an embeddable SSO URL for Looker content (dashboards, Looks, or explores). The URL includes authentication so the viewer does not need separate Looker credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| target_url | Yes | Looker content URL path (e.g. '/dashboards/123') | |
| session_length | No | Session duration in seconds | |
| force_logout_login | No | Force new login session |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the URL includes authentication, implying a safe read-like operation. However, it does not detail any prerequisites, error conditions, or side effects beyond generating a URL.
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-loading the purpose and scope, then adding a key benefit. Every word adds value 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?
Given the tool's simplicity and the presence of an output schema, the description adequately explains what the tool does and why it is useful. It could mention caller permissions or rate limits, but the current information is sufficient for an AI to use 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?
Schema coverage is 100% with each parameter having a clear description. The tool description does not add additional meaning beyond the schema, which already sufficiently defines target_url, session_length, and force_logout_login.
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 generates an embeddable SSO URL for Looker content, specifying the types (dashboards, Looks, explores) and highlighting authentication. This distinguishes it from sibling tools like query_url and run_dashboard.
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 explains the tool's purpose and benefit (embedded authentication) but does not provide explicit when-to-use or when-not-to-use guidance relative to alternatives. The context is clear enough for an AI to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exploreA
Get full details of an explore including all its dimensions, measures, filters, and parameters. This is the primary tool for understanding what fields are available for querying.
| Name | Required | Description | Default |
|---|---|---|---|
| model_name | Yes | Name of the LookML model | |
| explore_name | Yes | Name of the explore within the model |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Implies read-only behavior but does not explicitly state it. Lacks disclosure of side effects, auth requirements, or rate limits.
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, each providing essential information. No unnecessary words 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?
Given the existence of an output schema and clear input schema, the description is complete for understanding the tool's purpose and usage. No gaps.
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 both parameters with descriptions. Description adds no additional meaning beyond schema, so baseline 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?
Clearly states it retrieves full details of an explore, including specific components (dimensions, measures, filters, parameters). Distinguishes from sibling tools like get_model or list_dimensions.
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?
Describes the tool as 'primary for understanding what fields are available for querying', which gives clear usage context. No explicit when-not or alternatives, but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_modelA
Get detailed information about a specific LookML model, including all its explores and their descriptions.
| Name | Required | Description | Default |
|---|---|---|---|
| model_name | Yes | Name of the LookML model |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavior. It states returns 'detailed information' but does not specify exact fields, idempotency, error handling, or read-only nature. Adequate but not rich.
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?
Single sentence of 16 words, begins with verb, contains all necessary information without fluff. Highly concise and well-structured.
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?
Tool has low complexity (1 param, output schema present). Description covers purpose and return content adequately. With output schema, agent can infer structure. Complete for 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?
Parameter 'model_name' is fully documented in schema (100% coverage). Description adds context about including explores but does not add essential meaning beyond schema. 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?
Description clearly states the verb 'Get', the resource 'detailed information about a specific LookML model', and what is included ('all its explores and their descriptions'). It distinguishes from siblings like 'list_models' and 'get_explore'.
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?
No explicit guidance on when to use this tool versus alternatives like 'list_models' or 'get_explore'. Usage is implied but not clarified with when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_analyzeA
Analyze usage patterns across Looker content. Shows which models, explores, and content are most and least used.
| Name | Required | Description | Default |
|---|---|---|---|
| analysis_type | No | Type of analysis: 'models' (model/explore usage), 'content' (look/dashboard usage) | models |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry full behavioral disclosure. It does not indicate whether the tool is read-only, requires special permissions, or has performance implications. The description only says 'analyze' and 'shows', which suggests a read operation, but not explicitly.
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 concise sentences, front-loaded with the action verb 'Analyze'. No unnecessary words, clear structure.
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 core functionality and the parameter is fully documented. However, given no annotations, it lacks information on permissions, side effects, or whether it is a read-only operation. The output schema exists but its content is not hinted at.
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 parameter is well-documented in the schema. The description adds extra context by stating that the output shows most and least used items, linking the parameter choices to the resulting analysis, which provides additional meaning beyond the schema.
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 analyzes usage patterns across Looker content, specifically showing most and least used models, explores, and content. This is a specific action that distinguishes it from sibling tools like health_pulse or query.
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 it should be used to understand content usage, but it does not explicitly state when to use it instead of alternatives like query or health_pulse. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_pulseA
Run a health check on the Looker instance. Returns status of database connections, datagroups, and overall system health.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full responsibility for behavioral disclosure. It fails to mention whether the operation is read-only, if it requires special permissions, or any potential side effects. The description only states what is returned, which is insufficient.
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, efficient sentence that front-loads the action and outcome. It is appropriately sized for a parameterless tool, though it could be slightly more structured.
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 is sufficient given the absence of parameters and the presence of an output schema. It explains what the tool returns (database connections, datagroups, overall health), covering the key aspects. However, it could note that the tool is safe to invoke repeatedly.
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 tool has no parameters, and the schema coverage is 100%. The description adds no parameter information, but this is acceptable given the lack of parameters. A baseline of 4 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 runs a health check on the Looker instance and returns specific statuses (database connections, datagroups, overall system health). The verb 'run a health check' is specific and the resource is identified, distinguishing it from siblings like 'health_vacuum'.
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 no guidance on when to use this tool versus alternatives such as 'health_analyze' or 'health_vacuum'. There is no mention of context, prerequisites, or exclusions, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_vacuumA
Identify unused or orphaned LookML objects for cleanup. Scans for explores with no content, unreferenced views, and Looks/dashboards with zero views.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | What to scan: 'explores' (unused explores), 'content' (zero-view Looks/dashboards) | explores |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so description must disclose behavioral traits. It states the tool scans and identifies objects but does not indicate whether it is read-only, requires permissions, or has side effects. The phrase 'for cleanup' could mislead agents into thinking deletion occurs, but it only identifies objects. Missing clear disclosure of non-destructive nature.
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 efficiently convey purpose and scope. Front-loaded with the main action, followed by specifics. No unnecessary words or redundant information.
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?
Description covers core functionality and parameter meaning, but lacks usage guidance and behavioral transparency. Given an output schema exists, return values are explained elsewhere, so text is adequate but incomplete without disclosure of read-only nature or tips for effective use.
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% with a single parameter 'scope' described. The tool description largely repeats the schema's explanation (scan explores vs. content), adding no new semantic value beyond what the schema already 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?
Description clearly states the tool identifies unused or orphaned LookML objects for cleanup, listing specific types (explores, unreferenced views, zero-view Looks/dashboards). It distinguishes itself from health_analyze and health_pulse by focusing on cleanup rather than general health analysis.
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?
Description implies use for cleanup but does not explicitly state when to use this tool versus alternatives like health_analyze or health_pulse. No exclusion criteria or usage scenarios are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_columnsA
List columns for specific tables in a Looker connection. Returns column names, data types, and other metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes | Name of the Looker database connection | |
| database | No | Database name | |
| schema_name | No | Schema name | |
| table_name | No | Table name to get columns for |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions returning metadata but does not disclose behavioral traits such as permissions, read-only status, or side effects. It is adequate but minimal.
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 action and resource, 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?
Given the presence of an output schema, the description does not need to detail return values. However, it could mention that table_name and schema_name are optional filters. Overall, it is fairly complete for a listing 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 baseline is 3. The description adds no extra meaning beyond the schema; it does not clarify parameter interactions or the optional nature of table filtering.
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 verb 'list' and the resource 'columns for specific tables in a Looker connection'. It mentions the returned data (column names, data types, other metadata), which distinguishes it from sibling tools like list_tables (lists tables) or list_dimensions (lists dimensions).
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 use for specific tables but does not provide explicit guidance on when to use this tool versus alternatives like list_dimensions or list_measures. No when-not-to-use or context about prerequisites is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_connectionsA
List all database connections configured in the Looker instance.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description only restates the basic function. Does not disclose expected output structure, permissions, or potential side effects, which are critical for a tool with zero annotation coverage.
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?
One sentence efficiently conveys the purpose without fluff. Could be slightly more concise, but 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?
Given zero parameters and existence of an output schema (not shown), the description covers the core purpose. However, it omits what fields are returned, which is left to 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?
No parameters exist, schema covers them fully. Description adds no parameter info, but baseline for 0-param tools is 4.
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?
Description clearly states the verb 'list' and the resource 'all database connections' with scope 'in the Looker instance', distinguishing it from other list 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?
No guidance on when to use this tool over sibling tools like list_databases or list_dashboards. Missing context on prerequisites or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dashboardsC
Search for dashboards by title, description, or other criteria.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Filter by title (partial match) | |
| folder_id | No | Filter by folder ID | |
| limit | No | Maximum results |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It only mentions 'search', but does not state whether the tool is read-only, supports pagination, or has rate limits. The name 'list' implies a read action, but the description lacks explicit behavioral context.
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 short sentence with no unnecessary words. However, the phrase 'or other criteria' is vague and could be removed for tighter clarity. Overall, it is appropriately 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?
The description does not explain default behavior (e.g., returns all dashboards if no filters) or mention that an output schema exists. For a list tool with optional parameters, more context about result format and default results is needed for completeness.
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 descriptions already fully cover the three parameters (title, folder_id, limit). The description adds vague 'other criteria', which does not provide concrete additional meaning. Baseline score of 3 is appropriate given 100% schema coverage, but no extra value added.
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 for dashboards by title, description, or other criteria. It explicitly names the resource (dashboards) and action (search), making its purpose clear. However, it does not distinguish itself from the sibling tool 'search_content', which may also search dashboards.
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?
No guidance is provided on when to use this tool versus alternatives like 'search_content', 'run_dashboard', or 'list_looks'. There are no exclusions or context for preferred use cases, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_databasesB
List all databases accessible through a Looker connection.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes | Name of the Looker database connection |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior. It states the core function but omits details like read-only nature, required permissions, error handling, or response structure. The output schema exists but is not referenced; the description adds minimal behavioral context beyond the obvious.
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, front-loaded sentence with no wasted words. It is efficient, though it could benefit from a bit more detail without becoming verbose.
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 output schema exists, the description does not need to explain return values. However, it lacks details on usage context and selection guidance among siblings. For a simple tool with one parameter, it is minimally adequate but not comprehensive.
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% (connection_name is documented). The description adds no extra meaning, merely implying the parameter's role. Baseline 3 applies since the schema already covers it adequately.
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 verb 'List' and the resource 'databases accessible through a Looker connection', making the tool's purpose unambiguous. It distinguishes from sibling tools like list_connections and list_schemas by specifying databases and accessibility via a connection.
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 no guidance on when to use this tool versus alternatives, such as list_schemas or list_tables. It does not mention prerequisites, context for choosing this tool, or any scenarios where it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dimensionsB
List dimensions in an explore. Convenience tool that returns only the dimension fields (name, label, type, description).
| Name | Required | Description | Default |
|---|---|---|---|
| model_name | Yes | Name of the LookML model | |
| explore_name | Yes | Name of the explore |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It only states the output fields, omitting any details about read-only nature, permissions, or side effects.
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 with no superfluous words. The purpose is front-loaded, and the extra detail follows efficiently.
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 adequately defines the tool's scope but lacks usage context relative to similar siblings. An output schema exists, so return values are covered elsewhere.
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 each parameter has a clear description. The description does not add additional meaning beyond what the schema already 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 that the tool lists dimensions in an explore and specifies that it returns only selected fields (name, label, type, description). This distinguishes it from siblings like list_columns and list_measures.
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?
No guidance is provided on when to use this tool versus alternatives. The description calls it a 'convenience tool' but does not explain scenarios or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_looksC
Search for saved Looks by title, description, or other criteria.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Filter by title (partial match) | |
| folder_id | No | Filter by folder ID | |
| limit | No | Maximum results |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description should disclose behavioral traits like default behavior (e.g., returns all looks if no criteria), pagination, and output format. It only states 'Search for saved Looks', omitting these details.
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 sentence of 18 words, which is concise. However, it includes an inaccurate mention of 'description', slightly reducing clarity.
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 has 3 optional parameters and an output schema, the description is adequate but not complete. It does not explain the default behavior (e.g., listing all looks when no parameters are provided) or the structure of the output.
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 baseline is 3. The description adds that search is by title, description, or other criteria, but 'description' is not a parameter and 'other criteria' is vague, adding minimal value and some misinformation.
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 searches for saved Looks by criteria, using a specific verb and resource. However, it misleadingly mentions 'description' as a search criterion, which is not in the input schema, and does not differentiate from sibling tools like search_content.
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 no guidance on when to use this tool versus alternatives such as search_content or run_look. It lacks context for appropriate usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_measuresA
List measures in an explore. Convenience tool that returns only the measure fields (name, label, type, description).
| Name | Required | Description | Default |
|---|---|---|---|
| model_name | Yes | Name of the LookML model | |
| explore_name | Yes | Name of the explore |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It transparently states the tool returns only measure fields (name, label, type, description), which adds value beyond a generic list. However, it does not explicitly confirm read-only behavior or disclose any potential side effects.
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 extremely concise: two sentences, front-loaded with the core purpose, and contains no unnecessary words. Every sentence adds 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 low complexity (2 parameters, no enums, presence of output schema), the description is mostly complete. It explains the output fields but lacks explicit guidance on prerequisites, error handling, or when to prefer this tool over siblings. The presence of an output schema mitigates the need for detailed return value descriptions.
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%, with both parameters (model_name, explore_name) already described in the input schema. The description adds no additional meaning or constraints about these parameters, meeting the baseline for high coverage.
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 measures in an explore, specifies it's a convenience tool returning only specific measure fields (name, label, type, description), and distinguishes itself from sibling tools like list_dimensions and list_columns by focusing solely on measures.
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 as a convenience tool but does not explicitly state when to use it over siblings like list_dimensions or list_columns. No guidance on prerequisites or exclusions is provided, leaving the agent to infer the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_modelsA
List all LookML models accessible to the current user. Returns model names, labels, associated projects, and their explores.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description does not disclose behavioral details such as pagination, sorting, or rate limits. It mentions 'accessible to the current user' but lacks further transparency.
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, concise and front-loaded with the primary action. Every word serves a purpose, 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?
No input parameters and output schema exists (even if not shown). Description fully explains return values, meeting completeness needs for a simple 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?
Input schema has zero parameters; description adds meaningful context about output fields. Despite no param details needed, the description compensates by explaining return value 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?
Clearly states it lists all LookML models accessible to the user, specifying the resource and output includes names, labels, projects, and explores. Distinguishes from sibling tools like list_dashboards or list_looks.
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?
No explicit guidance on when to use this tool versus alternatives. Usage is implied from the description but lacks direct context or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_schemasA
List schemas in a database accessible through a Looker connection.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes | Name of the Looker database connection | |
| database | No | Database name (required for multi-database connections) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must fully disclose behavior. Merely states function; lacks traits like read-only nature, auth requirements, or error handling (e.g., invalid connection).
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?
Single, clear sentence with no superfluous information. Front-loaded effectively.
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?
Tool is simple and has output schema, so return values are covered. Lacks mention of error conditions or prerequisites for connection validity, but adequate for basic use.
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 100% of parameters with descriptions, so description adds no extra meaning. 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?
Clearly states verb (list), resource (schemas), and context (database via Looker connection). Distinguishes from siblings like list_tables and list_columns.
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?
Implied usage but no explicit when-to-use or when-not-to-use. Siblings exist (list_databases, list_tables) but no guidance on alternatives or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesB
List tables in a schema accessible through a Looker connection.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes | Name of the Looker database connection | |
| database | No | Database name | |
| schema_name | No | Schema name to filter tables |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral traits. It does not mention that the operation is read-only, nor any potential limitations or failure modes (e.g., what happens when a schema is not found).
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 concise sentence with no redundant information. It is front-loaded with the purpose, but could incorporate additional brief details without sacrificing brevity.
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 presence of an output schema and 100% parameter documentation, the description is minimally adequate. However, it lacks behavioral and usage context, making it incomplete for complex scenarios.
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 input schema already documents all parameters. The description adds no extra semantic meaning beyond what is in the schema, so it performs at baseline level.
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 tables, specifies the context of a Looker connection and schema filtering, and effectively distinguishes from sibling metadata tools like list_columns, list_dimensions, and list_measures.
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 no guidance on when to use this tool versus alternatives, nor does it mention prerequisites or context for usage. An agent would have to infer usage from sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queryA
Run a query using the Looker semantic model. Specify the model, explore, fields, filters, and sorts. Looker generates the optimized SQL — you never write SQL directly. Returns data rows as JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | LookML model name (e.g. 'ecommerce') | |
| view | Yes | Explore/view name within the model (e.g. 'orders') | |
| fields | Yes | Fields to select — use fully-qualified names (e.g. ['orders.region', 'orders.total_revenue']) | |
| filters | No | Filter expressions as field:value pairs (e.g. {'orders.created_date': '90 days'}) | |
| sorts | No | Sort expressions (e.g. ['orders.total_revenue desc']) | |
| limit | No | Maximum rows to return | |
| result_format | No | Output format: 'json' (default), 'json_detail', 'csv', 'txt' | json |
| dev_mode | No | Run against the dev workspace's currently-checked-out LookML rather than production. Required when validating in-progress branch edits. Implied automatically when ``branch`` is set. | |
| branch | No | Project branch to atomically swap to for this call. The dev workspace's saved branch is restored when the call completes (success or failure). Implies dev_mode=True; requires project_id. | |
| project_id | No | LookML project ID — required when ``branch`` is set so the MCP knows which project's branch state to swap. | |
| act_as_user | No | Optional Looker user ID or email to impersonate for this call. Use to operate on another user's dev workspace (Looker dev mode is per-user-isolated) or to run as a dedicated CI service user. Requires sudo capability on the configured admin credentials. When omitted, the call uses the configured or gateway-provided identity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must fully disclose behavior. It mentions SQL generation and JSON output, but omits details on error handling, pagination, or rate limits. Adequate but could be more transparent.
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, no fluff. First sentence states purpose, second elaborates. Every word earns its place. Exceptionally 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?
Despite output schema existing, the tool has 11 parameters with nuanced interactions (dev_mode, branch, act_as_user). The description does not cover these complexities, leaving agent underinformed.
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% with descriptions for each parameter. The description summarizes main parameters but does not add significant new meaning or clarify interdependencies (e.g., dev_mode and branch). 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 runs a query using the Looker semantic model, specifying model, explore, fields, filters, and sorts. It distinguishes from raw SQL writing and mentions returning JSON, making purpose very clear.
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 semantic model queries without writing SQL, but lacks explicit when-not-to-use or alternatives (e.g., query_sql for raw SQL). Guidance is present but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_sqlA
Generate the SQL that Looker would execute for a query, without actually running it. Useful for reviewing or debugging queries.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | LookML model name | |
| view | Yes | Explore/view name | |
| fields | Yes | Fields to select | |
| filters | No | Filter expressions | |
| sorts | No | Sort expressions | |
| limit | No | Maximum rows | |
| dev_mode | No | Compile the SQL against the dev workspace's LookML rather than production. Implied when ``branch`` is set. | |
| branch | No | Project branch to atomically swap to for this call (saved branch restored on exit). Requires project_id. | |
| project_id | No | LookML project ID — required with ``branch`` | |
| act_as_user | No | Optional Looker user ID or email to impersonate for this call. Use to operate on another user's dev workspace (Looker dev mode is per-user-isolated) or to run as a dedicated CI service user. Requires sudo capability on the configured admin credentials. When omitted, the call uses the configured or gateway-provided identity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description accurately states the tool does not execute the query, only generates SQL. This is a key behavioral trait, though it omits details like permission requirements or rate limits. Still, it provides sufficient transparency for safe use.
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 ('Generate the SQL'), no extraneous words. Every sentence adds 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?
The description captures the primary use case and non-execution behavior. Since an output schema exists, return values are covered. The tool has many parameters but the schema descriptions handle them, so completeness is adequate though not exhaustive.
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% with descriptions for all parameters. The description adds no parameter-specific meaning beyond what the schema provides, meeting the baseline expectation.
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 generates SQL without executing it, using specific verb 'Generate' and resource 'SQL'. It distinguishes from sibling tools like 'query' which runs queries, making its 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 says 'Useful for reviewing or debugging queries', implying appropriate use cases. However, it does not explicitly exclude situations or mention alternatives, lacking full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_urlA
Generate a URL to a Looker Explore with pre-populated query parameters. The URL opens the Explore UI in Looker.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | LookML model name | |
| view | Yes | Explore/view name | |
| fields | Yes | Fields to select | |
| filters | No | Filter expressions | |
| sorts | No | Sort expressions | |
| dev_mode | No | Generate the URL against dev-workspace LookML. Implied when ``branch`` is set. | |
| branch | No | Project branch to atomically swap to for this call. Requires project_id. | |
| project_id | No | LookML project ID — required with ``branch`` | |
| act_as_user | No | Optional Looker user ID or email to impersonate for this call. Use to operate on another user's dev workspace (Looker dev mode is per-user-isolated) or to run as a dedicated CI service user. Requires sudo capability on the configured admin credentials. When omitted, the call uses the configured or gateway-provided identity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden but only states it generates a URL that opens the Explore UI. It does not disclose if the URL expires, authentication requirements, or any side effects. However, it is not misleading and basic behavior is clear.
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 with no wasted words. The first sentence immediately conveys the core function, and the second confirms the result. It is appropriately sized for the tool's simplicity.
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 has 9 parameters and an output schema, the description is minimal. It lacks details like URL validity duration, authentication context, or how the URL relates to dev_mode or act_as_user. The output schema may clarify return values, but the description could provide more 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?
Schema description coverage is 100%, so the baseline is 3. The description adds no additional meaning beyond 'pre-populated query parameters', which is generic. The parameter details are already well-documented in the schema.
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 generates a URL to a Looker Explore with pre-populated query parameters, distinguishing it from other tools like generate_embed_url. It uses a specific verb ('Generate') and resource ('Looker Explore'), 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?
No guidance is provided on when to use this tool versus alternatives such as run_query or generate_embed_url. The description does not mention context, prerequisites, or scenarios where this tool is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_dashboardA
Get a dashboard definition and run all its tile queries. Returns the dashboard metadata and the data for each element.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboard_id | Yes | ID of the dashboard |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. It states it runs all tile queries, hinting at multiple queries, but does not disclose performance implications, side effects, or required permissions.
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?
Single sentence, front-loaded verb and resource. 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?
Output schema exists (though not shown), so description need not detail return values. Low complexity (1 param). Description is sufficient but could mention limitations like large dashboards.
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?
Single parameter with 100% schema coverage. Description ('ID of the dashboard') aligns with schema. No additional semantic value beyond what schema 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?
Description clearly states verb (get/run), resource (dashboard), and outcome (returns metadata and data for tile queries). Distinguishes from siblings like run_query and run_look.
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?
No explicit when-to-use or when-not-to-use guidance. Implied use case is retrieving dashboard data, but no comparison to alternatives like run_look or query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_lookB
Run the query associated with a saved Look and return its results. Looks are pre-built query configurations saved in Looker.
| Name | Required | Description | Default |
|---|---|---|---|
| look_id | Yes | ID of the saved Look | |
| result_format | No | Output format: 'json', 'csv', 'txt' | json |
| limit | No | Maximum rows to return | |
| dev_mode | No | Resolve the Look's model+explore against the dev workspace's LookML rather than production. Implied when ``branch`` is set. | |
| branch | No | Project branch to atomically swap to for this call (saved branch restored on exit). Requires project_id. | |
| project_id | No | LookML project ID owning the Look's model — required with ``branch`` | |
| act_as_user | No | Optional Looker user ID or email to impersonate for this call. Use to operate on another user's dev workspace (Looker dev mode is per-user-isolated) or to run as a dedicated CI service user. Requires sudo capability on the configured admin credentials. When omitted, the call uses the configured or gateway-provided identity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits but only states 'run the query... and return its results.' It omits critical info such as read-only nature, auth requirements, or side effects. The parameter descriptions help but are not part of the main description.
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 concise sentences with no wasted words. The definition is front-loaded with the core action and includes a brief explanatory note about Looks.
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 existence of an output schema and full parameter descriptions, the description is adequate but could be improved by noting that the operation is read-only or by hinting at advanced features like dev mode. It meets the minimum threshold but doesn't excel.
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 parameters are already well-documented. The description adds no extra meaning beyond 'saved Look' implying look_id. Baseline 3 is appropriate as the description does not enhance the 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 clearly states the tool runs a saved Look and returns results, using a specific verb-resource combination. It distinguishes from siblings like 'run_dashboard' and 'run_query' by focusing on 'saved Looks', but does not explicitly contrast with those alternatives.
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?
No guidance is provided on when to use this tool versus alternatives (e.g., run_query for ad-hoc queries or run_dashboard for dashboards). The description simply states what it does without contextualizing its appropriate use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_queryA
Run an existing saved Looker Query by ID and return its results. Unlike query, this does not re-spec the query body — any settings baked into the saved Query (e.g. dynamic_fields / table calcs / vis config) are preserved. Useful for re-running a query whose ID you already have: a dashboard tile's query.id, the id returned by query_url, or an id surfaced by other Looker tooling.
| Name | Required | Description | Default |
|---|---|---|---|
| query_id | Yes | ID of the saved Query | |
| result_format | No | Output format: 'json' (default), 'json_detail', 'csv', 'txt' | json |
| limit | No | Row limit override. Omit to use the limit baked into the saved Query. | |
| apply_formatting | No | Render values per LookML/Look formatting (currency symbols, date formats, etc.). Default false matches Looker's API default. | |
| apply_vis | No | Apply visualization-config-driven rendering to the result. Default false matches Looker's API default. | |
| server_table_calcs | No | Compute table calculations server-side so the response includes them. Required for tile-fidelity validation when the saved Query carries table calcs. Default false matches Looker's API default. | |
| cache | No | Allow Looker to serve cached results. Set false to force a fresh run. Default true matches Looker's API default. | |
| dev_mode | No | Resolve the Query against the dev workspace's LookML rather than production. Implied when ``branch`` is set. | |
| branch | No | Project branch to atomically swap to for this call (saved branch restored on exit). Requires project_id. | |
| project_id | No | LookML project ID owning the Query's model — required with ``branch`` | |
| act_as_user | No | Optional Looker user ID or email to impersonate for this call. Use to operate on another user's dev workspace (Looker dev mode is per-user-isolated) or to run as a dedicated CI service user. Requires sudo capability on the configured admin credentials. When omitted, the call uses the configured or gateway-provided identity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses key behaviors: preservation of saved Query settings, defaults matching Looker's API, and parameter effects (e.g., dev_mode, branch, act_as_user). However, it does not explicitly state that it is a read operation or discuss rate limits.
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 brief and well-structured: first sentence states purpose, second clarifies distinction, third lists use cases, and subsequent sentences detail parameters. No redundant information.
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 11 parameters, no annotations, and an output schema (not shown), the description covers key behavioral aspects and parameter details. It could mention that results are returned, but that is implied. Overall, it provides sufficient context for a complex 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 description coverage is 100%, so baseline is 3. The description adds significant value beyond schema by explaining usage contexts (e.g., server_table_calcs for tile-fidelity, branch atomic swap, act_as_user for impersonation), justifying a higher 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?
The description clearly states the tool runs an existing saved Looker Query by ID and returns results. It distinguishes from sibling `query` by noting it preserves baked-in settings like dynamic_fields, providing a specific verb+resource with sibling differentiation.
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 use cases (dashboard tile's query.id, id from query_url, etc.) and contrasts with `query`. While it lacks explicit 'when not to use', the context and sibling tools make the guidance effective.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contentA
Search across all Looker content — dashboards, looks, explores, and more. Returns matching items with titles, descriptions, and IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| query_string | Yes | Search query (full-text search) | |
| types | No | Content types to search: 'dashboard', 'look', 'folder', etc. | |
| limit | No | Maximum results to return |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so description must compensate. It describes the matching behavior and returned fields, but lacks details on pagination, ordering, authentication, or depth of search. Output schema exists but is not visible in the definition.
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, no filler. First sentence states the action, second states the result. Efficient and 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 output schema exists and the tool is a straightforward search with 3 parameters, the description covers the essential purpose and return structure adequately.
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% with all parameters already described. The description does not add new semantic meaning beyond the schema's descriptions for 'query_string', 'types', and 'limit'.
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?
Description clearly states the action 'Search across all Looker content' and lists examples (dashboards, looks, explores) and what it returns (titles, descriptions, IDs), distinguishing it from listing or running 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?
Implicitly tells when to use (when searching across content types) but does not explicitly compare to sibling listing tools like list_dashboards or list_looks, leaving some interpretation to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_dashboardB
Update a dashboard's metadata (title, description, folder).
| Name | Required | Description | Default |
|---|---|---|---|
| dashboard_id | Yes | ID of the dashboard to update | |
| title | No | New title | |
| description | No | New description | |
| folder_id | No | Move to a different folder |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Does not disclose side effects, permissions required, or whether changes are reversible. Minimal behavioral information.
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?
Single sentence with eight words, no redundancy. Front-loaded with action and resource.
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?
Minimal but adequate for a simple update tool. Lacks usage context and behavioral details; however, output schema and schema coverage compensate partially.
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 parameter details are already present. Description repeats field names but does not add new context beyond the schema.
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?
Clear verb 'update' and specific resource 'dashboard's metadata' with fields listed in parentheses. Distinguishes from siblings like update_look and create_dashboard.
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?
No indication of when to use this tool versus alternatives such as create_dashboard for new dashboards or update_look for looks. No prerequisites or preconditions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_lookB
Update a Look's metadata (title, description, folder).
| Name | Required | Description | Default |
|---|---|---|---|
| look_id | Yes | ID of the Look to update | |
| title | No | New title | |
| description | No | New description | |
| folder_id | No | Move to a different folder |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the action is an update, implying mutation, but does not disclose behavioral traits such as idempotency, partial update behavior, side effects, or required permissions. The description is too sparse for safe invocation.
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 concise sentence with no wasted words. It is appropriately sized for a simple tool, though it could be slightly more informative without sacrificing brevity.
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 4 parameters, 1 required, and an output schema (not shown), the description lacks important context such as prerequisites (e.g., existence of the Look), error conditions, or side effects. The agent may not have enough information to use this tool safely without additional knowledge.
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 baseline is 3. The description lists the three updatable fields but adds no extra meaning beyond the schema. It does not clarify constraints, relationships, or other semantics that would help the agent use parameters correctly.
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 action ('Update'), the resource ('a Look'), and the specific metadata fields ('title, description, folder'). This distinctly differentiates it from sibling tools like create_look, delete_look, and run_look.
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 when updating metadata, but provides no explicit guidance on when to use or not use this tool, nor any mention of alternatives like create_look or delete_look for related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_contentA
Run Looker's content validator across all looks and dashboards in the instance. Returns broken content references grouped by error kind (e.g. missing explore, renamed field, deleted model). Useful to audit breakage after a LookML change before users see errors. Can be slow on large instances.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the operation is a validation (likely read-only) and mentions performance impact, but does not detail permissions or whether it modifies any state. This is adequate but not highly detailed.
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 that front-load the main action and provide essential context without waste. Every sentence adds 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 it has an output schema (in context signals), the description need not explain return values. The tool takes no parameters, and the description covers its purpose, use case, and a caveat, making it 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 no parameters, so schema description coverage is 100%. Baseline for 0 parameters is 4, and the description does not need to add parameter information.
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 runs Looker's content validator across all looks and dashboards, returning broken content references grouped by error kind. This is a specific verb-resource combination that distinguishes it from sibling tools like health_analyze or list_dashboards.
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 explains it is useful to audit breakage after a LookML change before users see errors, and notes it can be slow on large instances. While it does not explicitly state when not to use it, it provides clear context for appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiA
Return the Looker user this MCP session is currently authenticated as. Calls GET /user, which Looker resolves against the active session token — so when the session is sudo-impersonating another user (per-call act_as_user or X-User-Token header), the impersonated user's record is returned. Useful when the same Looker instance has multiple similarly-named users and you need to confirm which one the MCP is operating as.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden. It explains the API call (GET /user), session token resolution, and sudo-impersonation behavior. This goes beyond basic purpose and adds valuable transparency about how the tool works internally.
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: first states purpose, second adds context and usage. No wasted words, front-loaded with critical information. Every sentence earns 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 zero parameters and presence of output schema, the description explains return value indirectly (user record) and covers sudo-impersonation nuance. For a simple identity tool, this is fully 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 zero parameters, so description adds no param info—this is fine. With 100% schema coverage (trivially) and baseline 4 for 0-param tools, the description does not need to add parameter details.
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 the current Looker user, with specific verb ('Return'), resource ('Looker user'), and context ('MCP session'). It distinguishes itself from sibling tools like create_dashboard or delete_look by focusing on authentication identity.
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 when to use the tool: when there are multiple similarly-named users and confirmation of which user the MCP is operating as is needed. It lacks explicit when-not-to-use or alternative tools, but the context is clear and adequate for a simple identity tool.
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.
33 tool updates
v0.20.0- First observed
add_dashboard_element - First observed
add_dashboard_filter - First observed
create_dashboard - First observed
create_look - First observed
delete_dashboard - First observed
delete_look - First observed
generate_embed_url - First observed
get_explore - First observed
get_model - First observed
health_analyze - First observed
health_pulse - First observed
health_vacuum - First observed
list_columns - First observed
list_connections - First observed
list_dashboards - First observed
list_databases - First observed
list_dimensions - First observed
list_looks - First observed
list_measures - First observed
list_models - First observed
list_schemas - First observed
list_tables - First observed
query - First observed
query_sql - First observed
query_url - First observed
run_dashboard - First observed
run_look - First observed
run_query - First observed
search_content - First observed
update_dashboard - First observed
update_look - First observed
validate_content - First observed
whoami
TDQS
Scored across 33 tools
Each tool targets a distinct action and resource (dashboard, look, query, explore, model, database, health, content, user). Even similar-sounding tools like query and run_query have clear differences: query requires a new definition, run_query uses an existing ID. No two tools are ambiguous.
The vast majority follow a consistent verb_noun pattern (e.g., list_models, create_dashboard, run_look). Minor exceptions include the bare verb 'query' and the single-word 'whoami', but these are negligible and do not hinder readability.
With 33 tools, the server exceeds the calibration threshold for 'too many' (>25). While the broad scope may justify a large surface, the number feels heavy and could overwhelm an agent, especially when many tools are for metadata exploration that might be consolidated.
The surface covers all major Looker workflows: CRUD for dashboards and looks, query execution, exploring models/explores, database metadata, health checks, and content validation. Minor gaps like missing update/delete for dashboard elements and lack of user management are acceptable given the server's focus.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Let AI agents query data and act across all your business apps via MCP.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
The BigQuery remote MCP server is a fully managed service that uses the Model Context Protocol to connect AI applications and LLMs to BigQuery data sources. It provides secure, standardized tools for AI agents to list datasets and tables, retrieve schemas, generate and execute SQL queries through natural language, and analyze data—enabling direct access to enterprise analytics data without requiring manual SQL coding.
Connect MCP clients to 2,000+ AI models without managing provider API keys.
Related MCP Servers
- AlicenseBqualityNot gradedmaintenanceEnables AI assistants to interact with and manage Google Cloud Platform resources including Artifact Registry, BigQuery, Cloud Build, Compute Engine, Cloud Run, Cloud Storage, and monitoring services through a standardized MCP interface.1-
- AlicenseDqualityFmaintenanceEnables AI assistants to query and segment event data from Amplitude Analytics via the MCP protocol.2279MIT
- AlicenseBqualityDmaintenanceEnables LLM applications to query Google Analytics 4 data through standard MCP interfaces, supporting real-time data, custom reports, and metadata discovery.5371MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to query live schema, lineage, and query-context across data warehouses, dbt projects, orchestration systems, and BI tools via MCP tools.Apache 2.0