looker-studio-mcp
This server exposes read-only BigQuery and Looker Studio inspection plus a report-link builder; no write/edit tools are available in this schema.
Check BigQuery credentials and Looker Studio browser sign-in.
List BigQuery datasets, tables, and views; describe table/view fields, row counts, and view SQL.
Run single read-only GoogleSQL
SELECT/WITHqueries, optionally dry-run to estimate bytes scanned and cap returned rows.List Looker Studio reports (filter by name) and list report pages.
Screenshot a report page in view mode for visual checking.
List page components (charts, text, shapes) with layout details and describe a component's Setup/Style settings.
Build a Looker Studio Linking API URL to create a report from BigQuery tables or a template.
Cannot create, edit, delete, or share reports/components/data sources here because write tools are not included.
Enables building and managing Looker Studio dashboards on top of BigQuery, including creating reports, adding charts, text boxes, and shapes, updating components and themes, managing pages, sharing/deleting reports, and capturing screenshots of report pages.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@looker-studio-mcpBuild a dark dashboard for campusfind_analytics.bq_feature_usage with KPI cards and charts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
looker-studio-mcp
MCP server that lets an AI assistant build Looker Studio (formerly Data Studio) dashboards on top of BigQuery: explore datasets, run read-only queries, create views, and design reports — charts, text, shapes, themes, exact layouts — then check the result with a screenshot.
Looker Studio has no public API to edit reports, so the report tools drive the real Looker Studio editor in a dedicated, signed-in Chrome profile (Playwright). BigQuery goes through its REST API.
"Build a dark dashboard for analytics.events:
a header band, three KPI cards, uses per feature as bars, the share as a donut
and a table at the bottom."Quick start
npm install && npm run build
npx playwright install chromium # Playwright's driver; reports run on your Google Chrome
node build/cli/main.js init --project my-gcp-project --enable-writes
node build/cli/main.js login # sign in to Google once, then quit Chrome (⌘Q)
gcloud auth application-default login # or --credentials-file for a service account
node build/cli/main.js auth # checks bothRegister it with your MCP client (Claude Code shown):
claude mcp add looker-studio -- node /path/to/looker-studio-mcp/build/cli/main.js serve --enable-writesRelated MCP server: BigQuery MCP Server
Table of contents
Authentication
Two independent credentials:
For | How | Check |
BigQuery (datasets, queries, views) | Application Default Credentials, or |
|
Looker Studio reports | A Chrome profile at |
|
login opens your regular Google Chrome (not an automated one: Google refuses sign-in in automated browsers). Sign in, open Looker Studio once, then quit Chrome completely with ⌘Q so the session is written to disk. Every later run reuses that profile; the server never sees your password.
Configuration
~/.looker-studio-mcp/config.yaml (written by init):
project_id: my-gcp-project # default project for BigQuery tools
location: US # BigQuery location
auth:
credentials: adc # adc | file
credentials_file: null
browser_profile_dir: ~/.looker-studio-mcp/browser-profile
browser_channel: chrome # chrome | chromium | msedge
headless: true # false (or serve --headed) to watch the editor
writes:
enabled: false
dry_run: false # true: write tools only describe what they would do
query:
max_rows: 500
max_bytes_billed: 1000000000 # 1 GB per query
ui:
step_timeout_ms: 30000
logging:
level: infoEnvironment overrides: LOOKER_STUDIO_MCP_PROJECT, LOOKER_STUDIO_MCP_CREDENTIALS_FILE, LOOKER_STUDIO_MCP_HEADLESS. CLI flags override both.
Write operations
Write tools are registered only when both writes.enabled: true is in the config and serve --enable-writes is passed. Every write is appended to ~/.looker-studio-mcp/audit.ndjson. With writes.dry_run: true they only describe the change.
delete_report also needs confirm_name to match the report's name. run_query refuses anything but a single SELECT/WITH, and every query is capped by max_bytes_billed.
Available tools
Read tools (always available)
Tool | What it does |
| Checks the BigQuery credentials and the signed-in browser profile |
| Explore BigQuery (fields, row counts, view SQL) |
| One read-only query, rows as a table; |
| Your Looker Studio reports, filterable by name |
| Pages of a report |
| Charts, texts and shapes of a page: index, kind, layout |
| Every Setup/Style setting of a component with its exact label and value |
| PNG of a page in view mode, returned as an image |
| A Linking API URL that creates a report from BigQuery tables, custom queries or Google Sheets |
| Every chart of a report (or a page) that shows "No data", a configuration error, a data set error (Too Many Rows, BigQuery errors) or is still loading, with page, index, kind, fields and Looker's details (docs) |
| Data sources of a report: name, alias (ds0…), table or custom query SQL, charts using it, data credentials, data freshness; |
| Read a report into a JSON spec (theme, data sources, pages, components with fields and main style) that |
| The report's email delivery schedule (recipients, pages, start, repeat with weekdays, time, time zone, Filters tab values), if any |
| File › Version history: index, name or date, and authors of each version, newest first |
Write tools (require writes)
Tool | What it does |
| BigQuery views (dry-run validated first) |
| New report connected to a BigQuery table, view or custom query ( |
| Connect another BigQuery table, view or custom query ( |
| Re-read a data source's fields after a column was added to the table or view |
| All 49 chart presets: tables (with bars/heatmap), scorecards (compact, with dimension, sparkline), time series, bars (stacked, 100%), histogram, pie, donut, line, area, combo, pivot tables (with bars/heatmap), funnel, waterfall, sankey, bullet, gauge, treemap, scatter, bubble, boxplot, candlestick, timeline, geo and Google Maps — with dimensions, metrics (aggregation, display name), breakdown, sorts (Sort #2…), extra Setup slots, filters (AND/OR), default date range (preset or fixed dates), comparison period, combo series, value colors, reference lines and bands, conditional formatting, title, layout and Style settings |
| Drop-down, fixed-size list, input box, advanced filter, slider, checkbox, preset filter, date range, data control, dimension control, button (link to a URL or page, or a report action) |
| Logo or header art from a local file or https URL |
| A formula field on a data source (ratios, CASE groupings, date parts) |
| Text box: size, color, bold, alignment, background |
| Rectangle, circle, triangle, heart, diamond, pentagon, star, hexagon, octagon, cylinder, block arrows, callout: fill, border, radius |
| Straight line between two points: color, dash style, arrow heads |
| URL embed (a page that allows being embedded) |
| Move/resize, switch the chart type, Style/Setup settings, Setup slots, filters, sorts, reference lines/bands, conditional formatting, date range, comparison, series, value colors, rename fields, restack (front/back), make report-level, button action, embed URL |
| Copy a component with its settings and place the copy |
| Align, distribute evenly, group or ungroup components |
| Remove a component |
| Filters, default date range, date range dimension and data source of a whole page or of the whole report; page background and size |
| Edit (rename, replace clauses), duplicate or delete a filter of the report |
| Parameters (with permitted values and default), group fields (named buckets) and bin fields (numeric ranges) |
| Blend 2 to 5 data sources with left/right/inner/full/cross joins |
| Built-in theme, custom theme settings, page size, Layout settings (tab navigation, header) |
| Invite several people at once as viewers or editors; existing access is changed in place |
| Report management; |
| Community visualization from the gallery by name ("Gauge", "Sunburst Chart"…) or your own by |
| Remove a data source by name or alias; refuses while charts use it unless |
| Rename a data source, replace a custom query's SQL, set data credentials ( |
| Change a data source field's type (Number, Text, Date…), default aggregation and/or name |
| Run a list of editing actions (any of the tools above, same arguments) in one editor visit: validated first, a result per action |
| Build a report from a JSON spec, or add the missing pages and components to an existing one, in one visit |
| File › Make a copy under a new name; |
| Link settings: restricted, unlisted (anyone with the link) or public, with the link's role (viewer/editor) |
| Email the report on a schedule: recipients, start date, time, time zone, repeat (daily, weekly, monthly, weekdays, custom every N days, weeks on chosen weekdays, or months on the day or weekday), pages, and the Filters tab (filter control values, date range controls); or delete the schedule |
| Restore a version by its index or label from |
| File › Embed report: turns embedding on if needed and returns the iframe code and embed URL (width, height, page, navigation) |
Settings are addressed by the label the properties panel shows ("Bar color", "Show data labels", "Border radius"…). describe_component lists them; settings that do not exist come back as warnings instead of failing silently.
Custom queries
create_report, add_data_source and build_report_link take sql instead of dataset_id and table_id; project_id is then the billing project and source_name names the data source. The SQL is dry-run in BigQuery first: a query BigQuery rejects comes back with BigQuery's message and the browser never opens. date_range_params and viewer_email_param pass @DS_START_DATE/@DS_END_DATE and @DS_USER_EMAIL to the query (not through the Linking API). The data source then works like any other. See docs/custom-queries.md for naming, field types, validation and cost.
Other connectors
create_report, add_data_source and build_report_link take connector (default bigquery, so existing calls are unchanged):
google_sheets:spreadsheet(URL or id),worksheet(tab name) orworksheet_id(its gid),use_first_row_as_headers,include_hidden_and_filtered_cells,range.postgresql,mysql:host,port,database,user,password,ssl, andtable_idorsql. Not available inbuild_report_link(the Linking API has no such connector).
Passwords are redacted from the audit log and never appear in replies. See docs/connectors.md.
Batches and report specs
Each editing tool opens the report, does its work and closes it. apply_actions runs many of them in one editor visit, several times faster: {"report_id": "…", "actions": [{"tool": "add_text", "args": {"text": "Title"}}, …]}. export_report_spec and apply_report_spec read a report into JSON and build one from it (copies, templates, dashboards written by hand). See docs/report-spec.md.
Designing dashboards
See docs/design-guide.md for the canvas grid, the card pattern, color and type choices, and a full worked example. The short version:
set_themefirst (e.g.Constellation+"Report background color": "#0B1020").Shapes for structure (header band), then charts, each with
layouton a 20 px grid.Card look on charts and scorecards:
{"Background": "#151B33", "Border color": "#151B33", "Border radius": 16}.Human labels: metric
labelinadd_chart,labelsinupdate_component.screenshot_reportafter each section; fix withupdate_component.
CLI reference
Command | Purpose |
| Start the MCP server on stdio (default command) |
| Sign in to Google in the MCP browser profile |
| Check BigQuery credentials and the browser sign-in |
| Write the config without prompts |
Limits
Report tools depend on the Looker Studio editor UI. Selectors are kept in one file (
src/contexts/reports/infrastructure/ui/selectors.ts) and the editor is opened in English (hl=en) regardless of the account language, but a Looker Studio redesign can break them.One editor action per page visit: each tool call takes a few seconds.
Time series need a date or date-time dimension with a sensible granularity; a raw timestamp gives "Too many rows". Add a
DATE(...)column in a view.Field chips are matched by their display name, so rename fields (
labels) after the setup that refers to them.add_pageappends after the last page.manage_filteredit rewrites every clause of the filter; charts that use it keep it.Filter values are typed as free text (the editor's value suggestions are turned off), so a value that is not in the data is accepted: check the spelling. "In" takes its values comma separated.
Custom queries: always pass
source_nameand cast columns whose type Looker Studio may guess wrong. The automatic dry run catches unknown columns and syntax errors, not errors that only happen when the query runs (details).PostgreSQL and MySQL were written against the live connector form, but not run end to end against a database: the table list and custom query step after AUTHENTICATE are untested (details).
build_report_linkcannot enable date range or viewer email parameters: the Linking API has no parameter for them.check_reportopens the editor, so it needs edit access, and reads the English messages of Looker Studio.Community visualizations define their own Setup slots and Style settings: use
describe_componentto read them.add_community_vizaccepts the gallery's consent prompt for you.share_reportopens a visible Chrome window for a few seconds: Google refuses invitations sent from a headless browser. It sends one invitation per address, since a batch fails with "An unknown error occurred".set_link_sharing,schedule_deliveryandremove_deliveryalso open a visible window: Google refuses link changes and schedules from a headless browser.copy_reportcopies only the data sources a component uses (an unused one is dropped, and a report with no chart loses its data). Any of them can be swapped for a reusable data source of the account (reusable); only embedded ones can be reconnected to a new table or query, since a reusable one is shared with other reports. To swap in a source that is still embedded somewhere, make it reusable first (update_data_sourcewithmake_reusable: true); reusable data sources live in the account's Data sources list until deleted there. Looker Studio names the copy in the account language; the tool renames it.schedule_delivery: one schedule per report and account, and the signed-in account is always a recipient (its chip cannot be removed). The dialog has no subject or message. Times are half-hour slots. The time zone is not a field of the dialog: a new schedule takes the browser's, and keeps it.time_zoneopens the window in that zone and recreates an existing schedule (options not passed go back to their defaults); Looker Studio shows its own name for the zone, chosen by the current offset (America/Bogota is saved as "Eastern Time - Indianapolis", which observes daylight saving time). Weekly and monthly repeat on the weekday of the start date; custom repeats takeweekdaysfor weeks andmonthly_onfor months.filtersset the Filters tab: the report's filter controls by page (drop-downs and lists by value, input boxes, date range controls); a single-select control on a field with one value cannot hold it.list_deliveriesshows the schedule of one report: Looker Studio has no list of every schedule.list_versions: the current version is the live draft, so edits within a few minutes are grouped into it; indexes shift after every save, so calllist_versionsright beforerestore_version.get_embed_codereturns the URL on the host the account uses (some accounts still getdatastudio.google.com). "Public" link sharing can be turned off by a Google Workspace admin; the tool then fails with that message.
Architecture
DDD with bounded contexts:
src/contexts/authentication Google token provider, browser session (Playwright profile)
src/contexts/google-api Authenticated REST client with retries
src/contexts/bigquery Datasets, tables, read-only queries, views
src/contexts/reports Report model + use cases; UI adapter driving the editor
src/mcp Tool schemas, handlers, registry (writes gated)
src/shared-kernel Config, logging, audit, errors, writes gate
src/cli serve, login, auth, initDependency rules are enforced by npm run check:deps. See AGENTS.md.
License
MIT
Available Tools
11 toolsbuild_report_linkBuild a report linkARead-only
Build a Looker Studio Linking API URL that creates a report (blank or copied from a template) connected to BigQuery tables. The user opens it to confirm.
| Name | Required | Description | Default |
|---|---|---|---|
| sources | Yes | ||
| report_name | Yes | ||
| template_report_id | No | Report to copy; blank report when omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds a meaningful trait beyond that: the tool only builds a URL and the actual report creation happens when the user opens it to confirm, which explains the read-only nature. It still omits auth requirements and error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action and the return artifact front-loaded; every clause carries information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return value (a Linking API URL) and the follow-up step (user opens it to confirm), which an agent needs before calling. It is slightly thin on the relationship between sources and template placeholders, but overall adequate for this three-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the schema does not fully carry the load. The description maps "blank or copied from a template" to template_report_id and "connected to BigQuery tables" to sources, but restates what the schema already says and adds nothing about report_name or how sources entries pair with template aliases.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource: builds a Looker Studio Linking API URL that creates a report connected to BigQuery tables. It clearly distinguishes itself from siblings like list_reports, screenshot_report, or run_query, which do not construct a report-creation URL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"The user opens it to confirm" gives workflow context that this produces a link rather than performing the creation, which is useful. However, there is no explicit when-to-use versus when-not statement, no mention of prerequisites (auth, config), and no routing to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_authCheck authenticationARead-only
Check the Google API credentials (BigQuery) and the signed-in Looker Studio browser profile. Use first when other tools fail with auth errors.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds useful context beyond that: it discloses that two distinct credential surfaces are validated (BigQuery API credentials and the Looker Studio browser session), which is the key thing an agent needs to interpret a failure. It does not describe the result shape, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the most actionable information (the "use first on auth errors" trigger) is placed at the end as a clear directive. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining what the check returns (e.g., which surface passed or failed, or how to interpret a partial failure). It says what is checked but not what the agent will get back, which is a real gap for a diagnostic tool with no structured output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline this dimension starts at 4. There is nothing for the description to clarify beyond what the empty schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Check") and names the two concrete resources it validates: the Google API credentials (BigQuery) and the signed-in Looker Studio browser profile. This clearly separates it from the data-oriented siblings (run_query, list_reports, etc.), though it doesn't name any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use first when other tools fail with auth errors" gives an explicit trigger condition that tells the agent exactly when to reach for this tool over retrying a failing sibling. It lacks a when-not clause, but the positive routing rule is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_componentDescribe a componentARead-only
Show every Setup and Style setting of one component with its exact label and current value. Use it to learn the labels update_component and the style options accept.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page; defaults to the first page | |
| index | Yes | Component index, as list_components shows it | |
| report_id | Yes | Report id or any URL of the report |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds useful behavioral context beyond that: it promises fidelity of the returned labels/values and ties the tool to a downstream workflow (update_component), which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no waste; the primary action is front-loaded and the secondary usage hint follows. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description partially compensates by stating what is returned (exact labels and current values), and pagination is covered by the schema's page parameter. It is nearly complete, though it says nothing about how component identity/indexing interacts with pagination across pages.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (page, index, report_id) is documented in the schema itself. The description adds no syntax, format, or defaulting detail for these parameters, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Show every Setup and Style setting of one component') plus scope ('exact label and current value'), which separates it from the sibling list_components. It does not explicitly contrast with siblings like describe_table or list_components, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear reason to call it: to learn the labels that update_component and the style options accept, i.e. read-before-write reconnaissance. No when-not guidance or explicit alternative routing is offered, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_tableDescribe a table or viewARead-only
Show the fields of a table or view, its row count and, for views, the SQL.
| Name | Required | Description | Default |
|---|---|---|---|
| table_id | Yes | Table or view id | |
| dataset_id | Yes | BigQuery dataset id, e.g. campusfind_analytics | |
| project_id | No | Google Cloud project id. Defaults to project_id in the config. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. Because no output schema exists, the description's disclosure of what is returned (field list, row count, and view SQL for views) carries real behavioral weight that the structured fields do not provide. It still omits error behavior (e.g. unknown table) and whether the row count is metadata-derived or a scan.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that states the resource first and then the returned artifacts, with no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only metadata lookup with no output schema, the description covers the essential return shape (fields, row count, view SQL) and the schema covers all inputs. Only edge-case behavior (missing table, permission failures) is absent, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each of table_id, dataset_id, and project_id documented in the schema (including the config default for project_id). The description adds no parameter-level detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Show') and resource (fields of a table or view), plus the extra returns of row count and view SQL, which clearly separates it from siblings like list_tables (enumeration) and run_query (execution). It never explicitly names a sibling, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as run_query or list_tables, and no prerequisites (e.g. that the dataset/table must already exist, or that this is the inspection step before querying). Usage is only inferable from the tool name and the described output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_componentsList page componentsARead-only
List the charts, texts and shapes of a report page with their index, kind and layout (x, y, width, height in px). Indexes go back to front; other component tools take them.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page; defaults to the first page | |
| report_id | Yes | Report id or any URL of the report |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful semantics beyond that—index ordering is back-to-front and the indexes are the shared key for other component tools—but says nothing about empty pages, pagination, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The payload content and field list come first, and the index-order/interop note is placed last as a supporting detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming the fields returned (index, kind, layout with units in px). It is nearly complete for a simple read tool; only edge-case behavior (empty page, ordering guarantees beyond back-to-front) is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (report_id, page) are already documented in the schema, including the 1-based/default-first-page semantics. The description adds no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (List) and resource (charts, texts and shapes of a report page) and enumerates the returned fields (index, kind, layout x/y/width/height). The phrase 'other component tools take them' also sets it apart from describe_component, which consumes rather than produces indexes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the mention that other component tools consume these indexes hints at the workflow, but there is no explicit when-to-use/when-not guidance and no sibling is named as an alternative (e.g. vs list_report_pages). Adequate context, but the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datasetsList BigQuery datasetsCRead-only
List the BigQuery datasets of a Google Cloud project.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | Google Cloud project id. Defaults to project_id in the config. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered by structured data. The description adds nothing beyond that: no pagination behavior, no result caps, no ordering, and no note about what happens when project_id is omitted (the default is only stated in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is efficient, though arguably terse to the point of leaving useful context unsaid.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with full schema coverage and annotations covering the safety profile, the description is minimally viable. With no output schema, it would help to say what is returned (dataset IDs/names) or whether results are paginated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single project_id parameter is fully documented in the schema, so baseline 3 applies. The description adds no extra meaning about the parameter, such as format expectations or behavior when the default is used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource ('List the BigQuery datasets') with an explicit scope ('of a Google Cloud project'), which is more than a restatement of the name. However, it offers no differentiation from the sibling list_tables, which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as list_tables or run_query. Usage is only implied by the verb 'List'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_report_pagesList report pagesCRead-only
List the pages of a Looker Studio report.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | Yes | Report id or any URL of the report |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that: no pagination behavior, no note on what happens with an invalid report_id, no indication of who may read a report. It essentially restates the title.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with zero filler and the key resource front-loaded. It is efficient, though its brevity edges into under-specification rather than tight writing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation with a single fully-described parameter, the description covers the essentials. Because there is no output schema, an agent still lacks any hint about the shape or size of the returned page list, and there is no mention of pagination, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter is fully documented in the schema itself ('Report id or any URL of the report'), and schema coverage is 100%, so the baseline is 3. The description contributes no additional parameter meaning, such as accepted URL formats or whether IDs are scoped to a workspace.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb+resource ('List the pages of a Looker Studio report'), so it is unambiguous about what it returns. It does not, however, differentiate itself from siblings like list_reports or list_components, which also enumerate report-related entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus list_reports, list_components, or describe_component, nor any stated prerequisite (e.g. that a report_id must first be obtained). The only implied usage comes from the required parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reportsList Looker Studio reportsBRead-only
List the Looker Studio reports of the signed-in account, optionally filtered by name.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Only reports whose name contains this text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful scoping context (signed-in account only) and that the name filter is optional, but says nothing about pagination, result limits, or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, with the filter qualifier trailing. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-required-parameter list tool with annotations covering the safety profile and a fully documented schema, this is nearly complete. The only gap is any hint about result size or pagination, which is minor for a listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single 'query' parameter is already fully documented as a substring match on name. The description's 'optionally filtered by name' adds nothing beyond the schema, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Looker Studio reports) plus scope (signed-in account) and the optional filter. It does not distinguish itself from siblings like list_report_pages or list_datasets, but the resource is named concretely enough that an agent can identify it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of alternatives (e.g., list_report_pages for page-level data), and no prerequisites. The agent must infer from the name alone that this is the entry-point listing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesList tables and viewsBRead-only
List the tables and views of a BigQuery dataset.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | BigQuery dataset id, e.g. campusfind_analytics | |
| project_id | No | Google Cloud project id. Defaults to project_id in the config. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered by structured data. The description adds nothing beyond that — no note on whether results are paginated, cached, or scoped by permissions, which for a BigQuery metadata call would be genuine added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler, front-loaded with the verb and the scoped resource. Nothing to trim and nothing essential buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial read-only listing tool with two fully documented parameters and annotations covering safety, the description is nearly sufficient. The only minor gap is that no output schema exists, so the return shape (table names, view flags, row counts) is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: dataset_id carries a concrete example and project_id documents its config-default behavior. The description adds no parameter meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'List the tables and views' names both the operation and the object, and the scope 'of a BigQuery dataset' separates it from list_datasets (project-level) and describe_table (single-table detail). It stops short of explicitly naming those siblings, so it is clear but not fully disambiguating on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no mention of alternatives such as list_datasets or describe_table. Usage is only implied by the listing verb, leaving the agent to infer the call context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_queryRun a read-only queryARead-only
Run one SELECT in GoogleSQL and return the rows as a table. Writes are refused. Use dry_run to check a query and how many bytes it scans before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | A single SELECT (or WITH … SELECT) in GoogleSQL | |
| dry_run | No | Only validate and estimate the bytes scanned | |
| max_rows | No | ||
| project_id | No | Google Cloud project id. Defaults to project_id in the config. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds genuinely new behavioral facts: writes are refused (an error condition the agent must anticipate), the result arrives as a table, and dry_run provides a cost-estimation path before execution. It stops short of mentioning authentication requirements, row-limit truncation behavior, or quota/cost limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded with the operative clause ('Run one SELECT…', 'Use dry_run…'), and no filler. The write-refusal safety note is short and appropriately placed second.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly covers the return shape ('rows as a table'), and read-only semantics are covered jointly by annotations and the write-refusal sentence. The remaining hole is max_rows (what happens past the 10000 cap, truncation vs error) and any auth/project-scoping prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, above the low-coverage threshold, so the schema carries most parameter meaning. The description's dry_run sentence largely restates the schema's own 'Only validate and estimate the bytes scanned' and adds nothing about max_rows, the one undocumented parameter (a real gap for controlling result size).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run one SELECT in GoogleSQL'), the cardinality constraint ('one'), and the return shape ('return the rows as a table'). Nothing in the sibling set (list_*/describe_*/screenshot_*/build_report_link) can be confused with executing an arbitrary query, so the boundary is clear without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a workflow hint ('Use dry_run to check a query and how many bytes it scans before running it') but never says when to reach for run_query versus siblings like list_tables or describe_table, nor any exclusions. Usage is only implied by the tool's function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshot_reportScreenshot a reportARead-only
Take a PNG of a report page in view mode, to check charts after editing.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page; defaults to the first page | |
| report_id | Yes | Report id or any URL of the report |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it a safe read operation (readOnlyHint=true, destructiveHint=false). The description adds real value beyond that by specifying the render mode ('view mode') and the output artifact ('PNG'), which matters since no output schema exists. It omits any auth or timing context, keeping it just short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the core action and its scope arrive first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description conveys the return format (PNG) and the render mode, which is the essential missing piece. Nothing critical for invoking it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; both page and report_id are documented in the schema, including the 1-based default and the URL-acceptance behavior. The description adds no parameter detail beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: capture a PNG of a report page. The 'in view mode' qualifier narrows the action meaningfully. No sibling tool does anything similar (run_query, list_reports, build_report_link), so no differentiation is strictly needed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'to check charts after editing' implies a usage context, but it is a purpose rationale rather than explicit when-to-use guidance. There is no mention of when not to use it or which alternative to pick for other verification needs.
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.
11 tool updates
v0.1.0- First observed
build_report_link - First observed
check_auth - First observed
describe_component - First observed
describe_table - First observed
list_components - First observed
list_datasets - First observed
list_report_pages - First observed
list_reports - First observed
list_tables - First observed
run_query - First observed
screenshot_report
TDQS
Scored across 11 tools
Each tool targets a distinct resource+action: BigQuery querying (run_query, list_datasets, list_tables, describe_table) versus Looker Studio browsing (list_reports, list_report_pages, list_components, describe_component, screenshot_report), plus auth and link building. The parallel list/describe hierarchies are clearly separated by domain and no two tools overlap in purpose.
All names use a consistent snake_case verb_noun pattern (list_reports, describe_component, run_query, build_report_link, check_auth). There are no mixed conventions or vague verbs, making the naming highly predictable.
11 tools is well within the ideal range and each earns its place: reading BigQuery, reading reports/pages/components, auth checks, and link building. Nothing feels redundant or padded.
The surface is read-only yet descriptions reference editing operations that do not exist: describe_component tells you to learn the labels 'update_component' accepts, list_components says 'other component tools take' indexes, and screenshot_report is 'to check charts after editing'. Agents will hit dead ends because the referenced write/edit tools (e.g. update_component, add_component) are absent.
Related MCP Connectors
Read-only Google Search Console and Google Analytics for AI agents.
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
- AdCopilotDeprecatedcloud.adcopilot
Google Ads, GA4, Search Console and Tag Manager for AI assistants. Every change is proposed first.
Google Search Console, GA4 and Bing Webmaster data for SEO and AI-search work. 20 read-only tools.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to query Google Analytics accounts, properties, and run reports using natural language through the Admin and Data APIs.61Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables LLMs to explore BigQuery datasets and tables, run safe read-only queries, and optionally perform vector search using BigQuery embeddings.80 PyPI10MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to query and analyze Google BigQuery data, including schema browsing, running queries, and comparing datasets through natural language.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to query trusted BigQuery analytics using curated Business Intelligence tools, providing secure, accurate business metrics and KPIs through natural language.MIT