mirror of
https://github.com/googleapis/genai-toolbox.git
synced 2026-01-10 07:58:12 -05:00
feat(looker/tools): Enhance dashboard creation with dashboard filters (#2133)
## Description Enhance dashboard creation with dashboard level filters. Also improve tool descriptions. ## PR Checklist > Thank you for opening a Pull Request! Before submitting your PR, there are a > few things you can do to make sure it goes smoothly: - [X] Make sure you reviewed [CONTRIBUTING.md](https://github.com/googleapis/genai-toolbox/blob/main/CONTRIBUTING.md) - [x] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/genai-toolbox/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [x] Ensure the tests and linter pass - [x] Code coverage does not decrease (if any source code was changed) - [x] Appropriate docs were updated (if necessary) - [x] Make sure to add `!` if this involve a breaking change
This commit is contained in:
@@ -120,6 +120,7 @@ import (
|
||||
_ "github.com/googleapis/genai-toolbox/internal/tools/firestore/firestorevalidaterules"
|
||||
_ "github.com/googleapis/genai-toolbox/internal/tools/http"
|
||||
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookeradddashboardelement"
|
||||
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookeradddashboardfilter"
|
||||
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerconversationalanalytics"
|
||||
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookercreateprojectfile"
|
||||
_ "github.com/googleapis/genai-toolbox/internal/tools/looker/lookerdeleteprojectfile"
|
||||
|
||||
@@ -1598,7 +1598,7 @@ func TestPrebuiltTools(t *testing.T) {
|
||||
wantToolset: server.ToolsetConfigs{
|
||||
"looker_tools": tools.ToolsetConfig{
|
||||
Name: "looker_tools",
|
||||
ToolNames: []string{"get_models", "get_explores", "get_dimensions", "get_measures", "get_filters", "get_parameters", "query", "query_sql", "query_url", "get_looks", "run_look", "make_look", "get_dashboards", "run_dashboard", "make_dashboard", "add_dashboard_element", "health_pulse", "health_analyze", "health_vacuum", "dev_mode", "get_projects", "get_project_files", "get_project_file", "create_project_file", "update_project_file", "delete_project_file", "get_connections", "get_connection_schemas", "get_connection_databases", "get_connection_tables", "get_connection_table_columns"},
|
||||
ToolNames: []string{"get_models", "get_explores", "get_dimensions", "get_measures", "get_filters", "get_parameters", "query", "query_sql", "query_url", "get_looks", "run_look", "make_look", "get_dashboards", "run_dashboard", "make_dashboard", "add_dashboard_element", "add_dashboard_filter", "generate_embed_url", "health_pulse", "health_analyze", "health_vacuum", "dev_mode", "get_projects", "get_project_files", "get_project_file", "create_project_file", "update_project_file", "delete_project_file", "get_connections", "get_connection_schemas", "get_connection_databases", "get_connection_tables", "get_connection_table_columns"},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -323,6 +323,8 @@ instance and create new saved content.
|
||||
data
|
||||
1. **make_dashboard**: Create a saved dashboard in Looker and return the URL
|
||||
1. **add_dashboard_element**: Add a tile to a dashboard
|
||||
1. **add_dashboard_filter**: Add a filter to a dashboard
|
||||
1. **generate_embed_url**: Generate an embed url for content
|
||||
|
||||
### Looker Instance Health Tools
|
||||
|
||||
|
||||
@@ -416,6 +416,8 @@ details on how to connect your AI tools (IDEs) to databases via Toolbox and MCP.
|
||||
* `run_dashboard`: Runs the queries associated with a dashboard.
|
||||
* `make_dashboard`: Creates a new dashboard.
|
||||
* `add_dashboard_element`: Adds a tile to a dashboard.
|
||||
* `add_dashboard_filter`: Adds a filter to a dashboard.
|
||||
* `generate_embed_url`: Generate an embed url for content.
|
||||
* `health_pulse`: Test the health of a Looker instance.
|
||||
* `health_analyze`: Analyze the LookML usage of a Looker instance.
|
||||
* `health_vacuum`: Suggest LookML elements that can be removed.
|
||||
|
||||
@@ -91,18 +91,17 @@ instead of hardcoding your secrets into the configuration file.
|
||||
|
||||
## Reference
|
||||
|
||||
| **field** | **type** | **required** | **description** |
|
||||
|----------------------|:--------:|:------------:|-------------------------------------------------------------------------------------------|
|
||||
| kind | string | true | Must be "looker". |
|
||||
| base_url | string | true | The URL of your Looker server with no trailing /. |
|
||||
| client_id | string | false | The client id assigned by Looker. |
|
||||
| client_secret | string | false | The client secret assigned by Looker. |
|
||||
| verify_ssl | string | false | Whether to check the ssl certificate of the server. |
|
||||
| project | string | false | The project id to use in Google Cloud. |
|
||||
| location | string | false | The location to use in Google Cloud. (default: us) |
|
||||
| timeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, 120s is applied. |
|
||||
| use_client_oauth | string | false | Use OAuth tokens instead of client_id and client_secret. (default: false) If a header |
|
||||
| | | | name is provided, it will be used instead of "Authorization". |
|
||||
| show_hidden_models | string | false | Show or hide hidden models. (default: true) |
|
||||
| show_hidden_explores | string | false | Show or hide hidden explores. (default: true) |
|
||||
| show_hidden_fields | string | false | Show or hide hidden fields. (default: true) |
|
||||
| **field** | **type** | **required** | **description** |
|
||||
|----------------------|:--------:|:------------:|-----------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| kind | string | true | Must be "looker". |
|
||||
| base_url | string | true | The URL of your Looker server with no trailing /. |
|
||||
| client_id | string | false | The client id assigned by Looker. |
|
||||
| client_secret | string | false | The client secret assigned by Looker. |
|
||||
| verify_ssl | string | false | Whether to check the ssl certificate of the server. |
|
||||
| project | string | false | The project id to use in Google Cloud. |
|
||||
| location | string | false | The location to use in Google Cloud. (default: us) |
|
||||
| timeout | string | false | Maximum time to wait for query execution (e.g. "30s", "2m"). By default, 120s is applied. |
|
||||
| use_client_oauth | string | false | Use OAuth tokens instead of client_id and client_secret. (default: false) If a header name is provided, it will be used instead of "Authorization". |
|
||||
| show_hidden_models | string | false | Show or hide hidden models. (default: true) |
|
||||
| show_hidden_explores | string | false | Show or hide hidden explores. (default: true) |
|
||||
| show_hidden_fields | string | false | Show or hide hidden fields. (default: true) |
|
||||
@@ -10,27 +10,18 @@ aliases:
|
||||
|
||||
## About
|
||||
|
||||
The `looker-add-dashboard-element` creates a dashboard element
|
||||
in the given dashboard.
|
||||
The `looker-add-dashboard-element` tool creates a new tile (element) within an existing Looker dashboard.
|
||||
Tiles are added in the order this tool is called for a given `dashboard_id`.
|
||||
|
||||
CRITICAL ORDER OF OPERATIONS:
|
||||
1. Create the dashboard using `make_dashboard`.
|
||||
2. Add any dashboard-level filters using `add_dashboard_filter`.
|
||||
3. Then, add elements (tiles) using this tool.
|
||||
|
||||
It's compatible with the following sources:
|
||||
|
||||
- [looker](../../sources/looker.md)
|
||||
|
||||
`looker-add-dashboard-element` takes eleven parameters:
|
||||
|
||||
1. the `model`
|
||||
2. the `explore`
|
||||
3. the `fields` list
|
||||
4. an optional set of `filters`
|
||||
5. an optional set of `pivots`
|
||||
6. an optional set of `sorts`
|
||||
7. an optional `limit`
|
||||
8. an optional `tz`
|
||||
9. an optional `vis_config`
|
||||
10. the `title`
|
||||
11. the `dashboard_id`
|
||||
|
||||
## Example
|
||||
|
||||
```yaml
|
||||
@@ -39,24 +30,37 @@ tools:
|
||||
kind: looker-add-dashboard-element
|
||||
source: looker-source
|
||||
description: |
|
||||
add_dashboard_element Tool
|
||||
This tool creates a new tile (element) within an existing Looker dashboard.
|
||||
Tiles are added in the order this tool is called for a given `dashboard_id`.
|
||||
|
||||
This tool creates a new tile in a Looker dashboard using
|
||||
the query parameters and the vis_config specified.
|
||||
CRITICAL ORDER OF OPERATIONS:
|
||||
1. Create the dashboard using `make_dashboard`.
|
||||
2. Add any dashboard-level filters using `add_dashboard_filter`.
|
||||
3. Then, add elements (tiles) using this tool.
|
||||
|
||||
Most of the parameters are the same as the query_url
|
||||
tool. In addition, there is a title that may be provided.
|
||||
The dashboard_id must be specified. That is obtained
|
||||
from calling make_dashboard.
|
||||
Required Parameters:
|
||||
- dashboard_id: The ID of the target dashboard, obtained from `make_dashboard`.
|
||||
- model_name, explore_name, fields: These query parameters are inherited
|
||||
from the `query` tool and are required to define the data for the tile.
|
||||
|
||||
This tool can be called many times for one dashboard_id
|
||||
and the resulting tiles will be added in order.
|
||||
Optional Parameters:
|
||||
- title: An optional title for the dashboard tile.
|
||||
- pivots, filters, sorts, limit, query_timezone: These query parameters are
|
||||
inherited from the `query` tool and can be used to customize the tile's query.
|
||||
- vis_config: A JSON object defining the visualization settings for this tile.
|
||||
The structure and options are the same as for the `query_url` tool's `vis_config`.
|
||||
|
||||
Connecting to Dashboard Filters:
|
||||
A dashboard element can be connected to one or more dashboard filters (created with
|
||||
`add_dashboard_filter`). To do this, specify the `name` of the dashboard filter
|
||||
and the `field` from the element's query that the filter should apply to.
|
||||
The format for specifying the field is `view_name.field_name`.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
| **field** | **type** | **required** | **description** |
|
||||
|-------------|:--------:|:------------:|----------------------------------------------------|
|
||||
| kind | string | true | Must be "looker-add-dashboard-element" |
|
||||
| source | string | true | Name of the source the SQL should execute on. |
|
||||
| description | string | true | Description of the tool that is passed to the LLM. |
|
||||
|:------------|:--------:|:------------:|----------------------------------------------------|
|
||||
| kind | string | true | Must be "looker-add-dashboard-element". |
|
||||
| source | string | true | Name of the source the SQL should execute on. |
|
||||
| description | string | true | Description of the tool that is passed to the LLM. |
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
title: "looker-add-dashboard-filter"
|
||||
type: docs
|
||||
weight: 1
|
||||
description: >
|
||||
The "looker-add-dashboard-filter" tool adds a filter to a specified dashboard.
|
||||
aliases:
|
||||
- /resources/tools/looker-add-dashboard-filter
|
||||
---
|
||||
|
||||
## About
|
||||
|
||||
The `looker-add-dashboard-filter` tool adds a filter to a specified Looker dashboard.
|
||||
|
||||
CRITICAL ORDER OF OPERATIONS:
|
||||
1. Create a dashboard using `make_dashboard`.
|
||||
2. Add all desired filters using this tool (`add_dashboard_filter`).
|
||||
3. Finally, add dashboard elements (tiles) using `add_dashboard_element`.
|
||||
|
||||
It's compatible with the following sources:
|
||||
|
||||
- [looker](../../sources/looker.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
| **parameter** | **type** | **required** | **default** | **description** |
|
||||
|:----------------------|:--------:|:-----------------:|:--------------:|-------------------------------------------------------------------------------------------------------------------------------|
|
||||
| dashboard_id | string | true | none | The ID of the dashboard to add the filter to, obtained from `make_dashboard`. |
|
||||
| name | string | true | none | A unique internal identifier for the filter. This name is used later in `add_dashboard_element` to bind tiles to this filter. |
|
||||
| title | string | true | none | The label displayed to users in the Looker UI. |
|
||||
| filter_type | string | true | `field_filter` | The filter type of filter. Can be `date_filter`, `number_filter`, `string_filter`, or `field_filter`. |
|
||||
| default_value | string | false | none | The initial value for the filter. |
|
||||
| model | string | if `field_filter` | none | The name of the LookML model, obtained from `get_models`. |
|
||||
| explore | string | if `field_filter` | none | The name of the explore within the model, obtained from `get_explores`. |
|
||||
| dimension | string | if `field_filter` | none | The name of the field (e.g., `view_name.field_name`) to base the filter on, obtained from `get_dimensions`. |
|
||||
| allow_multiple_values | boolean | false | true | The Dashboard Filter should allow multiple values |
|
||||
| required | boolean | false | false | The Dashboard Filter is required to run dashboard |
|
||||
|
||||
## Example
|
||||
|
||||
```yaml
|
||||
tools:
|
||||
add_dashboard_filter:
|
||||
kind: looker-add-dashboard-filter
|
||||
source: looker-source
|
||||
description: |
|
||||
This tool adds a filter to a Looker dashboard.
|
||||
|
||||
CRITICAL ORDER OF OPERATIONS:
|
||||
1. Create a dashboard using `make_dashboard`.
|
||||
2. Add all desired filters using this tool (`add_dashboard_filter`).
|
||||
3. Finally, add dashboard elements (tiles) using `add_dashboard_element`.
|
||||
|
||||
Parameters:
|
||||
- dashboard_id (required): The ID from `make_dashboard`.
|
||||
- name (required): A unique internal identifier for the filter. You will use this `name` later in `add_dashboard_element` to bind tiles to this filter.
|
||||
- title (required): The label displayed to users in the UI.
|
||||
- filter_type (required): One of `date_filter`, `number_filter`, `string_filter`, or `field_filter`.
|
||||
- default_value (optional): The initial value for the filter.
|
||||
|
||||
Field Filters (`flter_type: field_filter`):
|
||||
If creating a field filter, you must also provide:
|
||||
- model
|
||||
- explore
|
||||
- dimension
|
||||
The filter will inherit suggestions and type information from this LookML field.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
| **field** | **type** | **required** | **description** |
|
||||
|-------------|:--------:|:------------:|----------------------------------------------------|
|
||||
| kind | string | true | Must be "looker-add-dashboard-filter". |
|
||||
| source | string | true | Name of the source the SQL should execute on. |
|
||||
| description | string | true | Description of the tool that is passed to the LLM. |
|
||||
@@ -34,9 +34,10 @@ tools:
|
||||
kind: looker-conversational-analytics
|
||||
source: looker-source
|
||||
description: |
|
||||
Use this tool to perform data analysis, get insights,
|
||||
or answer complex questions about the contents of specific
|
||||
Looker explores.
|
||||
Use this tool to ask questions about your data using the Looker Conversational
|
||||
Analytics API. You must provide a natural language query and a list of
|
||||
1 to 5 model and explore combinations (e.g. [{'model': 'the_model', 'explore': 'the_explore'}]).
|
||||
Use the 'get_models' and 'get_explores' tools to discover available models and explores.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -27,13 +27,18 @@ tools:
|
||||
kind: looker-create-project-file
|
||||
source: looker-source
|
||||
description: |
|
||||
create_project_file Tool
|
||||
This tool creates a new LookML file within a specified project, populating
|
||||
it with the provided content.
|
||||
|
||||
Given a project_id and a file path within the project, as well as the content
|
||||
of a LookML file, this tool will create a new file within the project.
|
||||
Prerequisite: The Looker session must be in Development Mode. Use `dev_mode: true` first.
|
||||
|
||||
This tool must be called after the dev_mode tool has changed the session to
|
||||
dev mode.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project.
|
||||
- file_path (required): The desired path and filename for the new file within the project.
|
||||
- content (required): The full LookML content to write into the new file.
|
||||
|
||||
Output:
|
||||
A confirmation message upon successful file creation.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -26,13 +26,17 @@ tools:
|
||||
kind: looker-delete-project-file
|
||||
source: looker-source
|
||||
description: |
|
||||
delete_project_file Tool
|
||||
This tool permanently deletes a specified LookML file from within a project.
|
||||
Use with caution, as this action cannot be undone through the API.
|
||||
|
||||
Given a project_id and a file path within the project, this tool will delete
|
||||
the file from the project.
|
||||
Prerequisite: The Looker session must be in Development Mode. Use `dev_mode: true` first.
|
||||
|
||||
This tool must be called after the dev_mode tool has changed the session to
|
||||
dev mode.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project.
|
||||
- file_path (required): The exact path to the LookML file to delete within the project.
|
||||
|
||||
Output:
|
||||
A confirmation message upon successful file deletion.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -27,10 +27,13 @@ tools:
|
||||
kind: looker-dev-mode
|
||||
source: looker-source
|
||||
description: |
|
||||
dev_mode Tool
|
||||
This tool allows toggling the Looker IDE session between Development Mode and Production Mode.
|
||||
Development Mode enables making and testing changes to LookML projects.
|
||||
|
||||
Passing true to this tool switches the session to dev mode. Passing false to this tool switches the
|
||||
session to production mode.
|
||||
Parameters:
|
||||
- enable (required): A boolean value.
|
||||
- `true`: Switches the current session to Development Mode.
|
||||
- `false`: Switches the current session to Production Mode.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -36,11 +36,17 @@ tools:
|
||||
kind: looker-generate-embed-url
|
||||
source: looker-source
|
||||
description: |
|
||||
generate_embed_url Tool
|
||||
This tool generates a signed, private embed URL for specific Looker content,
|
||||
allowing users to access it directly.
|
||||
|
||||
This tool generates an embeddable URL for Looker content.
|
||||
You need to provide the type of content (e.g., 'dashboards', 'looks', 'query-visualization')
|
||||
and the ID of the content.
|
||||
Parameters:
|
||||
- type (required): The type of content to embed. Common values include:
|
||||
- `dashboards`
|
||||
- `looks`
|
||||
- `explore`
|
||||
- id (required): The unique identifier for the content.
|
||||
- For dashboards and looks, use the numeric ID (e.g., "123").
|
||||
- For explores, use the format "model_name/explore_name".
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -26,10 +26,16 @@ tools:
|
||||
kind: looker-get-connection-databases
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connection_databases Tool
|
||||
This tool retrieves a list of databases available through a specified Looker connection.
|
||||
This is only applicable for connections that support multiple databases.
|
||||
Use `get_connections` to check if a connection supports multiple databases.
|
||||
|
||||
This tool will list the databases available from a connection if the connection
|
||||
supports multiple databases.
|
||||
Parameters:
|
||||
- connection_name (required): The name of the database connection, obtained from `get_connections`.
|
||||
|
||||
Output:
|
||||
A JSON array of strings, where each string is the name of an available database.
|
||||
If the connection does not support multiple databases, an empty list or an error will be returned.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -26,10 +26,16 @@ tools:
|
||||
kind: looker-get-connection-schemas
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connection_schemas Tool
|
||||
This tool retrieves a list of database schemas available through a specified
|
||||
Looker connection.
|
||||
|
||||
This tool will list the schemas available from a connection, filtered by
|
||||
an optional database name.
|
||||
Parameters:
|
||||
- connection_name (required): The name of the database connection, obtained from `get_connections`.
|
||||
- database (optional): An optional database name to filter the schemas.
|
||||
Only applicable for connections that support multiple databases.
|
||||
|
||||
Output:
|
||||
A JSON array of strings, where each string is the name of an available schema.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -26,11 +26,20 @@ tools:
|
||||
kind: looker-get-connection-table-columns
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connection_table_columns Tool
|
||||
This tool retrieves a list of columns for one or more specified tables within a
|
||||
given database schema and connection.
|
||||
|
||||
This tool will list the columns available from a connection, for all the tables
|
||||
given in a comma separated list of table names, filtered by the
|
||||
schema name and optional database name.
|
||||
Parameters:
|
||||
- connection_name (required): The name of the database connection, obtained from `get_connections`.
|
||||
- schema (required): The name of the schema where the tables reside, obtained from `get_connection_schemas`.
|
||||
- tables (required): A comma-separated string of table names for which to retrieve columns
|
||||
(e.g., "users,orders,products"), obtained from `get_connection_tables`.
|
||||
- database (optional): The name of the database to filter by. Only applicable for connections
|
||||
that support multiple databases (check with `get_connections`).
|
||||
|
||||
Output:
|
||||
A JSON array of objects, where each object represents a column and contains details
|
||||
such as `table_name`, `column_name`, `data_type`, and `is_nullable`.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -27,10 +27,17 @@ tools:
|
||||
kind: looker-get-connection-tables
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connection_tables Tool
|
||||
This tool retrieves a list of tables available within a specified database schema
|
||||
through a Looker connection.
|
||||
|
||||
This tool will list the tables available from a connection, filtered by the
|
||||
schema name and optional database name.
|
||||
Parameters:
|
||||
- connection_name (required): The name of the database connection, obtained from `get_connections`.
|
||||
- schema (required): The name of the schema to list tables from, obtained from `get_connection_schemas`.
|
||||
- database (optional): The name of the database to filter by. Only applicable for connections
|
||||
that support multiple databases (check with `get_connections`).
|
||||
|
||||
Output:
|
||||
A JSON array of strings, where each string is the name of an available table.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -26,11 +26,18 @@ tools:
|
||||
kind: looker-get-connections
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connections Tool
|
||||
This tool retrieves a list of all database connections configured in the Looker system.
|
||||
|
||||
This tool will list all the connections available in the Looker system, as
|
||||
well as the dialect name, the default schema, the database if applicable,
|
||||
and whether the connection supports multiple databases.
|
||||
Parameters:
|
||||
This tool takes no parameters.
|
||||
|
||||
Output:
|
||||
A JSON array of objects, each representing a database connection and including details such as:
|
||||
- `name`: The connection's unique identifier.
|
||||
- `dialect`: The database dialect (e.g., "mysql", "postgresql", "bigquery").
|
||||
- `default_schema`: The default schema for the connection.
|
||||
- `database`: The associated database name (if applicable).
|
||||
- `supports_multiple_databases`: A boolean indicating if the connection can access multiple databases.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -29,25 +29,29 @@ default to 100 and 0.
|
||||
|
||||
```yaml
|
||||
tools:
|
||||
get_dashboards:
|
||||
kind: looker-get-dashboards
|
||||
source: looker-source
|
||||
description: |
|
||||
get_dashboards Tool
|
||||
|
||||
This tool is used to search for saved dashboards in a Looker instance.
|
||||
String search params use case-insensitive matching. String search
|
||||
params can contain % and '_' as SQL LIKE pattern match wildcard
|
||||
expressions. example="dan%" will match "danger" and "Danzig" but
|
||||
not "David" example="D_m%" will match "Damage" and "dump".
|
||||
|
||||
Most search params can accept "IS NULL" and "NOT NULL" as special
|
||||
expressions to match or exclude (respectively) rows where the
|
||||
column is null.
|
||||
|
||||
The limit and offset are used to paginate the results.
|
||||
|
||||
The result of the get_dashboards tool is a list of json objects.
|
||||
get_dashboards:
|
||||
kind: looker-get-dashboards
|
||||
source: looker-source
|
||||
description: |
|
||||
This tool searches for saved dashboards in a Looker instance. It returns a list of JSON objects, each representing a dashboard.
|
||||
|
||||
Search Parameters:
|
||||
- title (optional): Filter by dashboard title (supports wildcards).
|
||||
- folder_id (optional): Filter by the ID of the folder where the dashboard is saved.
|
||||
- user_id (optional): Filter by the ID of the user who created the dashboard.
|
||||
- description (optional): Filter by description content (supports wildcards).
|
||||
- id (optional): Filter by specific dashboard ID.
|
||||
- limit (optional): Maximum number of results to return. Defaults to a system limit.
|
||||
- offset (optional): Starting point for pagination.
|
||||
|
||||
String Search Behavior:
|
||||
- Case-insensitive matching.
|
||||
- Supports SQL LIKE pattern match wildcards:
|
||||
- `%`: Matches any sequence of zero or more characters. (e.g., `"finan%"` matches "financial", "finance")
|
||||
- `_`: Matches any single character. (e.g., `"s_les"` matches "sales")
|
||||
- Special expressions for null checks:
|
||||
- `"IS NULL"`: Matches dashboards where the field is null.
|
||||
- `"NOT NULL"`: Excludes dashboards where the field is null.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -28,16 +28,20 @@ tools:
|
||||
kind: looker-get-dimensions
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_dimensions tool retrieves the list of dimensions defined in
|
||||
an explore.
|
||||
This tool retrieves a list of dimensions defined within a specific Looker explore.
|
||||
Dimensions are non-aggregatable attributes or characteristics of your data
|
||||
(e.g., product name, order date, customer city) that can be used for grouping,
|
||||
filtering, or segmenting query results.
|
||||
|
||||
It takes two parameters, the model_name looked up from get_models and the
|
||||
explore_name looked up from get_explores.
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
- explore_name (required): The name of the explore within the model, obtained from `get_explores`.
|
||||
|
||||
If this returns a suggestions field for a dimension, the contents of suggestions
|
||||
can be used as filters for this field. If this returns a suggest_explore and
|
||||
suggest_dimension, a query against that explore and dimension can be used to find
|
||||
valid filters for this field.
|
||||
Output Details:
|
||||
- If a dimension includes a `suggestions` field, its contents are valid values
|
||||
that can be used directly as filters for that dimension.
|
||||
- If a `suggest_explore` and `suggest_dimension` are provided, you can query
|
||||
that specified explore and dimension to retrieve a list of valid filter values.
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -40,10 +40,13 @@ tools:
|
||||
kind: looker-get-explores
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_explores tool retrieves the list of explores defined in a LookML model
|
||||
in the Looker system.
|
||||
This tool retrieves a list of explores defined within a specific LookML model.
|
||||
Explores represent a curated view of your data, typically joining several
|
||||
tables together to allow for focused analysis on a particular subject area.
|
||||
The output provides details like the explore's `name` and `label`.
|
||||
|
||||
It takes one parameter, the model_name looked up from get_models.
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -24,15 +24,22 @@ It's compatible with the following sources:
|
||||
|
||||
```yaml
|
||||
tools:
|
||||
get_dimensions:
|
||||
get_filters:
|
||||
kind: looker-get-filters
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_filters tool retrieves the list of filters defined in
|
||||
an explore.
|
||||
This tool retrieves a list of "filter-only fields" defined within a specific
|
||||
Looker explore. These are special fields defined in LookML specifically to
|
||||
create user-facing filter controls that do not directly affect the `GROUP BY`
|
||||
clause of the SQL query. They are often used in conjunction with liquid templating
|
||||
to create dynamic queries.
|
||||
|
||||
It takes two parameters, the model_name looked up from get_models and the
|
||||
explore_name looked up from get_explores.
|
||||
Note: Regular dimensions and measures can also be used as filters in a query.
|
||||
This tool *only* returns fields explicitly defined as `filter:` in LookML.
|
||||
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
- explore_name (required): The name of the explore within the model, obtained from `get_explores`.
|
||||
```
|
||||
|
||||
The response is a json array with the following elements:
|
||||
|
||||
@@ -34,21 +34,26 @@ tools:
|
||||
kind: looker-get-looks
|
||||
source: looker-source
|
||||
description: |
|
||||
get_looks Tool
|
||||
This tool searches for saved Looks (pre-defined queries and visualizations)
|
||||
in a Looker instance. It returns a list of JSON objects, each representing a Look.
|
||||
|
||||
This tool is used to search for saved looks in a Looker instance.
|
||||
String search params use case-insensitive matching. String search
|
||||
params can contain % and '_' as SQL LIKE pattern match wildcard
|
||||
expressions. example="dan%" will match "danger" and "Danzig" but
|
||||
not "David" example="D_m%" will match "Damage" and "dump".
|
||||
Search Parameters:
|
||||
- title (optional): Filter by Look title (supports wildcards).
|
||||
- folder_id (optional): Filter by the ID of the folder where the Look is saved.
|
||||
- user_id (optional): Filter by the ID of the user who created the Look.
|
||||
- description (optional): Filter by description content (supports wildcards).
|
||||
- id (optional): Filter by specific Look ID.
|
||||
- limit (optional): Maximum number of results to return. Defaults to a system limit.
|
||||
- offset (optional): Starting point for pagination.
|
||||
|
||||
Most search params can accept "IS NULL" and "NOT NULL" as special
|
||||
expressions to match or exclude (respectively) rows where the
|
||||
column is null.
|
||||
|
||||
The limit and offset are used to paginate the results.
|
||||
|
||||
The result of the get_looks tool is a list of json objects.
|
||||
String Search Behavior:
|
||||
- Case-insensitive matching.
|
||||
- Supports SQL LIKE pattern match wildcards:
|
||||
- `%`: Matches any sequence of zero or more characters. (e.g., `"dan%"` matches "danger", "Danzig")
|
||||
- `_`: Matches any single character. (e.g., `"D_m%"` matches "Damage", "dump")
|
||||
- Special expressions for null checks:
|
||||
- `"IS NULL"`: Matches Looks where the field is null.
|
||||
- `"NOT NULL"`: Excludes Looks where the field is null.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -28,16 +28,19 @@ tools:
|
||||
kind: looker-get-measures
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_measures tool retrieves the list of measures defined in
|
||||
an explore.
|
||||
This tool retrieves a list of measures defined within a specific Looker explore.
|
||||
Measures are aggregatable metrics (e.g., total sales, average price, count of users)
|
||||
that are used for calculations and quantitative analysis in your queries.
|
||||
|
||||
It takes two parameters, the model_name looked up from get_models and the
|
||||
explore_name looked up from get_explores.
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
- explore_name (required): The name of the explore within the model, obtained from `get_explores`.
|
||||
|
||||
If this returns a suggestions field for a measure, the contents of suggestions
|
||||
can be used as filters for this field. If this returns a suggest_explore and
|
||||
suggest_dimension, a query against that explore and dimension can be used to find
|
||||
valid filters for this field.
|
||||
Output Details:
|
||||
- If a measure includes a `suggestions` field, its contents are valid values
|
||||
that can be used directly as filters for that measure.
|
||||
- If a `suggest_explore` and `suggest_dimension` are provided, you can query
|
||||
that specified explore and dimension to retrieve a list of valid filter values.
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -26,9 +26,12 @@ tools:
|
||||
kind: looker-get-models
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_models tool retrieves the list of LookML models in the Looker system.
|
||||
This tool retrieves a list of available LookML models in the Looker instance.
|
||||
LookML models define the data structure and relationships that users can query.
|
||||
The output includes details like the model's `name` and `label`, which are
|
||||
essential for subsequent calls to tools like `get_explores` or `query`.
|
||||
|
||||
It takes no parameters.
|
||||
This tool takes no parameters.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -28,11 +28,15 @@ tools:
|
||||
kind: looker-get-parameters
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_parameters tool retrieves the list of parameters defined in
|
||||
an explore.
|
||||
This tool retrieves a list of parameters defined within a specific Looker explore.
|
||||
LookML parameters are dynamic input fields that allow users to influence query
|
||||
behavior without directly modifying the underlying LookML. They are often used
|
||||
with `liquid` templating to create flexible dashboards and reports, enabling
|
||||
users to choose dimensions, measures, or other query components at runtime.
|
||||
|
||||
It takes two parameters, the model_name looked up from get_models and the
|
||||
explore_name looked up from get_explores.
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
- explore_name (required): The name of the explore within the model, obtained from `get_explores`.
|
||||
```
|
||||
|
||||
The response is a json array with the following elements:
|
||||
|
||||
@@ -26,10 +26,15 @@ tools:
|
||||
kind: looker-get-project-file
|
||||
source: looker-source
|
||||
description: |
|
||||
get_project_file Tool
|
||||
This tool retrieves the raw content of a specific LookML file from within a project.
|
||||
|
||||
Given a project_id and a file path within the project, this tool returns
|
||||
the contents of the LookML file.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project, obtained from `get_projects`.
|
||||
- file_path (required): The path to the LookML file within the project,
|
||||
typically obtained from `get_project_files`.
|
||||
|
||||
Output:
|
||||
The raw text content of the specified LookML file.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -26,10 +26,15 @@ tools:
|
||||
kind: looker-get-project-files
|
||||
source: looker-source
|
||||
description: |
|
||||
get_project_files Tool
|
||||
This tool retrieves a list of all LookML files within a specified project,
|
||||
providing details about each file.
|
||||
|
||||
Given a project_id this tool returns the details about
|
||||
the LookML files that make up that project.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project, obtained from `get_projects`.
|
||||
|
||||
Output:
|
||||
A JSON array of objects, each representing a LookML file and containing
|
||||
details such as `path`, `id`, `type`, and `git_status`.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -26,10 +26,16 @@ tools:
|
||||
kind: looker-get-projects
|
||||
source: looker-source
|
||||
description: |
|
||||
get_projects Tool
|
||||
This tool retrieves a list of all LookML projects available on the Looker instance.
|
||||
It is useful for identifying projects before performing actions like retrieving
|
||||
project files or making modifications.
|
||||
|
||||
This tool returns the project_id and project_name for
|
||||
all the LookML projects on the looker instance.
|
||||
Parameters:
|
||||
This tool takes no parameters.
|
||||
|
||||
Output:
|
||||
A JSON array of objects, each containing the `project_id` and `project_name`
|
||||
for a LookML project.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -42,17 +42,18 @@ tools:
|
||||
kind: looker-health-analyze
|
||||
source: looker-source
|
||||
description: |
|
||||
health-analyze Tool
|
||||
This tool calculates the usage statistics for Looker projects, models, and explores.
|
||||
|
||||
This tool calculates the usage of projects, models and explores.
|
||||
Parameters:
|
||||
- action (required): The type of resource to analyze. Can be `"projects"`, `"models"`, or `"explores"`.
|
||||
- project (optional): The specific project ID to analyze.
|
||||
- model (optional): The specific model name to analyze. Requires `project` if used without `explore`.
|
||||
- explore (optional): The specific explore name to analyze. Requires `model` if used.
|
||||
- timeframe (optional): The lookback period in days for usage data. Defaults to `90` days.
|
||||
- min_queries (optional): The minimum number of queries for a resource to be considered active. Defaults to `1`.
|
||||
|
||||
It accepts 6 parameters:
|
||||
1. `action`: can be "projects", "models", or "explores"
|
||||
2. `project`: the project to analyze (optional)
|
||||
3. `model`: the model to analyze (optional)
|
||||
4. `explore`: the explore to analyze (optional)
|
||||
5. `timeframe`: the lookback period in days, default is 90
|
||||
6. `min_queries`: the minimum number of queries to consider a resource as active, default is 1
|
||||
Output:
|
||||
The result is a JSON object containing usage metrics for the specified resources.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -49,20 +49,22 @@ tools:
|
||||
kind: looker-health-pulse
|
||||
source: looker-source
|
||||
description: |
|
||||
health-pulse Tool
|
||||
This tool performs various health checks on a Looker instance.
|
||||
|
||||
This tool takes the pulse of a Looker instance by taking
|
||||
one of the following actions:
|
||||
1. `check_db_connections`,
|
||||
2. `check_dashboard_performance`,
|
||||
3. `check_dashboard_errors`,
|
||||
4. `check_explore_performance`,
|
||||
5. `check_schedule_failures`, or
|
||||
6. `check_legacy_features`
|
||||
|
||||
The `check_legacy_features` action is only available in Looker Core. If
|
||||
it is called on a Looker Core instance, you will get a notice. That notice
|
||||
should not be reported as an error.
|
||||
Parameters:
|
||||
- action (required): Specifies the type of health check to perform.
|
||||
Choose one of the following:
|
||||
- `check_db_connections`: Verifies database connectivity.
|
||||
- `check_dashboard_performance`: Assesses dashboard loading performance.
|
||||
- `check_dashboard_errors`: Identifies errors within dashboards.
|
||||
- `check_explore_performance`: Evaluates explore query performance.
|
||||
- `check_schedule_failures`: Reports on failed scheduled deliveries.
|
||||
- `check_legacy_features`: Checks for the usage of legacy features.
|
||||
|
||||
Note on `check_legacy_features`:
|
||||
This action is exclusively available in Looker Core instances. If invoked
|
||||
on a non-Looker Core instance, it will return a notice rather than an error.
|
||||
This notice should be considered normal behavior and not an indication of an issue.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -39,20 +39,19 @@ tools:
|
||||
kind: looker-health-vacuum
|
||||
source: looker-source
|
||||
description: |
|
||||
health-vacuum Tool
|
||||
This tool identifies and suggests LookML models or explores that can be
|
||||
safely removed due to inactivity or low usage.
|
||||
|
||||
This tool suggests models or explores that can removed
|
||||
because they are unused.
|
||||
Parameters:
|
||||
- action (required): The type of resource to analyze for removal candidates. Can be `"models"` or `"explores"`.
|
||||
- project (optional): The specific project ID to consider.
|
||||
- model (optional): The specific model name to consider. Requires `project` if used without `explore`.
|
||||
- explore (optional): The specific explore name to consider. Requires `model` if used.
|
||||
- timeframe (optional): The lookback period in days to assess usage. Defaults to `90` days.
|
||||
- min_queries (optional): The minimum number of queries for a resource to be considered active. Defaults to `1`.
|
||||
|
||||
It accepts 6 parameters:
|
||||
1. `action`: can be "models" or "explores"
|
||||
2. `project`: the project to vacuum (optional)
|
||||
3. `model`: the model to vacuum (optional)
|
||||
4. `explore`: the explore to vacuum (optional)
|
||||
5. `timeframe`: the lookback period in days, default is 90
|
||||
6. `min_queries`: the minimum number of queries to consider a resource as active, default is 1
|
||||
|
||||
The result is a list of objects that are candidates for deletion.
|
||||
Output:
|
||||
A JSON array of objects, each representing a model or explore that is a candidate for deletion due to low usage.
|
||||
```
|
||||
|
||||
| **field** | **type** | **required** | **description** |
|
||||
|
||||
@@ -30,18 +30,19 @@ tools:
|
||||
kind: looker-make-dashboard
|
||||
source: looker-source
|
||||
description: |
|
||||
make_dashboard Tool
|
||||
This tool creates a new, empty dashboard in Looker. Dashboards are stored
|
||||
in the user's personal folder, and the dashboard name must be unique.
|
||||
After creation, use `add_dashboard_filter` to add filters and
|
||||
`add_dashboard_element` to add content tiles.
|
||||
|
||||
This tool creates a new dashboard in Looker. The dashboard is
|
||||
initially empty and the add_dashboard_element tool is used to
|
||||
add content to the dashboard.
|
||||
Required Parameters:
|
||||
- title (required): A unique title for the new dashboard.
|
||||
- description (required): A brief description of the dashboard's purpose.
|
||||
|
||||
The newly created dashboard will be created in the user's
|
||||
personal folder in looker. The dashboard name must be unique.
|
||||
|
||||
The result is a json document with a link to the newly
|
||||
created dashboard and the id of the dashboard. Use the id
|
||||
when calling add_dashboard_element.
|
||||
Output:
|
||||
A JSON object containing a link (`url`) to the newly created dashboard and
|
||||
its unique `id`. This `dashboard_id` is crucial for subsequent calls to
|
||||
`add_dashboard_filter` and `add_dashboard_element`.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -40,20 +40,24 @@ tools:
|
||||
kind: looker-make-look
|
||||
source: looker-source
|
||||
description: |
|
||||
make_look Tool
|
||||
This tool creates a new Look (saved query with visualization) in Looker.
|
||||
The Look will be saved in the user's personal folder, and its name must be unique.
|
||||
|
||||
This tool creates a new look in Looker, using the query
|
||||
parameters and the vis_config specified.
|
||||
Required Parameters:
|
||||
- title: A unique title for the new Look.
|
||||
- description: A brief description of the Look's purpose.
|
||||
- model_name: The name of the LookML model (from `get_models`).
|
||||
- explore_name: The name of the explore (from `get_explores`).
|
||||
- fields: A list of field names (dimensions, measures, filters, or parameters) to include in the query.
|
||||
|
||||
Most of the parameters are the same as the query_url
|
||||
tool. In addition, there is a title and a description
|
||||
that must be provided.
|
||||
Optional Parameters:
|
||||
- pivots, filters, sorts, limit, query_timezone: These parameters are identical
|
||||
to those described for the `query` tool.
|
||||
- vis_config: A JSON object defining the visualization settings for the Look.
|
||||
The structure and options are the same as for the `query_url` tool's `vis_config`.
|
||||
|
||||
The newly created look will be created in the user's
|
||||
personal folder in looker. The look name must be unique.
|
||||
|
||||
The result is a json document with a link to the newly
|
||||
created look.
|
||||
Output:
|
||||
A JSON object containing a link (`url`) to the newly created Look, along with its `id` and `slug`.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -41,38 +41,17 @@ tools:
|
||||
kind: looker-query-sql
|
||||
source: looker-source
|
||||
description: |
|
||||
Query SQL Tool
|
||||
This tool generates the underlying SQL query that Looker would execute
|
||||
against the database for a given set of parameters. It is useful for
|
||||
understanding how Looker translates a request into SQL.
|
||||
|
||||
This tool is used to generate a sql query against the LookML model. The
|
||||
model, explore, and fields list must be specified. Pivots,
|
||||
filters and sorts are optional.
|
||||
Parameters:
|
||||
All parameters for this tool are identical to those of the `query` tool.
|
||||
This includes `model_name`, `explore_name`, `fields` (required),
|
||||
and optional parameters like `pivots`, `filters`, `sorts`, `limit`, and `query_timezone`.
|
||||
|
||||
The model can be found from the get_models tool. The explore
|
||||
can be found from the get_explores tool passing in the model.
|
||||
The fields can be found from the get_dimensions, get_measures,
|
||||
get_filters, and get_parameters tools, passing in the model
|
||||
and the explore.
|
||||
|
||||
Provide a model_id and explore_name, then a list
|
||||
of fields. Optionally a list of pivots can be provided.
|
||||
The pivots must also be included in the fields list.
|
||||
|
||||
Filters are provided as a map of {"field.id": "condition",
|
||||
"field.id2": "condition2", ...}. Do not put the field.id in
|
||||
quotes. Filter expressions can be found at
|
||||
https://cloud.google.com/looker/docs/filter-expressions.
|
||||
|
||||
Sorts can be specified like [ "field.id desc 0" ].
|
||||
|
||||
An optional row limit can be added. If not provided the limit
|
||||
will default to 500. "-1" can be specified for unlimited.
|
||||
|
||||
An optional query timezone can be added. The query_timezone to
|
||||
will default to that of the workstation where this MCP server
|
||||
is running, or Etc/UTC if that can't be determined. Not all
|
||||
models support custom timezones.
|
||||
|
||||
The result of the query tool is the sql string.
|
||||
Output:
|
||||
The result of this tool is the raw SQL text.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -37,17 +37,21 @@ tools:
|
||||
kind: looker-query-url
|
||||
source: looker-source
|
||||
description: |
|
||||
Query URL Tool
|
||||
This tool generates a shareable URL for a Looker query, allowing users to
|
||||
explore the query further within the Looker UI. It returns the generated URL,
|
||||
along with the `query_id` and `slug`.
|
||||
|
||||
This tool is used to generate the URL of a query in Looker.
|
||||
The user can then explore the query further inside Looker.
|
||||
The tool also returns the query_id and slug. The parameters
|
||||
are the same as the query tool with an additional vis_config
|
||||
parameter.
|
||||
Parameters:
|
||||
All query parameters (e.g., `model_name`, `explore_name`, `fields`, `pivots`,
|
||||
`filters`, `sorts`, `limit`, `query_timezone`) are the same as the `query` tool.
|
||||
|
||||
The vis_config is optional. If provided, it will be used to
|
||||
control the default visualization for the query. Here are
|
||||
some notes on making visualizations.
|
||||
Additionally, it accepts an optional `vis_config` parameter:
|
||||
- vis_config (optional): A JSON object that controls the default visualization
|
||||
settings for the generated query.
|
||||
|
||||
vis_config Details:
|
||||
The `vis_config` object supports a wide range of properties for various chart types.
|
||||
Here are some notes on making visualizations.
|
||||
|
||||
### Cartesian Charts (Area, Bar, Column, Line, Scatter)
|
||||
|
||||
|
||||
@@ -41,38 +41,24 @@ tools:
|
||||
kind: looker-query
|
||||
source: looker-source
|
||||
description: |
|
||||
Query Tool
|
||||
This tool runs a query against a LookML model and returns the results in JSON format.
|
||||
|
||||
This tool is used to run a query against the LookML model. The
|
||||
model, explore, and fields list must be specified. Pivots,
|
||||
filters and sorts are optional.
|
||||
Required Parameters:
|
||||
- model_name: The name of the LookML model (from `get_models`).
|
||||
- explore_name: The name of the explore (from `get_explores`).
|
||||
- fields: A list of field names (dimensions, measures, filters, or parameters) to include in the query.
|
||||
|
||||
The model can be found from the get_models tool. The explore
|
||||
can be found from the get_explores tool passing in the model.
|
||||
The fields can be found from the get_dimensions, get_measures,
|
||||
get_filters, and get_parameters tools, passing in the model
|
||||
and the explore.
|
||||
Optional Parameters:
|
||||
- pivots: A list of fields to pivot the results by. These fields must also be included in the `fields` list.
|
||||
- filters: A map of filter expressions, e.g., `{"view.field": "value", "view.date": "7 days"}`.
|
||||
- Do not quote field names.
|
||||
- Use `not null` instead of `-NULL`.
|
||||
- If a value contains a comma, enclose it in single quotes (e.g., "'New York, NY'").
|
||||
- sorts: A list of fields to sort by, optionally including direction (e.g., `["view.field desc"]`).
|
||||
- limit: Row limit (default 500). Use "-1" for unlimited.
|
||||
- query_timezone: specific timezone for the query (e.g. `America/Los_Angeles`).
|
||||
|
||||
Provide a model_id and explore_name, then a list
|
||||
of fields. Optionally a list of pivots can be provided.
|
||||
The pivots must also be included in the fields list.
|
||||
|
||||
Filters are provided as a map of {"field.id": "condition",
|
||||
"field.id2": "condition2", ...}. Do not put the field.id in
|
||||
quotes. Filter expressions can be found at
|
||||
https://cloud.google.com/looker/docs/filter-expressions.
|
||||
If the condition is a string that contains a comma, use a second
|
||||
set of quotes. For example, {"user.city": "'New York, NY'"}.
|
||||
|
||||
Sorts can be specified like [ "field.id desc 0" ].
|
||||
|
||||
An optional row limit can be added. If not provided the limit
|
||||
will default to 500. "-1" can be specified for unlimited.
|
||||
|
||||
An optional query timezone can be added. The query_timezone to
|
||||
will default to that of the workstation where this MCP server
|
||||
is running, or Etc/UTC if that can't be determined. Not all
|
||||
models support custom timezones.
|
||||
Note: Use `get_dimensions`, `get_measures`, `get_filters`, and `get_parameters` to find valid fields.
|
||||
|
||||
The result of the query tool is JSON
|
||||
```
|
||||
|
||||
@@ -27,11 +27,15 @@ tools:
|
||||
kind: looker-run-dashboard
|
||||
source: looker-source
|
||||
description: |
|
||||
run_dashboard Tool
|
||||
This tool executes the queries associated with each tile in a specified dashboard
|
||||
and returns the aggregated data in a JSON structure.
|
||||
|
||||
This tools runs the query associated with each tile in a dashboard
|
||||
and returns the data in a JSON structure. It accepts the dashboard_id
|
||||
as the parameter.
|
||||
Parameters:
|
||||
- dashboard_id (required): The unique identifier of the dashboard to run,
|
||||
typically obtained from the `get_dashboards` tool.
|
||||
|
||||
Output:
|
||||
The data from all dashboard tiles is returned as a JSON object.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -27,11 +27,15 @@ tools:
|
||||
kind: looker-run-look
|
||||
source: looker-source
|
||||
description: |
|
||||
run_look Tool
|
||||
This tool executes the query associated with a saved Look and
|
||||
returns the resulting data in a JSON structure.
|
||||
|
||||
This tool runs the query associated with a look and returns
|
||||
the data in a JSON structure. It accepts the look_id as the
|
||||
parameter.
|
||||
Parameters:
|
||||
- look_id (required): The unique identifier of the Look to run,
|
||||
typically obtained from the `get_looks` tool.
|
||||
|
||||
Output:
|
||||
The query results are returned as a JSON object.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -27,13 +27,17 @@ tools:
|
||||
kind: looker-update-project-file
|
||||
source: looker-source
|
||||
description: |
|
||||
update_project_file Tool
|
||||
This tool modifies the content of an existing LookML file within a specified project.
|
||||
|
||||
Given a project_id and a file path within the project, as well as the content
|
||||
of a LookML file, this tool will modify the file within the project.
|
||||
Prerequisite: The Looker session must be in Development Mode. Use `dev_mode: true` first.
|
||||
|
||||
This tool must be called after the dev_mode tool has changed the session to
|
||||
dev mode.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project.
|
||||
- file_path (required): The exact path to the LookML file to modify within the project.
|
||||
- content (required): The new, complete LookML content to overwrite the existing file.
|
||||
|
||||
Output:
|
||||
A confirmation message upon successful file modification.
|
||||
```
|
||||
|
||||
## Reference
|
||||
|
||||
@@ -29,26 +29,37 @@ tools:
|
||||
kind: looker-conversational-analytics
|
||||
source: looker-source
|
||||
description: |
|
||||
Use this tool to perform data analysis, get insights,
|
||||
or answer complex questions about the contents of specific
|
||||
Looker explores.
|
||||
Use this tool to ask questions about your data using the Looker Conversational
|
||||
Analytics API. You must provide a natural language query and a list of
|
||||
1 to 5 model and explore combinations (e.g. [{'model': 'the_model', 'explore': 'the_explore'}]).
|
||||
Use the 'get_models' and 'get_explores' tools to discover available models and explores.
|
||||
|
||||
get_models:
|
||||
kind: looker-get-models
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_models tool retrieves the list of LookML models in the Looker system.
|
||||
get_models Tool
|
||||
|
||||
It takes no parameters.
|
||||
This tool retrieves a list of available LookML models in the Looker instance.
|
||||
LookML models define the data structure and relationships that users can query.
|
||||
The output includes details like the model's `name` and `label`, which are
|
||||
essential for subsequent calls to tools like `get_explores` or `query`.
|
||||
|
||||
This tool takes no parameters.
|
||||
|
||||
get_explores:
|
||||
kind: looker-get-explores
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_explores tool retrieves the list of explores defined in a LookML model
|
||||
in the Looker system.
|
||||
get_explores Tool
|
||||
|
||||
It takes one parameter, the model_name looked up from get_models.
|
||||
This tool retrieves a list of explores defined within a specific LookML model.
|
||||
Explores represent a curated view of your data, typically joining several
|
||||
tables together to allow for focused analysis on a particular subject area.
|
||||
The output provides details like the explore's `name` and `label`.
|
||||
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
|
||||
toolsets:
|
||||
looker_conversational_analytics_tools:
|
||||
|
||||
@@ -30,136 +30,151 @@ tools:
|
||||
kind: looker-get-models
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_models tool retrieves the list of LookML models in the Looker system.
|
||||
This tool retrieves a list of available LookML models in the Looker instance.
|
||||
LookML models define the data structure and relationships that users can query.
|
||||
The output includes details like the model's `name` and `label`, which are
|
||||
essential for subsequent calls to tools like `get_explores` or `query`.
|
||||
|
||||
It takes no parameters.
|
||||
This tool takes no parameters.
|
||||
|
||||
get_explores:
|
||||
kind: looker-get-explores
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_explores tool retrieves the list of explores defined in a LookML model
|
||||
in the Looker system.
|
||||
This tool retrieves a list of explores defined within a specific LookML model.
|
||||
Explores represent a curated view of your data, typically joining several
|
||||
tables together to allow for focused analysis on a particular subject area.
|
||||
The output provides details like the explore's `name` and `label`.
|
||||
|
||||
It takes one parameter, the model_name looked up from get_models.
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
|
||||
get_dimensions:
|
||||
kind: looker-get-dimensions
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_dimensions tool retrieves the list of dimensions defined in
|
||||
an explore.
|
||||
This tool retrieves a list of dimensions defined within a specific Looker explore.
|
||||
Dimensions are non-aggregatable attributes or characteristics of your data
|
||||
(e.g., product name, order date, customer city) that can be used for grouping,
|
||||
filtering, or segmenting query results.
|
||||
|
||||
It takes two parameters, the model_name looked up from get_models and the
|
||||
explore_name looked up from get_explores.
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
- explore_name (required): The name of the explore within the model, obtained from `get_explores`.
|
||||
|
||||
If this returns a suggestions field for a dimension, the contents of suggestions
|
||||
can be used as filters for this field. If this returns a suggest_explore and
|
||||
suggest_dimension, a query against that explore and dimension can be used to find
|
||||
valid filters for this field.
|
||||
Output Details:
|
||||
- If a dimension includes a `suggestions` field, its contents are valid values
|
||||
that can be used directly as filters for that dimension.
|
||||
- If a `suggest_explore` and `suggest_dimension` are provided, you can query
|
||||
that specified explore and dimension to retrieve a list of valid filter values.
|
||||
|
||||
get_measures:
|
||||
kind: looker-get-measures
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_measures tool retrieves the list of measures defined in
|
||||
an explore.
|
||||
This tool retrieves a list of measures defined within a specific Looker explore.
|
||||
Measures are aggregatable metrics (e.g., total sales, average price, count of users)
|
||||
that are used for calculations and quantitative analysis in your queries.
|
||||
|
||||
It takes two parameters, the model_name looked up from get_models and the
|
||||
explore_name looked up from get_explores.
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
- explore_name (required): The name of the explore within the model, obtained from `get_explores`.
|
||||
|
||||
If this returns a suggestions field for a measure, the contents of suggestions
|
||||
can be used as filters for this field. If this returns a suggest_explore and
|
||||
suggest_dimension, a query against that explore and dimension can be used to find
|
||||
valid filters for this field.
|
||||
Output Details:
|
||||
- If a measure includes a `suggestions` field, its contents are valid values
|
||||
that can be used directly as filters for that measure.
|
||||
- If a `suggest_explore` and `suggest_dimension` are provided, you can query
|
||||
that specified explore and dimension to retrieve a list of valid filter values.
|
||||
|
||||
get_filters:
|
||||
kind: looker-get-filters
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_filters tool retrieves the list of filters defined in
|
||||
an explore.
|
||||
This tool retrieves a list of "filter-only fields" defined within a specific
|
||||
Looker explore. These are special fields defined in LookML specifically to
|
||||
create user-facing filter controls that do not directly affect the `GROUP BY`
|
||||
clause of the SQL query. They are often used in conjunction with liquid templating
|
||||
to create dynamic queries.
|
||||
|
||||
It takes two parameters, the model_name looked up from get_models and the
|
||||
explore_name looked up from get_explores.
|
||||
Note: Regular dimensions and measures can also be used as filters in a query.
|
||||
This tool *only* returns fields explicitly defined as `filter:` in LookML.
|
||||
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
- explore_name (required): The name of the explore within the model, obtained from `get_explores`.
|
||||
|
||||
get_parameters:
|
||||
kind: looker-get-parameters
|
||||
source: looker-source
|
||||
description: |
|
||||
The get_parameters tool retrieves the list of parameters defined in
|
||||
an explore.
|
||||
This tool retrieves a list of parameters defined within a specific Looker explore.
|
||||
LookML parameters are dynamic input fields that allow users to influence query
|
||||
behavior without directly modifying the underlying LookML. They are often used
|
||||
with `liquid` templating to create flexible dashboards and reports, enabling
|
||||
users to choose dimensions, measures, or other query components at runtime.
|
||||
|
||||
It takes two parameters, the model_name looked up from get_models and the
|
||||
explore_name looked up from get_explores.
|
||||
Parameters:
|
||||
- model_name (required): The name of the LookML model, obtained from `get_models`.
|
||||
- explore_name (required): The name of the explore within the model, obtained from `get_explores`.
|
||||
|
||||
query:
|
||||
kind: looker-query
|
||||
source: looker-source
|
||||
description: |
|
||||
Query Tool
|
||||
This tool runs a query against a LookML model and returns the results in JSON format.
|
||||
|
||||
This tool is used to run a query against the LookML model. The
|
||||
model, explore, and fields list must be specified. Pivots,
|
||||
filters and sorts are optional.
|
||||
Required Parameters:
|
||||
- model_name: The name of the LookML model (from `get_models`).
|
||||
- explore_name: The name of the explore (from `get_explores`).
|
||||
- fields: A list of field names (dimensions, measures, filters, or parameters) to include in the query.
|
||||
|
||||
The model can be found from the get_models tool. The explore
|
||||
can be found from the get_explores tool passing in the model.
|
||||
The fields can be found from the get_dimensions, get_measures,
|
||||
get_filters, and get_parameters tools, passing in the model
|
||||
and the explore.
|
||||
Optional Parameters:
|
||||
- pivots: A list of fields to pivot the results by. These fields must also be included in the `fields` list.
|
||||
- filters: A map of filter expressions, e.g., `{"view.field": "value", "view.date": "7 days"}`.
|
||||
- Do not quote field names.
|
||||
- Use `not null` instead of `-NULL`.
|
||||
- If a value contains a comma, enclose it in single quotes (e.g., "'New York, NY'").
|
||||
- sorts: A list of fields to sort by, optionally including direction (e.g., `["view.field desc"]`).
|
||||
- limit: Row limit (default 500). Use "-1" for unlimited.
|
||||
- query_timezone: specific timezone for the query (e.g. `America/Los_Angeles`).
|
||||
|
||||
Provide a model_id and explore_name, then a list
|
||||
of fields. Optionally a list of pivots can be provided.
|
||||
The pivots must also be included in the fields list.
|
||||
|
||||
Filters are provided as a map of {"field.id": "condition",
|
||||
"field.id2": "condition2", ...}. Do not put the field.id in
|
||||
quotes. Filter expressions can be found at
|
||||
https://cloud.google.com/looker/docs/filter-expressions. There
|
||||
is one mistake in that, however, Use `not null` instead of `-NULL`.
|
||||
If the condition is a string that contains a comma, use a second
|
||||
set of quotes. For example, {"user.city": "'New York, NY'"}.
|
||||
|
||||
Sorts can be specified like [ "field.id desc 0" ].
|
||||
|
||||
An optional row limit can be added. If not provided the limit
|
||||
will default to 500. "-1" can be specified for unlimited.
|
||||
|
||||
An optional query timezone can be added. The query_timezone to
|
||||
will default to that of the workstation where this MCP server
|
||||
is running, or Etc/UTC if that can't be determined. Not all
|
||||
models support custom timezones.
|
||||
|
||||
The result of the query tool is JSON
|
||||
Note: Use `get_dimensions`, `get_measures`, `get_filters`, and `get_parameters` to find valid fields.
|
||||
|
||||
query_sql:
|
||||
kind: looker-query-sql
|
||||
source: looker-source
|
||||
description: |
|
||||
Query SQL Tool
|
||||
This tool generates the underlying SQL query that Looker would execute
|
||||
against the database for a given set of parameters. It is useful for
|
||||
understanding how Looker translates a request into SQL.
|
||||
|
||||
This tool is used to generate the SQL that Looker would
|
||||
run against the underlying database. The parameters are
|
||||
the same as the query tool.
|
||||
Parameters:
|
||||
All parameters for this tool are identical to those of the `query` tool.
|
||||
This includes `model_name`, `explore_name`, `fields` (required),
|
||||
and optional parameters like `pivots`, `filters`, `sorts`, `limit`, and `query_timezone`.
|
||||
|
||||
The result of the query sql tool is SQL text.
|
||||
Output:
|
||||
The result of this tool is the raw SQL text.
|
||||
|
||||
query_url:
|
||||
kind: looker-query-url
|
||||
source: looker-source
|
||||
description: |
|
||||
Query URL Tool
|
||||
This tool generates a shareable URL for a Looker query, allowing users to
|
||||
explore the query further within the Looker UI. It returns the generated URL,
|
||||
along with the `query_id` and `slug`.
|
||||
|
||||
This tool is used to generate the URL of a query in Looker.
|
||||
The user can then explore the query further inside Looker.
|
||||
The tool also returns the query_id and slug. The parameters
|
||||
are the same as the query tool with an additional vis_config
|
||||
parameter.
|
||||
Parameters:
|
||||
All query parameters (e.g., `model_name`, `explore_name`, `fields`, `pivots`,
|
||||
`filters`, `sorts`, `limit`, `query_timezone`) are the same as the `query` tool.
|
||||
|
||||
The vis_config is optional. If provided, it will be used to
|
||||
control the default visualization for the query. Here are
|
||||
some notes on making visualizations.
|
||||
Additionally, it accepts an optional `vis_config` parameter:
|
||||
- vis_config (optional): A JSON object that controls the default visualization
|
||||
settings for the generated query.
|
||||
|
||||
vis_config Details:
|
||||
The `vis_config` object supports a wide range of properties for various chart types.
|
||||
Here are some notes on making visualizations.
|
||||
|
||||
### Cartesian Charts (Area, Bar, Column, Line, Scatter)
|
||||
|
||||
@@ -599,286 +614,432 @@ tools:
|
||||
kind: looker-get-looks
|
||||
source: looker-source
|
||||
description: |
|
||||
get_looks Tool
|
||||
This tool searches for saved Looks (pre-defined queries and visualizations)
|
||||
in a Looker instance. It returns a list of JSON objects, each representing a Look.
|
||||
|
||||
This tool is used to search for saved looks in a Looker instance.
|
||||
String search params use case-insensitive matching. String search
|
||||
params can contain % and '_' as SQL LIKE pattern match wildcard
|
||||
expressions. example="dan%" will match "danger" and "Danzig" but
|
||||
not "David" example="D_m%" will match "Damage" and "dump".
|
||||
Search Parameters:
|
||||
- title (optional): Filter by Look title (supports wildcards).
|
||||
- folder_id (optional): Filter by the ID of the folder where the Look is saved.
|
||||
- user_id (optional): Filter by the ID of the user who created the Look.
|
||||
- description (optional): Filter by description content (supports wildcards).
|
||||
- id (optional): Filter by specific Look ID.
|
||||
- limit (optional): Maximum number of results to return. Defaults to a system limit.
|
||||
- offset (optional): Starting point for pagination.
|
||||
|
||||
Most search params can accept "IS NULL" and "NOT NULL" as special
|
||||
expressions to match or exclude (respectively) rows where the
|
||||
column is null.
|
||||
|
||||
The limit and offset are used to paginate the results.
|
||||
|
||||
The result of the get_looks tool is a list of json objects.
|
||||
String Search Behavior:
|
||||
- Case-insensitive matching.
|
||||
- Supports SQL LIKE pattern match wildcards:
|
||||
- `%`: Matches any sequence of zero or more characters. (e.g., `"dan%"` matches "danger", "Danzig")
|
||||
- `_`: Matches any single character. (e.g., `"D_m%"` matches "Damage", "dump")
|
||||
- Special expressions for null checks:
|
||||
- `"IS NULL"`: Matches Looks where the field is null.
|
||||
- `"NOT NULL"`: Excludes Looks where the field is null.
|
||||
|
||||
run_look:
|
||||
kind: looker-run-look
|
||||
source: looker-source
|
||||
description: |
|
||||
run_look Tool
|
||||
This tool executes the query associated with a saved Look and
|
||||
returns the resulting data in a JSON structure.
|
||||
|
||||
This tool runs the query associated with a look and returns
|
||||
the data in a JSON structure. It accepts the look_id as the
|
||||
parameter.
|
||||
Parameters:
|
||||
- look_id (required): The unique identifier of the Look to run,
|
||||
typically obtained from the `get_looks` tool.
|
||||
|
||||
Output:
|
||||
The query results are returned as a JSON object.
|
||||
|
||||
make_look:
|
||||
kind: looker-make-look
|
||||
source: looker-source
|
||||
description: |
|
||||
make_look Tool
|
||||
This tool creates a new Look (saved query with visualization) in Looker.
|
||||
The Look will be saved in the user's personal folder, and its name must be unique.
|
||||
|
||||
This tool creates a new look in Looker, using the query
|
||||
parameters and the vis_config specified.
|
||||
Required Parameters:
|
||||
- title: A unique title for the new Look.
|
||||
- description: A brief description of the Look's purpose.
|
||||
- model_name: The name of the LookML model (from `get_models`).
|
||||
- explore_name: The name of the explore (from `get_explores`).
|
||||
- fields: A list of field names (dimensions, measures, filters, or parameters) to include in the query.
|
||||
|
||||
Most of the parameters are the same as the query_url
|
||||
tool. In addition, there is a title and a description
|
||||
that must be provided.
|
||||
Optional Parameters:
|
||||
- pivots, filters, sorts, limit, query_timezone: These parameters are identical
|
||||
to those described for the `query` tool.
|
||||
- vis_config: A JSON object defining the visualization settings for the Look.
|
||||
The structure and options are the same as for the `query_url` tool's `vis_config`.
|
||||
|
||||
The newly created look will be created in the user's
|
||||
personal folder in looker. The look name must be unique.
|
||||
|
||||
The result is a json document with a link to the newly
|
||||
created look.
|
||||
Output:
|
||||
A JSON object containing a link (`url`) to the newly created Look, along with its `id` and `slug`.
|
||||
|
||||
get_dashboards:
|
||||
kind: looker-get-dashboards
|
||||
source: looker-source
|
||||
description: |
|
||||
get_dashboards Tool
|
||||
This tool searches for saved dashboards in a Looker instance. It returns a list of JSON objects, each representing a dashboard.
|
||||
|
||||
This tool is used to search for saved dashboards in a Looker instance.
|
||||
String search params use case-insensitive matching. String search
|
||||
params can contain % and '_' as SQL LIKE pattern match wildcard
|
||||
expressions. example="dan%" will match "danger" and "Danzig" but
|
||||
not "David" example="D_m%" will match "Damage" and "dump".
|
||||
Most search params can accept "IS NULL" and "NOT NULL" as special
|
||||
expressions to match or exclude (respectively) rows where the
|
||||
column is null.
|
||||
Search Parameters:
|
||||
- title (optional): Filter by dashboard title (supports wildcards).
|
||||
- folder_id (optional): Filter by the ID of the folder where the dashboard is saved.
|
||||
- user_id (optional): Filter by the ID of the user who created the dashboard.
|
||||
- description (optional): Filter by description content (supports wildcards).
|
||||
- id (optional): Filter by specific dashboard ID.
|
||||
- limit (optional): Maximum number of results to return. Defaults to a system limit.
|
||||
- offset (optional): Starting point for pagination.
|
||||
|
||||
The limit and offset are used to paginate the results.
|
||||
|
||||
The result of the get_dashboards tool is a list of json objects.
|
||||
String Search Behavior:
|
||||
- Case-insensitive matching.
|
||||
- Supports SQL LIKE pattern match wildcards:
|
||||
- `%`: Matches any sequence of zero or more characters. (e.g., `"finan%"` matches "financial", "finance")
|
||||
- `_`: Matches any single character. (e.g., `"s_les"` matches "sales")
|
||||
- Special expressions for null checks:
|
||||
- `"IS NULL"`: Matches dashboards where the field is null.
|
||||
- `"NOT NULL"`: Excludes dashboards where the field is null.
|
||||
|
||||
run_dashboard:
|
||||
kind: looker-run-dashboard
|
||||
source: looker-source
|
||||
description: |
|
||||
run_dashboard Tool
|
||||
This tool executes the queries associated with each tile in a specified dashboard
|
||||
and returns the aggregated data in a JSON structure.
|
||||
|
||||
This tools runs the query associated with each tile in a dashboard
|
||||
and returns the data in a JSON structure. It accepts the dashboard_id
|
||||
as the parameter.
|
||||
Parameters:
|
||||
- dashboard_id (required): The unique identifier of the dashboard to run,
|
||||
typically obtained from the `get_dashboards` tool.
|
||||
|
||||
Output:
|
||||
The data from all dashboard tiles is returned as a JSON object.
|
||||
|
||||
make_dashboard:
|
||||
kind: looker-make-dashboard
|
||||
source: looker-source
|
||||
description: |
|
||||
make_dashboard Tool
|
||||
This tool creates a new, empty dashboard in Looker. Dashboards are stored
|
||||
in the user's personal folder, and the dashboard name must be unique.
|
||||
After creation, use `add_dashboard_filter` to add filters and
|
||||
`add_dashboard_element` to add content tiles.
|
||||
|
||||
This tool creates a new dashboard in Looker. The dashboard is
|
||||
initially empty and the add_dashboard_element tool is used to
|
||||
add content to the dashboard.
|
||||
Required Parameters:
|
||||
- title (required): A unique title for the new dashboard.
|
||||
- description (required): A brief description of the dashboard's purpose.
|
||||
|
||||
The newly created dashboard will be created in the user's
|
||||
personal folder in looker. The dashboard name must be unique.
|
||||
|
||||
The result is a json document with a link to the newly
|
||||
created dashboard and the id of the dashboard. Use the id
|
||||
when calling add_dashboard_element.
|
||||
Output:
|
||||
A JSON object containing a link (`url`) to the newly created dashboard and
|
||||
its unique `id`. This `dashboard_id` is crucial for subsequent calls to
|
||||
`add_dashboard_filter` and `add_dashboard_element`.
|
||||
|
||||
add_dashboard_element:
|
||||
kind: looker-add-dashboard-element
|
||||
source: looker-source
|
||||
description: |
|
||||
add_dashboard_element Tool
|
||||
This tool creates a new tile (element) within an existing Looker dashboard.
|
||||
Tiles are added in the order this tool is called for a given `dashboard_id`.
|
||||
|
||||
This tool creates a new tile in a Looker dashboard using
|
||||
the query parameters and the vis_config specified.
|
||||
CRITICAL ORDER OF OPERATIONS:
|
||||
1. Create the dashboard using `make_dashboard`.
|
||||
2. Add any dashboard-level filters using `add_dashboard_filter`.
|
||||
3. Then, add elements (tiles) using this tool.
|
||||
|
||||
Most of the parameters are the same as the query_url
|
||||
tool. In addition, there is a title that may be provided.
|
||||
The dashboard_id must be specified. That is obtained
|
||||
from calling make_dashboard.
|
||||
Required Parameters:
|
||||
- dashboard_id: The ID of the target dashboard, obtained from `make_dashboard`.
|
||||
- model_name, explore_name, fields: These query parameters are inherited
|
||||
from the `query` tool and are required to define the data for the tile.
|
||||
|
||||
This tool can be called many times for one dashboard_id
|
||||
and the resulting tiles will be added in order.
|
||||
Optional Parameters:
|
||||
- title: An optional title for the dashboard tile.
|
||||
- pivots, filters, sorts, limit, query_timezone: These query parameters are
|
||||
inherited from the `query` tool and can be used to customize the tile's query.
|
||||
- vis_config: A JSON object defining the visualization settings for this tile.
|
||||
The structure and options are the same as for the `query_url` tool's `vis_config`.
|
||||
|
||||
Connecting to Dashboard Filters:
|
||||
A dashboard element can be connected to one or more dashboard filters (created with
|
||||
`add_dashboard_filter`). To do this, specify the `name` of the dashboard filter
|
||||
and the `field` from the element's query that the filter should apply to.
|
||||
The format for specifying the field is `view_name.field_name`.
|
||||
|
||||
add_dashboard_filter:
|
||||
kind: looker-add-dashboard-filter
|
||||
source: looker-source
|
||||
description: |
|
||||
This tool adds a filter to a Looker dashboard.
|
||||
|
||||
CRITICAL ORDER OF OPERATIONS:
|
||||
1. Create a dashboard using `make_dashboard`.
|
||||
2. Add all desired filters using this tool (`add_dashboard_filter`).
|
||||
3. Finally, add dashboard elements (tiles) using `add_dashboard_element`.
|
||||
|
||||
Parameters:
|
||||
- dashboard_id (required): The ID from `make_dashboard`.
|
||||
- name (required): A unique internal identifier for the filter. You will use this `name` later in `add_dashboard_element` to bind tiles to this filter.
|
||||
- title (required): The label displayed to users in the UI.
|
||||
- flter_type (required): One of `date_filter`, `number_filter`, `string_filter`, or `field_filter`.
|
||||
- default_value (optional): The initial value for the filter.
|
||||
|
||||
Field Filters (`flter_type: field_filter`):
|
||||
If creating a field filter, you must also provide:
|
||||
- model
|
||||
- explore
|
||||
- dimension
|
||||
The filter will inherit suggestions and type information from this LookML field.
|
||||
|
||||
generate_embed_url:
|
||||
kind: looker-generate-embed-url
|
||||
source: looker-source
|
||||
description: |
|
||||
This tool generates a signed, private embed URL for specific Looker content,
|
||||
allowing users to access it directly.
|
||||
|
||||
Parameters:
|
||||
- type (required): The type of content to embed. Common values include:
|
||||
- `dashboards`
|
||||
- `looks`
|
||||
- `explore`
|
||||
- id (required): The unique identifier for the content.
|
||||
- For dashboards and looks, use the numeric ID (e.g., "123").
|
||||
- For explores, use the format "model_name/explore_name".
|
||||
|
||||
health_pulse:
|
||||
kind: looker-health-pulse
|
||||
source: looker-source
|
||||
description: |
|
||||
health-pulse Tool
|
||||
This tool performs various health checks on a Looker instance.
|
||||
|
||||
This tool takes the pulse of a Looker instance by taking
|
||||
one of the following actions:
|
||||
1. `check_db_connections`,
|
||||
2. `check_dashboard_performance`,
|
||||
3. `check_dashboard_errors`,
|
||||
4. `check_explore_performance`,
|
||||
5. `check_schedule_failures`, or
|
||||
6. `check_legacy_features`
|
||||
|
||||
The `check_legacy_features` action is only available in Looker Core. If
|
||||
it is called on a Looker Core instance, you will get a notice. That notice
|
||||
should not be reported as an error.
|
||||
Parameters:
|
||||
- action (required): Specifies the type of health check to perform.
|
||||
Choose one of the following:
|
||||
- `check_db_connections`: Verifies database connectivity.
|
||||
- `check_dashboard_performance`: Assesses dashboard loading performance.
|
||||
- `check_dashboard_errors`: Identifies errors within dashboards.
|
||||
- `check_explore_performance`: Evaluates explore query performance.
|
||||
- `check_schedule_failures`: Reports on failed scheduled deliveries.
|
||||
- `check_legacy_features`: Checks for the usage of legacy features.
|
||||
|
||||
Note on `check_legacy_features`:
|
||||
This action is exclusively available in Looker Core instances. If invoked
|
||||
on a non-Looker Core instance, it will return a notice rather than an error.
|
||||
This notice should be considered normal behavior and not an indication of an issue.
|
||||
|
||||
health_analyze:
|
||||
kind: looker-health-analyze
|
||||
source: looker-source
|
||||
description: |
|
||||
health-analyze Tool
|
||||
This tool calculates the usage statistics for Looker projects, models, and explores.
|
||||
|
||||
This tool calculates the usage of projects, models and explores.
|
||||
Parameters:
|
||||
- action (required): The type of resource to analyze. Can be `"projects"`, `"models"`, or `"explores"`.
|
||||
- project (optional): The specific project ID to analyze.
|
||||
- model (optional): The specific model name to analyze. Requires `project` if used without `explore`.
|
||||
- explore (optional): The specific explore name to analyze. Requires `model` if used.
|
||||
- timeframe (optional): The lookback period in days for usage data. Defaults to `90` days.
|
||||
- min_queries (optional): The minimum number of queries for a resource to be considered active. Defaults to `1`.
|
||||
|
||||
It accepts 6 parameters:
|
||||
1. `action`: can be "projects", "models", or "explores"
|
||||
2. `project`: the project to analyze (optional)
|
||||
3. `model`: the model to analyze (optional)
|
||||
4. `explore`: the explore to analyze (optional)
|
||||
5. `timeframe`: the lookback period in days, default is 90
|
||||
6. `min_queries`: the minimum number of queries to consider a resource as active, default is 1
|
||||
Output:
|
||||
The result is a JSON object containing usage metrics for the specified resources.
|
||||
|
||||
health_vacuum:
|
||||
kind: looker-health-vacuum
|
||||
source: looker-source
|
||||
description: |
|
||||
health-vacuum Tool
|
||||
This tool identifies and suggests LookML models or explores that can be
|
||||
safely removed due to inactivity or low usage.
|
||||
|
||||
This tool suggests models or explores that can removed
|
||||
because they are unused.
|
||||
Parameters:
|
||||
- action (required): The type of resource to analyze for removal candidates. Can be `"models"` or `"explores"`.
|
||||
- project (optional): The specific project ID to consider.
|
||||
- model (optional): The specific model name to consider. Requires `project` if used without `explore`.
|
||||
- explore (optional): The specific explore name to consider. Requires `model` if used.
|
||||
- timeframe (optional): The lookback period in days to assess usage. Defaults to `90` days.
|
||||
- min_queries (optional): The minimum number of queries for a resource to be considered active. Defaults to `1`.
|
||||
|
||||
It accepts 6 parameters:
|
||||
1. `action`: can be "models" or "explores"
|
||||
2. `project`: the project to vacuum (optional)
|
||||
3. `model`: the model to vacuum (optional)
|
||||
4. `explore`: the explore to vacuum (optional)
|
||||
5. `timeframe`: the lookback period in days, default is 90
|
||||
6. `min_queries`: the minimum number of queries to consider a resource as active, default is 1
|
||||
|
||||
The result is a list of objects that are candidates for deletion.
|
||||
Output:
|
||||
A JSON array of objects, each representing a model or explore that is a candidate for deletion due to low usage.
|
||||
|
||||
dev_mode:
|
||||
kind: looker-dev-mode
|
||||
source: looker-source
|
||||
description: |
|
||||
dev_mode Tool
|
||||
This tool allows toggling the Looker IDE session between Development Mode and Production Mode.
|
||||
Development Mode enables making and testing changes to LookML projects.
|
||||
|
||||
Passing true to this tool switches the session to dev mode. Passing false to this tool switches the
|
||||
session to production mode.
|
||||
Parameters:
|
||||
- enable (required): A boolean value.
|
||||
- `true`: Switches the current session to Development Mode.
|
||||
- `false`: Switches the current session to Production Mode.
|
||||
|
||||
get_projects:
|
||||
kind: looker-get-projects
|
||||
source: looker-source
|
||||
description: |
|
||||
get_projects Tool
|
||||
This tool retrieves a list of all LookML projects available on the Looker instance.
|
||||
It is useful for identifying projects before performing actions like retrieving
|
||||
project files or making modifications.
|
||||
|
||||
This tool returns the project_id and project_name for
|
||||
all the LookML projects on the looker instance.
|
||||
Parameters:
|
||||
This tool takes no parameters.
|
||||
|
||||
Output:
|
||||
A JSON array of objects, each containing the `project_id` and `project_name`
|
||||
for a LookML project.
|
||||
|
||||
get_project_files:
|
||||
kind: looker-get-project-files
|
||||
source: looker-source
|
||||
description: |
|
||||
get_project_files Tool
|
||||
This tool retrieves a list of all LookML files within a specified project,
|
||||
providing details about each file.
|
||||
|
||||
Given a project_id this tool returns the details about
|
||||
the LookML files that make up that project.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project, obtained from `get_projects`.
|
||||
|
||||
Output:
|
||||
A JSON array of objects, each representing a LookML file and containing
|
||||
details such as `path`, `id`, `type`, and `git_status`.
|
||||
|
||||
get_project_file:
|
||||
kind: looker-get-project-file
|
||||
source: looker-source
|
||||
description: |
|
||||
get_project_file Tool
|
||||
This tool retrieves the raw content of a specific LookML file from within a project.
|
||||
|
||||
Given a project_id and a file path within the project, this tool returns
|
||||
the contents of the LookML file.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project, obtained from `get_projects`.
|
||||
- file_path (required): The path to the LookML file within the project,
|
||||
typically obtained from `get_project_files`.
|
||||
|
||||
Output:
|
||||
The raw text content of the specified LookML file.
|
||||
|
||||
create_project_file:
|
||||
kind: looker-create-project-file
|
||||
source: looker-source
|
||||
description: |
|
||||
create_project_file Tool
|
||||
This tool creates a new LookML file within a specified project, populating
|
||||
it with the provided content.
|
||||
|
||||
Given a project_id and a file path within the project, as well as the content
|
||||
of a LookML file, this tool will create a new file within the project.
|
||||
Prerequisite: The Looker session must be in Development Mode. Use `dev_mode: true` first.
|
||||
|
||||
This tool must be called after the dev_mode tool has changed the session to
|
||||
dev mode.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project.
|
||||
- file_path (required): The desired path and filename for the new file within the project.
|
||||
- content (required): The full LookML content to write into the new file.
|
||||
|
||||
Output:
|
||||
A confirmation message upon successful file creation.
|
||||
|
||||
update_project_file:
|
||||
kind: looker-update-project-file
|
||||
source: looker-source
|
||||
description: |
|
||||
update_project_file Tool
|
||||
This tool modifies the content of an existing LookML file within a specified project.
|
||||
|
||||
Given a project_id and a file path within the project, as well as the content
|
||||
of a LookML file, this tool will modify the file within the project.
|
||||
Prerequisite: The Looker session must be in Development Mode. Use `dev_mode: true` first.
|
||||
|
||||
This tool must be called after the dev_mode tool has changed the session to
|
||||
dev mode.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project.
|
||||
- file_path (required): The exact path to the LookML file to modify within the project.
|
||||
- content (required): The new, complete LookML content to overwrite the existing file.
|
||||
|
||||
Output:
|
||||
A confirmation message upon successful file modification.
|
||||
|
||||
delete_project_file:
|
||||
kind: looker-delete-project-file
|
||||
source: looker-source
|
||||
description: |
|
||||
delete_project_file Tool
|
||||
This tool permanently deletes a specified LookML file from within a project.
|
||||
Use with caution, as this action cannot be undone through the API.
|
||||
|
||||
Given a project_id and a file path within the project, this tool will delete
|
||||
the file from the project.
|
||||
Prerequisite: The Looker session must be in Development Mode. Use `dev_mode: true` first.
|
||||
|
||||
This tool must be called after the dev_mode tool has changed the session to
|
||||
dev mode.
|
||||
Parameters:
|
||||
- project_id (required): The unique ID of the LookML project.
|
||||
- file_path (required): The exact path to the LookML file to delete within the project.
|
||||
|
||||
Output:
|
||||
A confirmation message upon successful file deletion.
|
||||
|
||||
get_connections:
|
||||
kind: looker-get-connections
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connections Tool
|
||||
This tool retrieves a list of all database connections configured in the Looker system.
|
||||
|
||||
This tool will list all the connections available in the Looker system, as
|
||||
well as the dialect name, the default schema, the database if applicable,
|
||||
and whether the connection supports multiple databases.
|
||||
Parameters:
|
||||
This tool takes no parameters.
|
||||
|
||||
Output:
|
||||
A JSON array of objects, each representing a database connection and including details such as:
|
||||
- `name`: The connection's unique identifier.
|
||||
- `dialect`: The database dialect (e.g., "mysql", "postgresql", "bigquery").
|
||||
- `default_schema`: The default schema for the connection.
|
||||
- `database`: The associated database name (if applicable).
|
||||
- `supports_multiple_databases`: A boolean indicating if the connection can access multiple databases.
|
||||
|
||||
get_connection_schemas:
|
||||
kind: looker-get-connection-schemas
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connection_schemas Tool
|
||||
This tool retrieves a list of database schemas available through a specified
|
||||
Looker connection.
|
||||
|
||||
This tool will list the schemas available from a connection, filtered by
|
||||
an optional database name.
|
||||
Parameters:
|
||||
- connection_name (required): The name of the database connection, obtained from `get_connections`.
|
||||
- database (optional): An optional database name to filter the schemas.
|
||||
Only applicable for connections that support multiple databases.
|
||||
|
||||
Output:
|
||||
A JSON array of strings, where each string is the name of an available schema.
|
||||
|
||||
get_connection_databases:
|
||||
kind: looker-get-connection-databases
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connection_databases Tool
|
||||
This tool retrieves a list of databases available through a specified Looker connection.
|
||||
This is only applicable for connections that support multiple databases.
|
||||
Use `get_connections` to check if a connection supports multiple databases.
|
||||
|
||||
This tool will list the databases available from a connection if the connection
|
||||
supports multiple databases.
|
||||
Parameters:
|
||||
- connection_name (required): The name of the database connection, obtained from `get_connections`.
|
||||
|
||||
Output:
|
||||
A JSON array of strings, where each string is the name of an available database.
|
||||
If the connection does not support multiple databases, an empty list or an error will be returned.
|
||||
|
||||
get_connection_tables:
|
||||
kind: looker-get-connection-tables
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connection_tables Tool
|
||||
This tool retrieves a list of tables available within a specified database schema
|
||||
through a Looker connection.
|
||||
|
||||
This tool will list the tables available from a connection, filtered by the
|
||||
schema name and optional database name.
|
||||
Parameters:
|
||||
- connection_name (required): The name of the database connection, obtained from `get_connections`.
|
||||
- schema (required): The name of the schema to list tables from, obtained from `get_connection_schemas`.
|
||||
- database (optional): The name of the database to filter by. Only applicable for connections
|
||||
that support multiple databases (check with `get_connections`).
|
||||
|
||||
Output:
|
||||
A JSON array of strings, where each string is the name of an available table.
|
||||
|
||||
get_connection_table_columns:
|
||||
kind: looker-get-connection-table-columns
|
||||
source: looker-source
|
||||
description: |
|
||||
get_connection_table_columns Tool
|
||||
This tool retrieves a list of columns for one or more specified tables within a
|
||||
given database schema and connection.
|
||||
|
||||
This tool will list the columns available from a connection, for all the tables
|
||||
given in a comma separated list of table names, filtered by the
|
||||
schema name and optional database name.
|
||||
Parameters:
|
||||
- connection_name (required): The name of the database connection, obtained from `get_connections`.
|
||||
- schema (required): The name of the schema where the tables reside, obtained from `get_connection_schemas`.
|
||||
- tables (required): A comma-separated string of table names for which to retrieve columns
|
||||
(e.g., "users,orders,products"), obtained from `get_connection_tables`.
|
||||
- database (optional): The name of the database to filter by. Only applicable for connections
|
||||
that support multiple databases (check with `get_connections`).
|
||||
|
||||
Output:
|
||||
A JSON array of objects, where each object represents a column and contains details
|
||||
such as `table_name`, `column_name`, `data_type`, and `is_nullable`.
|
||||
|
||||
|
||||
toolsets:
|
||||
@@ -899,6 +1060,8 @@ toolsets:
|
||||
- run_dashboard
|
||||
- make_dashboard
|
||||
- add_dashboard_element
|
||||
- add_dashboard_filter
|
||||
- generate_embed_url
|
||||
- health_pulse
|
||||
- health_analyze
|
||||
- health_vacuum
|
||||
|
||||
@@ -86,6 +86,16 @@ func (cfg Config) Initialize(srcs map[string]sources.Source) (tools.Tool, error)
|
||||
"",
|
||||
)
|
||||
params = append(params, vizParameter)
|
||||
dashFilters := parameters.NewArrayParameterWithRequired("dashboard_filters",
|
||||
`An array of dashboard filters like [{"dashboard_filter_name": "name", "field": "view_name.field_name"}, ...]`,
|
||||
false,
|
||||
parameters.NewMapParameterWithDefault("dashboard_filter",
|
||||
map[string]any{},
|
||||
`A dashboard filter like {"dashboard_filter_name": "name", "field": "view_name.field_name"}`,
|
||||
"",
|
||||
),
|
||||
)
|
||||
params = append(params, dashFilters)
|
||||
|
||||
annotations := cfg.Annotations
|
||||
if annotations == nil {
|
||||
@@ -142,7 +152,9 @@ func (t Tool) Invoke(ctx context.Context, resourceMgr tools.SourceProvider, para
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to get logger from ctx: %s", err)
|
||||
}
|
||||
|
||||
logger.DebugContext(ctx, "params = ", params)
|
||||
|
||||
wq, err := lookercommon.ProcessQueryArgs(ctx, params)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error building query request: %w", err)
|
||||
@@ -155,23 +167,64 @@ func (t Tool) Invoke(ctx context.Context, resourceMgr tools.SourceProvider, para
|
||||
visConfig := paramsMap["vis_config"].(map[string]any)
|
||||
wq.VisConfig = &visConfig
|
||||
|
||||
qrespFields := "id"
|
||||
|
||||
sdk, err := lookercommon.GetLookerSDK(t.UseClientOAuth, t.ApiSettings, t.Client, accessToken)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error getting sdk: %w", err)
|
||||
}
|
||||
|
||||
qresp, err := sdk.CreateQuery(*wq, qrespFields, t.ApiSettings)
|
||||
qresp, err := sdk.CreateQuery(*wq, "id", t.ApiSettings)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error making create query request: %w", err)
|
||||
}
|
||||
|
||||
dashFilters := []any{}
|
||||
if v, ok := paramsMap["dashboard_filters"]; ok {
|
||||
if v != nil {
|
||||
dashFilters = paramsMap["dashboard_filters"].([]any)
|
||||
}
|
||||
}
|
||||
|
||||
var filterables []v4.ResultMakerFilterables
|
||||
for _, m := range dashFilters {
|
||||
f := m.(map[string]any)
|
||||
name, ok := f["dashboard_filter_name"].(string)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("error processing dashboard filter: %w", err)
|
||||
}
|
||||
field, ok := f["field"].(string)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("error processing dashboard filter: %w", err)
|
||||
}
|
||||
listener := v4.ResultMakerFilterablesListen{
|
||||
DashboardFilterName: &name,
|
||||
Field: &field,
|
||||
}
|
||||
listeners := []v4.ResultMakerFilterablesListen{listener}
|
||||
|
||||
filter := v4.ResultMakerFilterables{
|
||||
Listen: &listeners,
|
||||
}
|
||||
|
||||
filterables = append(filterables, filter)
|
||||
}
|
||||
|
||||
if len(filterables) == 0 {
|
||||
filterables = nil
|
||||
}
|
||||
|
||||
wrm := v4.WriteResultMakerWithIdVisConfigAndDynamicFields{
|
||||
Query: wq,
|
||||
VisConfig: &visConfig,
|
||||
Filterables: &filterables,
|
||||
}
|
||||
wde := v4.WriteDashboardElement{
|
||||
DashboardId: &dashboard_id,
|
||||
Title: &title,
|
||||
ResultMaker: &wrm,
|
||||
Query: wq,
|
||||
QueryId: qresp.Id,
|
||||
}
|
||||
|
||||
switch len(visConfig) {
|
||||
case 0:
|
||||
wde.Type = &dataType
|
||||
|
||||
@@ -0,0 +1,248 @@
|
||||
// Copyright 2025 Google LLC
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
package lookeradddashboardfilter
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
yaml "github.com/goccy/go-yaml"
|
||||
"github.com/googleapis/genai-toolbox/internal/sources"
|
||||
lookersrc "github.com/googleapis/genai-toolbox/internal/sources/looker"
|
||||
"github.com/googleapis/genai-toolbox/internal/tools"
|
||||
"github.com/googleapis/genai-toolbox/internal/tools/looker/lookercommon"
|
||||
"github.com/googleapis/genai-toolbox/internal/util"
|
||||
"github.com/googleapis/genai-toolbox/internal/util/parameters"
|
||||
|
||||
"github.com/looker-open-source/sdk-codegen/go/rtl"
|
||||
v4 "github.com/looker-open-source/sdk-codegen/go/sdk/v4"
|
||||
)
|
||||
|
||||
const kind string = "looker-add-dashboard-filter"
|
||||
|
||||
func init() {
|
||||
if !tools.Register(kind, newConfig) {
|
||||
panic(fmt.Sprintf("tool kind %q already registered", kind))
|
||||
}
|
||||
}
|
||||
|
||||
func newConfig(ctx context.Context, name string, decoder *yaml.Decoder) (tools.ToolConfig, error) {
|
||||
actual := Config{Name: name}
|
||||
if err := decoder.DecodeContext(ctx, &actual); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return actual, nil
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
Name string `yaml:"name" validate:"required"`
|
||||
Kind string `yaml:"kind" validate:"required"`
|
||||
Source string `yaml:"source" validate:"required"`
|
||||
Description string `yaml:"description" validate:"required"`
|
||||
AuthRequired []string `yaml:"authRequired"`
|
||||
Annotations *tools.ToolAnnotations `yaml:"annotations,omitempty"`
|
||||
}
|
||||
|
||||
// validate interface
|
||||
var _ tools.ToolConfig = Config{}
|
||||
|
||||
func (cfg Config) ToolConfigKind() string {
|
||||
return kind
|
||||
}
|
||||
|
||||
func (cfg Config) Initialize(srcs map[string]sources.Source) (tools.Tool, error) {
|
||||
// verify source exists
|
||||
rawS, ok := srcs[cfg.Source]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("no source named %q configured", cfg.Source)
|
||||
}
|
||||
|
||||
// verify the source is compatible
|
||||
s, ok := rawS.(*lookersrc.Source)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("invalid source for %q tool: source kind must be `looker`", kind)
|
||||
}
|
||||
|
||||
params := parameters.Parameters{}
|
||||
|
||||
dashIdParameter := parameters.NewStringParameter("dashboard_id", "The id of the dashboard where this filter will exist")
|
||||
params = append(params, dashIdParameter)
|
||||
nameParameter := parameters.NewStringParameter("name", "The name of the Dashboard Filter")
|
||||
params = append(params, nameParameter)
|
||||
titleParameter := parameters.NewStringParameter("title", "The title of the Dashboard Filter")
|
||||
params = append(params, titleParameter)
|
||||
filterTypeParameter := parameters.NewStringParameterWithDefault("filter_type", "field_filter", "The filter_type of the Dashboard Filter: date_filter, number_filter, string_filter, field_filter (default field_filter)")
|
||||
params = append(params, filterTypeParameter)
|
||||
defaultParameter := parameters.NewStringParameterWithRequired("default_value", "The default_value of the Dashboard Filter (optional)", false)
|
||||
params = append(params, defaultParameter)
|
||||
modelParameter := parameters.NewStringParameterWithRequired("model", "The model of a field type Dashboard Filter (required if type field)", false)
|
||||
params = append(params, modelParameter)
|
||||
exploreParameter := parameters.NewStringParameterWithRequired("explore", "The explore of a field type Dashboard Filter (required if type field)", false)
|
||||
params = append(params, exploreParameter)
|
||||
dimensionParameter := parameters.NewStringParameterWithRequired("dimension", "The dimension of a field type Dashboard Filter (required if type field)", false)
|
||||
params = append(params, dimensionParameter)
|
||||
multiValueParameter := parameters.NewBooleanParameterWithDefault("allow_multiple_values", true, "The Dashboard Filter should allow multiple values (default true)")
|
||||
params = append(params, multiValueParameter)
|
||||
requiredParameter := parameters.NewBooleanParameterWithDefault("required", false, "The Dashboard Filter is required to run dashboard (default false)")
|
||||
params = append(params, requiredParameter)
|
||||
|
||||
annotations := cfg.Annotations
|
||||
if annotations == nil {
|
||||
readOnlyHint := false
|
||||
annotations = &tools.ToolAnnotations{
|
||||
ReadOnlyHint: &readOnlyHint,
|
||||
}
|
||||
}
|
||||
|
||||
mcpManifest := tools.GetMcpManifest(cfg.Name, cfg.Description, cfg.AuthRequired, params, annotations)
|
||||
|
||||
// finish tool setup
|
||||
return Tool{
|
||||
Config: cfg,
|
||||
Name: cfg.Name,
|
||||
Kind: kind,
|
||||
UseClientOAuth: s.UseClientAuthorization(),
|
||||
AuthTokenHeaderName: s.GetAuthTokenHeaderName(),
|
||||
Client: s.Client,
|
||||
ApiSettings: s.ApiSettings,
|
||||
Parameters: params,
|
||||
manifest: tools.Manifest{
|
||||
Description: cfg.Description,
|
||||
Parameters: params.Manifest(),
|
||||
AuthRequired: cfg.AuthRequired,
|
||||
},
|
||||
mcpManifest: mcpManifest,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// validate interface
|
||||
var _ tools.Tool = Tool{}
|
||||
|
||||
type Tool struct {
|
||||
Config
|
||||
Name string `yaml:"name"`
|
||||
Kind string `yaml:"kind"`
|
||||
UseClientOAuth bool
|
||||
AuthTokenHeaderName string
|
||||
Client *v4.LookerSDK
|
||||
ApiSettings *rtl.ApiSettings
|
||||
AuthRequired []string `yaml:"authRequired"`
|
||||
Parameters parameters.Parameters `yaml:"parameters"`
|
||||
manifest tools.Manifest
|
||||
mcpManifest tools.McpManifest
|
||||
}
|
||||
|
||||
func (t Tool) ToConfig() tools.ToolConfig {
|
||||
return t.Config
|
||||
}
|
||||
|
||||
func (t Tool) Invoke(ctx context.Context, resourceMgr tools.SourceProvider, params parameters.ParamValues, accessToken tools.AccessToken) (any, error) {
|
||||
logger, err := util.LoggerFromContext(ctx)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to get logger from ctx: %s", err)
|
||||
}
|
||||
logger.DebugContext(ctx, "params = ", params)
|
||||
|
||||
paramsMap := params.AsMap()
|
||||
dashboard_id := paramsMap["dashboard_id"].(string)
|
||||
name := paramsMap["name"].(string)
|
||||
title := paramsMap["title"].(string)
|
||||
filterType := paramsMap["flter_type"].(string)
|
||||
switch filterType {
|
||||
case "date_filter":
|
||||
case "number_filter":
|
||||
case "string_filter":
|
||||
case "field_filter":
|
||||
default:
|
||||
return nil, fmt.Errorf("invalid filter type: %s. Must be one of date_filter, number_filter, string_filter, field_filter", filterType)
|
||||
}
|
||||
allowMultipleValues := paramsMap["allow_multiple_values"].(bool)
|
||||
required := paramsMap["required"].(bool)
|
||||
|
||||
req := v4.WriteCreateDashboardFilter{
|
||||
DashboardId: dashboard_id,
|
||||
Name: name,
|
||||
Title: title,
|
||||
Type: filterType,
|
||||
AllowMultipleValues: &allowMultipleValues,
|
||||
Required: &required,
|
||||
}
|
||||
|
||||
if v, ok := paramsMap["default_value"]; ok {
|
||||
if v != nil {
|
||||
defaultValue := paramsMap["default_value"].(string)
|
||||
req.DefaultValue = &defaultValue
|
||||
}
|
||||
}
|
||||
|
||||
if filterType == "field_filter" {
|
||||
model, ok := paramsMap["model"].(string)
|
||||
if !ok || model == "" {
|
||||
return nil, fmt.Errorf("model must be specified for field_filter type")
|
||||
}
|
||||
explore, ok := paramsMap["explore"].(string)
|
||||
if !ok || explore == "" {
|
||||
return nil, fmt.Errorf("explore must be specified for field_filter type")
|
||||
}
|
||||
dimension, ok := paramsMap["dimension"].(string)
|
||||
if !ok || dimension == "" {
|
||||
return nil, fmt.Errorf("dimension must be specified for field_filter type")
|
||||
}
|
||||
|
||||
req.Model = &model
|
||||
req.Explore = &explore
|
||||
req.Dimension = &dimension
|
||||
}
|
||||
|
||||
sdk, err := lookercommon.GetLookerSDK(t.UseClientOAuth, t.ApiSettings, t.Client, accessToken)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error getting sdk: %w", err)
|
||||
}
|
||||
|
||||
resp, err := sdk.CreateDashboardFilter(req, "name", t.ApiSettings)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error making create dashboard filter request: %s", err)
|
||||
}
|
||||
logger.DebugContext(ctx, "resp = %v", resp)
|
||||
|
||||
data := make(map[string]any)
|
||||
|
||||
data["result"] = fmt.Sprintf("Dashboard filter \"%s\" added to dashboard %s", *resp.Name, dashboard_id)
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
func (t Tool) ParseParams(data map[string]any, claims map[string]map[string]any) (parameters.ParamValues, error) {
|
||||
return parameters.ParseParams(t.Parameters, data, claims)
|
||||
}
|
||||
|
||||
func (t Tool) Manifest() tools.Manifest {
|
||||
return t.manifest
|
||||
}
|
||||
|
||||
func (t Tool) McpManifest() tools.McpManifest {
|
||||
return t.mcpManifest
|
||||
}
|
||||
|
||||
func (t Tool) Authorized(verifiedAuthServices []string) bool {
|
||||
return tools.IsAuthorized(t.AuthRequired, verifiedAuthServices)
|
||||
}
|
||||
|
||||
func (t Tool) RequiresClientAuthorization(resourceMgr tools.SourceProvider) bool {
|
||||
return t.UseClientOAuth
|
||||
}
|
||||
|
||||
func (t Tool) GetAuthTokenHeaderName() string {
|
||||
return t.AuthTokenHeaderName
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
// Copyright 2025 Google LLC
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package lookeradddashboardfilter_test
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
yaml "github.com/goccy/go-yaml"
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/googleapis/genai-toolbox/internal/server"
|
||||
"github.com/googleapis/genai-toolbox/internal/testutils"
|
||||
lkr "github.com/googleapis/genai-toolbox/internal/tools/looker/lookeradddashboardfilter"
|
||||
)
|
||||
|
||||
func TestParseFromYamlLookerAddDashboardFilter(t *testing.T) {
|
||||
ctx, err := testutils.ContextWithNewLogger()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %s", err)
|
||||
}
|
||||
tcs := []struct {
|
||||
desc string
|
||||
in string
|
||||
want server.ToolConfigs
|
||||
}{
|
||||
{
|
||||
desc: "basic example",
|
||||
in: `
|
||||
tools:
|
||||
example_tool:
|
||||
kind: looker-add-dashboard-filter
|
||||
source: my-instance
|
||||
description: some description
|
||||
`,
|
||||
want: server.ToolConfigs{
|
||||
"example_tool": lkr.Config{
|
||||
Name: "example_tool",
|
||||
Kind: "looker-add-dashboard-filter",
|
||||
Source: "my-instance",
|
||||
Description: "some description",
|
||||
AuthRequired: []string{},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tc := range tcs {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
got := struct {
|
||||
Tools server.ToolConfigs `yaml:"tools"`
|
||||
}{}
|
||||
// Parse contents
|
||||
err := yaml.UnmarshalContext(ctx, testutils.FormatYaml(tc.in), &got)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to unmarshal: %s", err)
|
||||
}
|
||||
if diff := cmp.Diff(tc.want, got.Tools); diff != "" {
|
||||
t.Fatalf("incorrect parse: diff %v", diff)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestFailParseFromYamlLookerAddDashboardFilter(t *testing.T) {
|
||||
ctx, err := testutils.ContextWithNewLogger()
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %s", err)
|
||||
}
|
||||
tcs := []struct {
|
||||
desc string
|
||||
in string
|
||||
err string
|
||||
}{
|
||||
{
|
||||
desc: "Invalid method",
|
||||
in: `
|
||||
tools:
|
||||
example_tool:
|
||||
kind: looker-add-dashboard-filter
|
||||
source: my-instance
|
||||
method: GOT
|
||||
description: some description
|
||||
`,
|
||||
err: "unable to parse tool \"example_tool\" as kind \"looker-add-dashboard-filter\": [4:1] unknown field \"method\"\n 1 | authRequired: []\n 2 | description: some description\n 3 | kind: looker-add-dashboard-filter\n> 4 | method: GOT\n ^\n 5 | source: my-instance",
|
||||
},
|
||||
}
|
||||
for _, tc := range tcs {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
got := struct {
|
||||
Tools server.ToolConfigs `yaml:"tools"`
|
||||
}{}
|
||||
// Parse contents
|
||||
err := yaml.UnmarshalContext(ctx, testutils.FormatYaml(tc.in), &got)
|
||||
if err == nil {
|
||||
t.Fatalf("expect parsing to fail")
|
||||
}
|
||||
errStr := err.Error()
|
||||
if !strings.Contains(errStr, tc.err) {
|
||||
t.Fatalf("unexpected error string: got %q, want substring %q", errStr, tc.err)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user