Skip to main content
Glama

looker-mcp-server

PyPI - Version PyPI - Python Version License CI Ruff

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 --groups

  • Pluggable identity — swap in custom authentication via the IdentityProvider protocol

  • Health endpoints/healthz and /readyz for container orchestration

Related MCP server: Amplitude MCP Server

Quick Start

Installation

pip install looker-mcp-server
# or
uv add looker-mcp-server

Environment 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,schema

Run with HTTP (for production deployment)

LOOKER_TRANSPORT=streamable-http looker-mcp-server --groups all --port 8080

MCP 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*

list_models, get_model, get_explore, list_dimensions, list_measures, list_connections

Browse LookML models, explores, and fields

query*

query, query_sql, run_query, run_look, run_dashboard, query_url, search_content

Run queries through the semantic layer

schema*

list_databases, list_schemas, list_tables, list_columns

Inspect underlying database schema

content*

list_looks, create_look, update_look, delete_look, list_dashboards, list_lookml_dashboards, create_dashboard, update_dashboard, delete_dashboard, add_dashboard_element, add_dashboard_filter, generate_embed_url, validate_content

Manage Looks and dashboards

board

list_boards, get_board, create_board, update_board, delete_board, get_board_section, create_board_section, update_board_section, delete_board_section, get_board_item, create_board_item, update_board_item, delete_board_item

Curate content with boards, sections, and items

folder

list_folders, get_folder, create_folder, update_folder, delete_folder, get_folder_children, get_folder_ancestors, get_folder_looks, get_folder_dashboards

Navigate and manage the folder hierarchy

health*

health_pulse, health_analyze, health_vacuum

Instance health checks and usage analysis

modeling

list_projects, get_project, create_project, update_project, delete_project, get_project_manifest, get_project_deploy_key, create_project_deploy_key, list_project_files, get_file, create_file, update_file, delete_file, validate_project, list_datagroups, get_datagroup, reset_datagroup, trigger_datagroup, start_pdt_build, check_pdt_build, stop_pdt_build, graph_derived_tables_for_view, graph_derived_tables_for_model

LookML project lifecycle, file edits, syntax validation, datagroup cache + trigger management, and PDT build administration

git

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, get_git_deploy_key, create_git_deploy_key, list_git_connection_tests, run_git_connection_test

Git branch lifecycle, production deploy, SSH deploy-key rotation, and git-connection diagnostics

admin

list_users, get_user, create_user, update_user, delete_user, create_credentials_email, send_password_reset, list_roles, get_role, create_role, update_role, delete_role, get_role_groups, get_role_users, list_permissions, list_permission_sets, create_permission_set, update_permission_set, delete_permission_set, list_model_sets, create_model_set, update_model_set, delete_model_set, list_groups, create_group, delete_group, add_group_user, remove_group_user, set_role_groups, set_role_users, set_user_roles, get_user_roles, list_schedules, create_schedule, update_schedule, delete_schedule, run_schedule_once

User, role, RBAC, group, and schedule management

connection

get_connection, list_connection_dialects, create_connection, update_connection, delete_connection, test_connection

Database connection CRUD and health checks

user_attributes

list_user_attributes, get_user_attribute, create_user_attribute, update_user_attribute, delete_user_attribute, list_user_attribute_group_values, set_user_attribute_group_values, delete_user_attribute_group_value, list_user_attribute_values_for_user, set_user_attribute_user_value, delete_user_attribute_user_value

User attribute definitions plus per-group and per-user value overrides (row-level security, per-developer credentials, filter defaults)

credentials

list_credentials_api3, create_credentials_api3, get_credentials_api3, delete_credentials_api3, get_credentials_ldap, delete_credentials_ldap, get_credentials_saml, delete_credentials_saml, get_credentials_oidc, delete_credentials_oidc, get_credentials_google, delete_credentials_google

Non-email credentials — API3 key-pair rotation plus get/delete for LDAP, SAML, OIDC, and Google SSO links

audit

get_query_history, get_content_usage, get_pdt_build_log, get_schedule_history, get_user_activity_log, list_running_queries, kill_query, list_active_sessions, get_session, terminate_session, list_project_ci_runs, get_project_ci_run, trigger_project_ci_run

Query history, content usage, PDT build + schedule + event logs via system__activity, plus live-ops (running queries, sessions, CI runs)

workflows

provision_connection, bootstrap_lookml_project, deploy_lookml_changes, rollback_to_production, provision_user, grant_access, offboard_user, rotate_api_credentials, audit_query_activity, audit_instance_health, investigate_runaway_queries, find_stale_content, disable_stale_sessions

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 all

Configuration Reference

All settings are configured via environment variables with the LOOKER_ prefix, or via a .env file.

Variable

Default

Description

LOOKER_BASE_URL

(required)

Base URL of the Looker instance

LOOKER_CLIENT_ID

API3 client ID for service account

LOOKER_CLIENT_SECRET

API3 client secret for service account

LOOKER_API_VERSION

4.0

Looker API version

LOOKER_DEPLOYMENT_TYPE

self_hosted

self_hosted or google_cloud_core

LOOKER_TRANSPORT

stdio

stdio or streamable-http

LOOKER_HOST

0.0.0.0

HTTP bind address

LOOKER_PORT

8080

HTTP port

LOOKER_SUDO_AS_USER

true

Enable user impersonation when identity headers are present

LOOKER_SUDO_ASSOCIATIVE

false

Attribute sudo activity to admin (true) or impersonated user (false)

LOOKER_USER_EMAIL_HEADER

X-User-Email

HTTP header carrying user email for sudo impersonation

LOOKER_USER_TOKEN_HEADER

X-User-Token

HTTP header carrying pre-exchanged OAuth token

LOOKER_TIMEOUT

60.0

HTTP request timeout in seconds

LOOKER_MAX_ROWS

5000

Default maximum rows for query tools

LOOKER_VERIFY_SSL

true

Verify TLS certificates

LOOKER_LOG_LEVEL

INFO

Logging level

LOOKER_MCP_MODE

dev

dev (permissive), public (OAuth 2.1 resource-server, MCP 2025-11-25), or looker_oauth (Looker-as-authorization-server, opaque per-user tokens). See MCP-Level Authentication.

LOOKER_MCP_JWKS_URI

Authorization server JWK Set URL (RFC 7517). Required when LOOKER_MCP_MODE=public. Must be an https:// URL.

LOOKER_MCP_ISSUER_URL

Expected iss claim (RFC 8414). Required when LOOKER_MCP_MODE=public. Must be an https:// URL.

LOOKER_MCP_RESOURCE_URI

This server's canonical URI for RFC 8707 audience binding and the RFC 9728 PRM resource field. Required when LOOKER_MCP_MODE=public or looker_oauth (in looker_oauth it is this MCP server's own public URI — the host of the resource_metadata PRM URL — and has no default, since it must not point at Looker's host). Must be an https:// URL without fragment.

LOOKER_OAUTH_SCOPES_SUPPORTED

cors_api

Comma-separated OAuth scopes advertised in the looker_oauth-mode PRM scopes_supported (RFC 9728 §2). Looker's CORS-API PKCE flow accepts exactly cors_api, so the default is correct for every Looker instance; the override exists for field serviceability only. Must contain at least one non-empty scope — the server fails closed at startup on a blank value.

LOOKER_MCP_AUTH_TOKEN

Static bearer token for MCP-level authentication. Deprecated — emits a warning in dev mode, rejected outright in public mode (RFC 9068 §2.1 forbids symmetric static bearers for OAuth 2.1 access tokens). Scheduled for removal in a future major release; migrate to LOOKER_MCP_MODE=public.

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=false

Mode 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=true

When a request arrives with X-User-Email: alice@company.com, the server:

  1. Logs in with admin credentials

  2. Looks up Alice's Looker user ID by email

  3. Creates a sudo session as Alice via login_user

  4. Executes the tool call as Alice

  5. Logs out both sessions

Note: On Looker (Google Cloud core), login_user only 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=true

When 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-Email header)

  • Google Cloud core → OAuth (via X-User-Token header)

  • 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_user is 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=false and act_as_user is 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 as Permission 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:

  1. Save the user's currently-checked-out branch on the project.

  2. PUT the target branch.

  3. Run the query.

  4. 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=True only 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

switch_git_branch, create_git_branch, delete_git_branch, reset_to_production (default dev_mode=True)

get_git_branch, list_git_branches, get_git_branch_by_name, deploy_to_production (read prod git state)

query

query, query_sql, query_url, run_query, run_look (default dev_mode=False; opt in via branch= or dev_mode=True)

run_dashboard, search_content (production content)

modeling — file ops

list_project_files, get_file (default dev_mode=True), create_file, update_file, delete_file (always dev — Looker rejects writes to production)

modeling — validation

validate_project (default dev_mode=False; opt in via branch= for PR validation)

modeling — data tests

list_lookml_tests, run_lookml_tests (default dev_mode=False; opt in via branch= for PR data-regression checks)

modeling — project metadata

list_projects, get_project, get_project_manifest, list_datagroups, reset_datagroup (workspace-agnostic project state)

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 invoked

  • tool_group — which group the tool belongs to

  • arguments — 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:

  1. No MCP-level auth (default) — any client that can reach the transport can connect.

  2. Static bearer token (deprecated) — set LOOKER_MCP_AUTH_TOKEN and clients must present it. Emits a DeprecationWarning at 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 to LOOKER_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 RS256 and ES256 signatures (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) and aud (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-resource when LOOKER_MCP_RESOURCE_URI is 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-Authenticate challenges 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 400 invalid_request per 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_TOKEN outright — if the static bearer env var is set alongside LOOKER_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 /user introspection endpoint — the request is accepted iff Looker returns a valid user, and rejected (401 invalid_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 public mode: 400 on URL-query bearers (OAuth 2.1 §5.1.1), realm-bearing WWW-Authenticate challenges on 401, anonymous /.well-known/* + /healthz + /readyz + /_introspect.

  • Rejects LOOKER_MCP_AUTH_TOKEN outright — 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-http

LOOKER_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 dev mode (warning emitted), rejected in public mode (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 when LOOKER_MCP_MODE=public or LOOKER_MCP_MODE=looker_oauth). In public mode it advertises the configured LOOKER_MCP_ISSUER_URL as the authorization server; in looker_oauth mode 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 by resource_metadata=... in 401 WWW-Authenticate challenges.

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    # tests

See CONTRIBUTING.md for contribution guidelines.

License

Apache License 2.0

Available Tools

33 tools
add_dashboard_elementA

Add a visualization tile to a dashboard. Requires a query definition (model, view, fields) or a saved Look ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
dashboard_idYesID of the dashboard
titleYesTitle for the tile
typeNoElement type: 'vis' (visualization), 'text', 'filter'vis
look_idNoID of a saved Look to embed
query_modelNoLookML model for an inline query
query_viewNoExplore/view for an inline query
query_fieldsNoFields for an inline query

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dashboard_idYesID of the dashboard
titleYesFilter display title
dimensionYesFully-qualified dimension name (e.g. 'orders.region')
typeNoFilter type: 'field_filter', 'date_filter'field_filter
default_valueNoDefault filter value

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTitle for the new dashboard
folder_idYesFolder ID to save the dashboard in
descriptionNoDescription

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTitle for the new Look
modelYesLookML model name
viewYesExplore/view name
fieldsYesFields to include in the query
folder_idYesFolder ID to save the Look in
filtersNoQuery filters
sortsNoSort expressions
limitNoRow limit for the query
descriptionNoDescription of the Look

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dashboard_idYesID of the dashboard to delete

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
look_idYesID of the Look to delete

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
target_urlYesLooker content URL path (e.g. '/dashboards/123')
session_lengthNoSession duration in seconds
force_logout_loginNoForce new login session

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_nameYesName of the LookML model
explore_nameYesName of the explore within the model

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_nameYesName of the LookML model

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
analysis_typeNoType of analysis: 'models' (model/explore usage), 'content' (look/dashboard usage)models

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoWhat to scan: 'explores' (unused explores), 'content' (zero-view Looks/dashboards)explores

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYesName of the Looker database connection
databaseNoDatabase name
schema_nameNoSchema name
table_nameNoTable name to get columns for

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoFilter by title (partial match)
folder_idNoFilter by folder ID
limitNoMaximum results

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYesName of the Looker database connection

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
model_nameYesName of the LookML model
explore_nameYesName of the explore

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoFilter by title (partial match)
folder_idNoFilter by folder ID
limitNoMaximum results

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
model_nameYesName of the LookML model
explore_nameYesName of the explore

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYesName of the Looker database connection
databaseNoDatabase name (required for multi-database connections)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
connection_nameYesName of the Looker database connection
databaseNoDatabase name
schema_nameNoSchema name to filter tables

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesLookML model name (e.g. 'ecommerce')
viewYesExplore/view name within the model (e.g. 'orders')
fieldsYesFields to select — use fully-qualified names (e.g. ['orders.region', 'orders.total_revenue'])
filtersNoFilter expressions as field:value pairs (e.g. {'orders.created_date': '90 days'})
sortsNoSort expressions (e.g. ['orders.total_revenue desc'])
limitNoMaximum rows to return
result_formatNoOutput format: 'json' (default), 'json_detail', 'csv', 'txt'json
dev_modeNoRun 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.
branchNoProject 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_idNoLookML project ID — required when ``branch`` is set so the MCP knows which project's branch state to swap.
act_as_userNoOptional 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesLookML model name
viewYesExplore/view name
fieldsYesFields to select
filtersNoFilter expressions
sortsNoSort expressions
limitNoMaximum rows
dev_modeNoCompile the SQL against the dev workspace's LookML rather than production. Implied when ``branch`` is set.
branchNoProject branch to atomically swap to for this call (saved branch restored on exit). Requires project_id.
project_idNoLookML project ID — required with ``branch``
act_as_userNoOptional 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesLookML model name
viewYesExplore/view name
fieldsYesFields to select
filtersNoFilter expressions
sortsNoSort expressions
dev_modeNoGenerate the URL against dev-workspace LookML. Implied when ``branch`` is set.
branchNoProject branch to atomically swap to for this call. Requires project_id.
project_idNoLookML project ID — required with ``branch``
act_as_userNoOptional 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dashboard_idYesID of the dashboard

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
look_idYesID of the saved Look
result_formatNoOutput format: 'json', 'csv', 'txt'json
limitNoMaximum rows to return
dev_modeNoResolve the Look's model+explore against the dev workspace's LookML rather than production. Implied when ``branch`` is set.
branchNoProject branch to atomically swap to for this call (saved branch restored on exit). Requires project_id.
project_idNoLookML project ID owning the Look's model — required with ``branch``
act_as_userNoOptional 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
query_idYesID of the saved Query
result_formatNoOutput format: 'json' (default), 'json_detail', 'csv', 'txt'json
limitNoRow limit override. Omit to use the limit baked into the saved Query.
apply_formattingNoRender values per LookML/Look formatting (currency symbols, date formats, etc.). Default false matches Looker's API default.
apply_visNoApply visualization-config-driven rendering to the result. Default false matches Looker's API default.
server_table_calcsNoCompute 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.
cacheNoAllow Looker to serve cached results. Set false to force a fresh run. Default true matches Looker's API default.
dev_modeNoResolve the Query against the dev workspace's LookML rather than production. Implied when ``branch`` is set.
branchNoProject branch to atomically swap to for this call (saved branch restored on exit). Requires project_id.
project_idNoLookML project ID owning the Query's model — required with ``branch``
act_as_userNoOptional 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
query_stringYesSearch query (full-text search)
typesNoContent types to search: 'dashboard', 'look', 'folder', etc.
limitNoMaximum results to return

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dashboard_idYesID of the dashboard to update
titleNoNew title
descriptionNoNew description
folder_idNoMove to a different folder

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
look_idYesID of the Look to update
titleNoNew title
descriptionNoNew description
folder_idNoMove to a different folder

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 33 tool updatesv0.20.0
    • First observedadd_dashboard_element
    • First observedadd_dashboard_filter
    • First observedcreate_dashboard
    • First observedcreate_look
    • First observeddelete_dashboard
    • First observeddelete_look
    • First observedgenerate_embed_url
    • First observedget_explore
    • First observedget_model
    • First observedhealth_analyze
    • First observedhealth_pulse
    • First observedhealth_vacuum
    • First observedlist_columns
    • First observedlist_connections
    • First observedlist_dashboards
    • First observedlist_databases
    • First observedlist_dimensions
    • First observedlist_looks
    • First observedlist_measures
    • First observedlist_models
    • First observedlist_schemas
    • First observedlist_tables
    • First observedquery
    • First observedquery_sql
    • First observedquery_url
    • First observedrun_dashboard
    • First observedrun_look
    • First observedrun_query
    • First observedsearch_content
    • First observedupdate_dashboard
    • First observedupdate_look
    • First observedvalidate_content
    • First observedwhoami

TDQS

A3.5/5.0

Scored across 33 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessUnresponsive

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

Related MCP Servers