Tableau Mcp

by tableau

263 downloads
Not rated
GitHub

Description

# Tableau MCP [![Tableau Supported](https://img.shields.io/badge/Support%20Level-Tableau%20Supported-53bd92.svg)](https://www.tableau.com/support-levels-it-and-developer-tools) [![Build and…

About

# Tableau MCP [![Tableau Supported](https://img.shields.io/badge/Support%20Level-Tableau%20Supported-53bd92.svg)](https://www.tableau.com/support-levels-it-and-developer-tools) [![Build and Test](https://github.com/tableau/tableau-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/tableau/tableau-mcp/actions/w…

Details

Author
tableau
Downloads
263
Categories
Developer Tools, Other, Database, Search

- Tools, resources, and prompts for Tableau integration.
- Query Tableau data sources using natural language.
- Explore workbook content and metadata.
- Retrieve view images directly.
- Deployable to Heroku with one click.

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Tableau Mcp
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Install via npm and configure the MCP client with the command npx -y @tableau/mcp-server@latest and environment variables for your Tableau server, site name, and personal access token (PAT). Then send natural language prompts to query data, explore content, or get views.

get-datasource-metadata

This tool retrieves metadata for a specified datasource by taking the basic, high level, metadata results from Tableau's VizQL Data Service and enriches them with additional context provided by Tableau's Metadata API. The metadata provided by this tool consists of the datasource model, fields, and parameters that belong to the datasource. Fields will contain properties such as name and dataType, but may also expose richer context such as descriptions, dataCategories, roles, etc. This tool should be used for getting the metadata to ground the use of a tool that queries Tableau published data sources.

list-datasources

Retrieves a list of published data sources from a specified Tableau site using the Tableau REST API. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Views) for precise and flexible data source discovery. To list results based on usage popularity or relevance, use the search-content tool instead. **Supported Filter Fields and Operators** | Field | Operators | |------------------------|-------------------------------------------| | authenticationType | eq, in | | connectedWorkbookType | eq, gt, gte, lt, lte | | connectionTo | eq, in | | connectionType | eq, in | | contentUrl | eq, in | | createdAt | eq, gt, gte, lt, lte | | databaseName | eq, in | | databaseUserName | eq, in | | description | eq, in | | favoritesTotal | eq, gt, gte, lt, lte | | hasAlert | eq | | hasEmbeddedPassword | eq | | hasExtracts | eq | | isCertified | eq | | isConnectable | eq | | isDefaultPort | eq | | isHierarchical | eq | | isPublished | eq | | name | eq, in | | ownerDomain | eq, in | | ownerEmail | eq | | ownerName | eq, in | | projectName | eq, in | | serverName | eq, in | | serverPort | eq | | size | eq, gt, gte, lt, lte | | tableName | eq, in | | tags | eq, in | | type | eq | | updatedAt | eq, gt, gte, lt, lte | **Supported Operators** - `eq`: equals - `gt`: greater than - `gte`: greater than or equal - `in`: any of [list] (for searching tags) - `lt`: less than - `lte`: less than or equal **Filter Expression Notes** - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded. - Operators are delimited with colons (:). For example: `filter=name:eq:Project Views` - Field names, operator names, and values are case-sensitive. - To filter on multiple fields, combine expressions using a comma: `filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher` - Multiple expressions are combined using a logical AND. - If you include the same field multiple times, only the last reference is used. - For date-time values, use ISO 8601 format (e.g., `2016-05-04T21:24:49Z`). - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions: - Starts with: `?filter=name:eq:mark*` - Ends with: `?filter=name:eq:*-ample` - Contains: `?filter=name:eq:mark*ex*` **Example Usage:** - List data sources with the name "Project Views": filter: "name:eq:Project Views" - List data sources in the "Finance" project: filter: "projectName:eq:Finance" - List d…

query-datasource

# Query Tableau Data Source Tool Executes VizQL queries against Tableau data sources to answer business questions from published data. This tool allows you to retrieve aggregated and filtered data with proper sorting and grouping. ## Prerequisites Before using this tool, you should: 1. Understand available fields and their types 2. Understand what parameters are available and their types 3. Understand the data structure and field relationships ## Best Practices ### Data Volume Management - **Always prefer aggregation** - Use aggregated fields (SUM, COUNT, AVG, etc.) instead of raw row-level data to reduce response size - **Profile data before querying** - When unsure about data volume, first run a COUNT query to understand the scale: ```json { "fields": [ { "fieldCaption": "Order ID", "function": "COUNT", "fieldAlias": "Total Records" } ] } ``` - **Use TOP filters for rankings** - When users ask for "top N" results, use TOP filter type to limit results at the database level - **Apply restrictive filters** - Use SET, QUANTITATIVE, or DATE filters to reduce data volume before processing - **Avoid row-level queries when possible** - Only retrieve individual records when specifically requested and the business need is clear ### Field Usage Guidelines - **Prefer existing fields** - Use fields already modeled in the data source rather than creating custom calculations - **Use bins for distribution analysis** - Create bins to group continuous data into discrete ranges (e.g., age groups, price ranges) - **Validate field availability** - Always check field metadata before constructing queries ### Field Types #### Dimension Fields Basic fields without aggregation: ```json { "fieldCaption": "Category", "fieldAlias": "Product Category" } ``` #### Measure Fields Fields with aggregation functions (SUM, AVG, COUNT, etc.): ```json { "fieldCaption": "Sales", "function": "SUM", "fieldAlias": "Total Sales", "maxDecimalPlaces": 2 } ``` #### Calculated Fields Custom fields defined using Tableau calculation syntax: ```json { "fieldCaption": "Profit Margin", "calculation": "SUM([Profit]) / SUM([Sales])", "fieldAlias": "Margin %" } ``` #### Bin Fields Group continuous data into discrete ranges: ```json { "fieldCaption": "Sales", "binSize": 1000, "fieldAlias": "Sales Range" } ``` This creates bins of $1,000 intervals (0-1000, 1000-2000, etc.) ### Query Construction - **Group by meaningful dimensions** - Ensure grouping supports the business question being asked - **Order results logically** - Use sortDirection and sortPriority to present data in a meaningful way - **Use appropriate date functions** - Choose the right date aggregation (YEAR, QUARTER, MONTH, WEEK, DAY, or TRUNC_* variants) - **Leverage filter capabilities** - Use the extensive filter options to narrow results ## Data Profiling Strategy When a query might return large amounts of data, follow this profiling approach: **Step 1: Count total records** ```json { "fields": [ { "fieldCaption": "Primary_Key_Field", "function": "COUNT", "fieldAlias": "Total Records" } ] } ``` **Step 2: Count by key dimensions** ```json { "fields": [ { "fieldCaption": "Category", "fieldAlias": "Category" }, { "fieldCaption": "Order ID", "function": "COUNT", "fieldAlias": "Record Count" } ] } ``` **Step 3: Apply appropriate aggregation or filtering based on counts** ## Parameters Parameters are dynamic values defined in the Tableau datasource that can be used to control calculations, filters, and query behavior. They allow for interactive, user-controlled queries without modifying the query structure. ### When to Use Parameters - **Dynamic filtering** - Let users control date ranges, regions, or categories - **What-if analysis** - Adjust values like growth rates, targets, or thresholds - **Calculation control** - Switch between different metri…

list-all-pulse-metric-definitions

Retrieves a list of all published Pulse Metric Definitions using the Tableau REST API. Use this tool when a user requests to list all Tableau Pulse Metric Definitions on the current site. **Parameters:** - `view` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified. - `DEFINITION_VIEW_BASIC` - Return only the specified metric definition. - `DEFINITION_VIEW_FULL` - Return the metric definition and the specified number of metrics. - `DEFINITION_VIEW_DEFAULT` - Return the metric definition and the default metric. - `limit` (optional): Maximum number of metric definitions to return. If not specified, all definitions are returned. - `pageSize` (optional): Number of results per page. Controls how many definitions are fetched in each API request during pagination. **Example Usage:** - List all Pulse Metric Definitions on the current site - List all Pulse Metric Definitions on the current site with the default view: view: 'DEFINITION_VIEW_DEFAULT' - List the first 50 Pulse Metric Definitions: limit: 50 - List all Pulse Metric Definitions on the current site with the full view: view: 'DEFINITION_VIEW_FULL' In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool. - List all Pulse Metric Definitions on the current site with the basic view: view: 'DEFINITION_VIEW_BASIC' - See all metrics for my Pulse Metric Definitions: view: 'DEFINITION_VIEW_FULL' In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.

list-pulse-metric-definitions-from-definition-ids

Retrieves a list of specific Pulse Metric Definitions using the Tableau REST API from a list of metric definition IDs. Use this tool when a user requests information about specific Pulse Metric Definitions on the current site. **Parameters:** - `metricDefinitionIds` (required): A list of metric definition IDs to retrieve. - `view` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified. - `DEFINITION_VIEW_BASIC` - Return only the specified metric definition. - `DEFINITION_VIEW_FULL` - Return the metric definition and the specified number of metrics. - `DEFINITION_VIEW_DEFAULT` - Return the metric definition and the default metric. **Example Usage:** - Can you show me details about Pulse Metric Definition with id 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3' metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3'] - List Pulse Metric Definitions from a list of metric definition IDs: metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'] - List these Pulse Metric Definitions with the default view: metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'], view: 'DEFINITION_VIEW_DEFAULT' - List these Pulse Metric Definitions with the full view: metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'], view: 'DEFINITION_VIEW_FULL', In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool. - List these Pulse Metric Definitions with the basic view: metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'], view: 'DEFINITION_VIEW_BASIC' - See all metrics for these Pulse Metric Definitions with the full view: metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'], view: 'DEFINITION_VIEW_FULL' In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.

list-pulse-metrics-from-metric-definition-id

Retrieves a list of published Pulse Metrics from a Pulse Metric Definition using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a specific Pulse Metric Definition on the current site. **Parameters:** - `pulseMetricDefinitionID` (required): The ID of the Pulse Metric Definition to list metrics for. It should be the ID of the Pulse Metric Definition, not the name. Example: BBC908D8-29ED-48AB-A78E-ACF8A424C8C3 **Example Usage:** - List all Pulse Metrics for this Pulse Metric Definition

list-pulse-metrics-from-metric-ids

Retrieves a list of published Pulse Metrics from a list of metric IDs using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a list of metric IDs on the current site. **Parameters:** - `metricIds` (required): The list of Pulse Metric IDs to list metrics for. It should be the list of metric IDs, not the names or metric definition ids. Example: ['CF32DDCC-362B-4869-9487-37DA4D152552', 'CF32DDCC-362B-4869-9487-37DA4D152553'] - For data in a Pulse Metric Subscription, use the metric_id field. **Example Usage:** - List all Pulse Metrics from a list of Pulse Metric IDs **Note:** - This tool is recommended for use with data in Pulse Metric Subscriptions. - 00000000-0000-0000-0000-000000000000 is not a valid datasource id. - If you need a valid datasource id, you may need to retrieve the Pulse Metric Definition for the Pulse Metric which should have a valid datasource information.

list-pulse-metric-subscriptions

Retrieves a list of published Pulse Metric Subscriptions for the current user using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metric Subscriptions for the current user. **Example Usage:** - List all Pulse Metric Subscriptions for the current user on the current site - List all of my Pulse Metric Subscriptions **Note:** - This tool does not directly provide information about Pulse Metric Definitions. If you need to know information about Pulse Metric Defintiions associated with your subscriptions you need to: 1. Retrieve Pulse Metrics from the metric ids returned in the Pulse Metric Subscriptions. 2. Retrieve Pulse Metric Definitions from the metric definition id returned in the Pulse Metrics.

generate-pulse-metric-value-insight-bundle

Generate an insight bundle for the current aggregated value for Pulse Metric using Tableau REST API. You need the full information of the Pulse Metric and Pulse Metric Definition to use this tool. **Parameters:** - `bundleRequest` (required): The request to generate a bundle for. Most of the information comes from data returned from other tools that retrieve Pulse Metric and Pulse Metric Definition information. When creating the bundleRequest, you will need to set options using the following values: - output_format: 'OUTPUT_FORMAT_HTML' - time_zone: 'UTC' - language: 'LANGUAGE_EN_US' - locale: 'LOCALE_EN_US' - The `datasource` field under `metric.definition` requires an `id` (datasource LUID) and accepts an optional `id_type`: - Omit `id_type` for standard published datasources (default behavior). - Use `'DATASOURCE_ID_TYPE_WORKBOOK_DATASOURCE'` when the metric is based on an embedded workbook datasource rather than a published datasource. - `bundleType` (optional): The type of bundle to generate. The default is 'ban'. - 'ban' - Return a basic insight bundle with the current aggregated value for the Pulse Metric, period over period change, and the highest ranked insight for each filterable dimension of the metric. - 'springboard' - Return a springboard insight bundle with the current value, period over period change, and the highest ranked insight for the metric. - 'basic' - Similar to a springboard insight, but data is focused on the dimensions of a metric that are low bandwidth because they have small value sets. It shows the current value, period over period change, and the highest ranked insight for the metric for that data. - 'detail' - Shows insights on performance over time of the metric, a summary visualization of metric highs and lows and trends, breakdowns of top contributors for each filterable dimension of the metric, and followup insights based on the top ranked insights not already presented. **Example Usage:** - Generate the default insight bundle for the Pulse metric: bundleRequest: { bundle_request: { version: 1, options: { output_format: 'OUTPUT_FORMAT_HTML', time_zone: 'UTC', language: 'LANGUAGE_EN_US', locale: 'LOCALE_EN_US', }, input: { metadata: { name: 'Pulse Metric', metric_id: 'CF32DDCC-362B-4869-9487-37DA4D152552', definition_id: 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', }, metric: { definition: { datasource: { id: 'A6FC3C9F-4F40-4906-8DB0-AC70C5FB5A11', }, basic_specification: { measure: { field: 'Sales', aggregation: 'AGGREGATION_SUM', }, time_dimension: { field: 'Order Date', }, filters: [], }, is_running_total: false, }, metric_specification: { filters: [], measurement_period: { granularity: 'GRANULARITY_BY_QUARTER', range: 'RANGE_LAST_COMPLETE', }, comparison: { comparison: 'TIME_COMPARISON_PREVIOUS_PERIOD', }, }, extension_options: { allowed_dimensions: [], allowed_granularities: [], offset_from_today: 0, }, representation_options: { type: 'NUMBER_FORMAT_TYPE_NUMBER', number_units: { singular_noun: 'unit', plural_noun: 'units', }, row_level_id_field: { identifier_col: 'Order ID', identifier_label: '', }, row_level_entity_names: { entity_name_singular: 'Order', }, …

generate-pulse-insight-brief

Generate a concise insight brief for Pulse Metrics using Tableau REST API. This endpoint provides AI-powered conversational insights based on natural language questions about your metrics. **What is an Insight Brief?** An insight brief is an AI-generated response to questions about Pulse metrics. It provides: - Natural language answers to specific questions - Contextual summaries based on metric data - Action-oriented advice and recommendations - Conversational format optimized for chat interfaces **Insight Brief vs. Other Bundle Types:** - **Brief**: AI-powered conversational insights based on natural language questions (this endpoint) - **Detail**: Comprehensive analysis with full visualizations and trend breakdowns - **Ban**: Current value with period-over-period change and top dimensional insights - **Breakdown**: Emphasizes categorical dimension analysis and distributions **IMPORTANT Details:** 1. **Same Datasource Recommendation**: The API works best when all metrics in `metric_group_context` come from the same datasource, as this allows the backend to apply consistent filters across metrics. While the API may accept metrics from different datasources, it is recommended to group metrics by datasource and make separate API calls per datasource for optimal results. 2. **Complete Metric Data**: The `metric_group_context` must include complete metric data from the metric definition: - `extension_options` with actual `allowed_dimensions` and `allowed_granularities` arrays (not empty) - `representation_options` with correct `sentiment_type`, `currency_code`, and format settings - `insights_options.settings` with all insight types and their enabled/disabled state - Incomplete data will cause API errors even if it passes schema validation 3. **Multi-Turn Conversations**: you can optionally provide a concise summary of the directly relevant conversation history in the `messages` array. This can help the API to generate more accurate and relevant responses. Do not include full conversation history or arrays of prior conversation context. history in the `messages` array: - Add the initial user question with `role: 'ROLE_USER'` - Add the assistant's response with `role: 'ROLE_ASSISTANT'` and `content` containing the previous response text - Add the follow-up question with `role: 'ROLE_USER'` - Without conversation history, follow-up questions may lack context **Parameters:** - `briefRequest` (required): The request to generate a brief for. This includes: - `language`: Language for the response (e.g., 'LANGUAGE_EN_US') - `locale`: Locale for formatting (e.g., 'LOCALE_EN_US') - `messages`: Array of conversation messages containing: - `action_type`: Type of action ('ACTION_TYPE_ANSWER', 'ACTION_TYPE_SUMMARIZE', 'ACTION_TYPE_ADVISE') - `content`: The user's question or prompt (string, natural language) - `role`: Who initiated the request ('ROLE_USER' or 'ROLE_ASSISTANT') - `metric_group_context`: Array of metrics to analyze (metadata + metric specification) - `metric_group_context_resolved`: Whether the metric context has been resolved (boolean) - `now`: Optional current time in 'YYYY-MM-DD HH:MM:SS' or 'YYYY-MM-DD' format (defaults to midnight if time omitted) - `time_zone`: Optional timezone for date/time calculations **Action Types:** - `ACTION_TYPE_ANSWER`: Answer a specific question about the metric - `ACTION_TYPE_SUMMARIZE`: Provide a summary of metric insights - `ACTION_TYPE_ADVISE`: Give recommendations or advice based on metric data **Example Usage:** - Ask a question about a metric: briefRequest: { language: 'LANGUAGE_EN_US', locale: 'LOCALE_EN_US', messages: [ { action_type: 'ACTION_TYPE_ANSWER', content: 'Why did sales increase this month?', role: 'ROLE_USER', metric_group_context: [ { metadata: { name: 'Sales', id: 'CF32DDCC-36…

get-workbook

Retrieves information about the specified workbook, including information about the views contained in the workbook.

get-view

Retrieves information about the specified view, including upstream datasources, workbook information, project details, owner, tags, and usage statistics. Returns facts only, NO visual output: to display the view use render-interactive-viz (interactive) or get-view-image (static image).

get-view-data

Retrieves comma-separated value (CSV) data for the specified view in a Tableau workbook, including the user's filters. If the request is for a dashboard, only data for the dashboard's first view is returned. Requires the view LUID from the content URL (not the published view id). For custom views, use the tool to get custom view data by custom view id instead.

get-view-image

Returns a static, non-interactive image of the specified view in a Tableau workbook. Use only when the user explicitly wants an image artifact — a screenshot, picture, thumbnail, PNG/PDF, or an image to embed in a document or export. For a bare "show me / open / explore this view" the user wants the interactive embed — use render-interactive-viz instead. Optional width and height in pixels control render size. Optional view field names and values can be provided to filter the view. For custom views, use the tool to get custom view image by custom view id instead.

list-workbooks

Retrieves a list of workbooks on a Tableau site including their metadata such as name, description, and information about the views contained in the workbook. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Superstore) for precise and flexible workbook discovery. To list results based on usage popularity or relevance, use the search-content tool. **Supported Filter Fields and Operators** | Field | Operators | |-------------------|----------------------| | createdAt | eq, gt, gte, lt, lte | | contentUrl | eq, in | | displayTabs | eq | | favoritesTotal | eq, gt, gte, lt, lte | | hasAlerts | eq | | hasExtracts | eq | | name | eq, in | | ownerDomain | eq, in | | ownerEmail | eq, in | | ownerName | eq, in | | projectName | eq, in | | sheetCount | eq, gt, gte, lt, lte | | size | eq, gt, gte, lt, lte | | subscriptionTotal | eq, gt, gte, lt, lte | | tags | eq, in | | updatedAt | eq, gt, gte, lt, lte | **Supported Operators** - `eq`: equals - `gt`: greater than - `gte`: greater than or equal - `in`: any of [list] (for searching tags) - `lt`: less than - `lte`: less than or equal **Filter Expression Notes** - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded. - Operators are delimited with colons (:). For example: `filter=name:eq:Project Views` - Field names, operator names, and values are case-sensitive. - To filter on multiple fields, combine expressions using a comma: `filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher` - Multiple expressions are combined using a logical AND. - If you include the same field multiple times, only the last reference is used. - For date-time values, use ISO 8601 format (e.g., `2016-05-04T21:24:49Z`). - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions: - Starts with: `?filter=name:eq:mark*` - Ends with: `?filter=name:eq:*-ample` - Contains: `?filter=name:eq:mark*ex*` **Example Usage:** - List workbooks with the name "Superstore": filter: "name:eq:Superstore" - List workbooks in the "Finance" project: filter: "projectName:eq:Finance" - List workbooks created after January 1, 2023: filter: "createdAt:gt:2023-01-01T00:00:00Z" - List workbooks with the name "Superstore" in the "Finance" project and created after January 1, 2023: filter: "name:eq:Superstore,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z" **Pagination** This tool returns a single 1000-item page per call. Use `pageNumber` to select which 1000-item page to fetch (1-based, default 1). The response is a flat object `{ data, totalAvailable }`; paginate by incrementing `pageNumber` until you have collected `totalAvailable` items. To get just the count of workbooks matching a request, read `totalAvailable` from a single call with `limit: 1` — the count is returned regardless of page size, and a small `limit` keeps the response tiny.

list-projects

Retrieves a list of projects on a Tableau site including their metadata such as name, description, parent project, content permissions, owner, and timestamps. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Default) for precise project discovery. To list results based on usage popularity or relevance, use the search-content tool instead. **Supported Filter Fields and Operators** | Field | Operators | |-------------------|----------------------| | createdAt | eq, gt, gte, lt, lte | | name | eq, in | | ownerDomain | eq, in | | ownerEmail | eq, in | | ownerName | eq, in | | parentProjectId | eq, in | | topLevelProject | eq | | updatedAt | eq, gt, gte, lt, lte | **Supported Operators** - `eq`: equals - `gt`: greater than - `gte`: greater than or equal - `in`: any of [list] (for searching tags) - `lt`: less than - `lte`: less than or equal **Filter Expression Notes** - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded. - Operators are delimited with colons (:). For example: `filter=name:eq:Project Views` - Field names, operator names, and values are case-sensitive. - To filter on multiple fields, combine expressions using a comma: `filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher` - Multiple expressions are combined using a logical AND. - If you include the same field multiple times, only the last reference is used. - For date-time values, use ISO 8601 format (e.g., `2016-05-04T21:24:49Z`). - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions: - Starts with: `?filter=name:eq:mark*` - Ends with: `?filter=name:eq:*-ample` - Contains: `?filter=name:eq:mark*ex*` **Example Usage:** - List projects with the name "Default": filter: "name:eq:Default" - List top-level projects only: filter: "topLevelProject:eq:true" - List child projects of a specific parent: filter: "parentProjectId:eq:abc-123" - List projects updated after January 1, 2023: filter: "updatedAt:gt:2023-01-01T00:00:00Z" **Pagination** This tool returns a single 1000-item page per call. Use `pageNumber` to select which 1-based page to fetch (default 1). The response is a flat object `{ data, totalAvailable }`; to collect every project, keep incrementing `pageNumber` until you have gathered `totalAvailable` items. To get just the count of projects matching a request, read `totalAvailable` from a single call with `limit: 1` — the count is returned regardless of page size, and a small `limit` keeps the response tiny.

list-views

Retrieves a list of views on a Tableau site including their metadata such as name, owner, and the workbook they are found in. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Overview) for precise and flexible view discovery. To list results based on usage popularity or relevance, use the search-content tool instead. **Supported Filter Fields and Operators** | Field | Operators | |---------------------|----------------------| | caption | eq, in | | contentUrl | eq, in | | createdAt | eq, gt, gte, lt, lte | | favoritesTotal | eq, gt, gte, lt, lte | | fields | eq, in | | hitsTotal | eq, gt, gte, lt, lte | | name | eq, in | | ownerDomain | eq, in | | ownerEmail | eq, in | | ownerName | eq, in | | projectName | eq, in | | sheetNumber | eq, gt, gte, lt, lte | | sheetType | eq, in | | tags | eq, in | | title | eq, in | | updatedAt | eq, gt, gte, lt, lte | | viewUrlname | eq, in | | workbookDescription | eq, in | | workbookName | eq, in | **Supported Operators** - `eq`: equals - `gt`: greater than - `gte`: greater than or equal - `in`: any of [list] (for searching tags) - `lt`: less than - `lte`: less than or equal **Filter Expression Notes** - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded. - Operators are delimited with colons (:). For example: `filter=name:eq:Project Views` - Field names, operator names, and values are case-sensitive. - To filter on multiple fields, combine expressions using a comma: `filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher` - Multiple expressions are combined using a logical AND. - If you include the same field multiple times, only the last reference is used. - For date-time values, use ISO 8601 format (e.g., `2016-05-04T21:24:49Z`). - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions: - Starts with: `?filter=name:eq:mark*` - Ends with: `?filter=name:eq:*-ample` - Contains: `?filter=name:eq:mark*ex*` **Example Usage:** - List views with the name "Overview": filter: "name:eq:Overview" - List views in the "Finance" project: filter: "projectName:eq:Finance" - List views created after January 1, 2023: filter: "createdAt:gt:2023-01-01T00:00:00Z" - List views with the name "Overview" in the "Finance" project and created after January 1, 2023: filter: "name:eq:Overview,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z" **Pagination** This tool returns a single 1000-item page per call. Use `pageNumber` to select which 1000-item page to fetch (1-based, default 1). The response is a flat object `{ data, totalAvailable }`; paginate by incrementing `pageNumber` until you have collected `totalAvailable` items. To get just the count of views matching a request, read `totalAvailable` from a single call with `limit: 1` — the count is returned regardless of page size, and a small `limit` keeps the response tiny.

list-custom-views

Retrieves a list of custom views for a Tableau workbook including their metadata such as name, owner, and the view they are found in. Supports optional filtering via field:operator:value expressions (e.g., viewId:eq:<view_id>) for precise and flexible custom view discovery. The tool always includes the workbookId in the final filter expression based on the required workbookId argument. Including the workbookId field in the filter will be ignored. Use this tool when a user requests to list, search, or filter Tableau custom views for a workbook. **Supported Filter Fields and Operators** | Field | Operators | |---------------------|----------------------| | ownerId | eq | | viewId | eq | **Supported Operators** - `eq`: equals - `gt`: greater than - `gte`: greater than or equal - `in`: any of [list] (for searching tags) - `lt`: less than - `lte`: less than or equal **Filter Expression Notes** - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded. - Operators are delimited with colons (:). For example: `filter=name:eq:Project Views` - Field names, operator names, and values are case-sensitive. - To filter on multiple fields, combine expressions using a comma: `filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher` - Multiple expressions are combined using a logical AND. - If you include the same field multiple times, only the last reference is used. - For date-time values, use ISO 8601 format (e.g., `2016-05-04T21:24:49Z`). - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions: - Starts with: `?filter=name:eq:mark*` - Ends with: `?filter=name:eq:*-ample` - Contains: `?filter=name:eq:mark*ex*` **Example Usage:** - List all custom views for a given workbook: workbookId: "222ea993-9391-4910-a167-56b3d19b4e3b" - List custom views from the view with viewId "9460abfe-a6b2-49d1-b998-39e1ebcc55ce": workbookId: "222ea993-9391-4910-a167-56b3d19b4e3b" filter: "viewId:eq:9460abfe-a6b2-49d1-b998-39e1ebcc55ce" - List custom views for the owner with ownerId "bbdee366-4a50-4c2c-a5c8-746da5b64483": workbookId: "222ea993-9391-4910-a167-56b3d19b4e3b" filter: "ownerId:eq:bbdee366-4a50-4c2c-a5c8-746da5b64483"

get-custom-view-data

Retrieves comma-separated value (CSV) data for a Tableau Custom View (saved/personalized view state), including the user's filters. Requires the custom view LUID from the content URL (not the published view id). For published views, use the tool to get view data by view id instead.

get-custom-view-image

Retrieves an image of the specified custom view in a published viz. A custom view is a shortcut to a specific state of interaction, such as filter selections and sorting, for a published viz. Requires the custom view LUID from the content URL (not the published view id). Optional width and height in pixels control render size. Optional view field names and values can be provided to filter the custom view. For published views, use the tool to get view image by view id instead.

search-content

This tool searches and ranks Tableau content across many content types at once — including workbooks, views, datasources, projects, lenses, flows, tables, databases, virtual connections, data roles, and collections. Use this tool for keyword or free-text discovery: when you want to find content by name or topic, when you do not know which content type an item is, when you want to search several content types in a single call, or when you want the most relevant or most-viewed items surfaced first. It returns a single ranked page (the top N matches — default 100, max 2000) rather than an exhaustive enumeration of every match, so it is best suited to finding the most relevant items rather than returning every matching item. **Parameters:** - `terms` (optional): A string containing one or more search terms that the search uses as the basis for determining which items are relevant to return. - `filter` (optional): Allows you to limit search results based on: - `contentTypes`: Filter by content types. Supported types are: 'lens', 'datasource', 'virtualconnection', 'collection', 'project', 'flow', 'datarole', 'table', 'database', 'view', 'workbook' - `ownerIds`: Filter by specific owner IDs (array of integers) - `modifiedTime`: Filter by last modified times using ISO 8601 date-time strings. Can be either a range (with startDate/endDate) or an array of specific date-times to include - `limit` (optional): The maximum number of items to return in the search response (default: 100, max: 2000). - `orderBy` (optional): An array of `{ method, sortDirection }` objects that controls how results are sorted. If omitted, results are sorted by their "relevance score" in descending order — Tableau's internal ranking of how well each item matches your search terms. `sortDirection` is 'asc' (ascending) or 'desc' (descending) and defaults to 'asc'. The first element is the primary sort; any additional elements are tiebreakers, applied in order. Available sorting methods: - `hitsTotal`: Number of times a content item has been viewed since it was created - `hitsSmallSpanTotal`: Number of times a content item was viewed in the last month - `hitsMediumSpanTotal`: Number of times a content item was viewed in the last 3 months - `hitsLargeSpanTotal`: Number of times a content item was viewed in the last year - `downstreamWorkbookCount`: Number of workbooks in a given project. This value is only available when the content type filter includes 'database' or 'table' **Example Usage:** - Top 5 most-viewed workbooks (all time): `{ limit: 5, filter: { contentTypes: ["workbook"] }, orderBy: [{ method: "hitsTotal", sortDirection: "desc" }] }` - Free-text search for the most relevant content: `{ terms: "quarterly sales" }` - Find only workbooks and views matching a topic: `{ terms: "revenue", filter: { contentTypes: ["workbook", "view"] } }` - Surface the most-viewed datasources this month (no search terms): `{ filter: { contentTypes: ["datasource"] }, orderBy: [{ method: "hitsSmallSpanTotal", sortDirection: "desc" }] }` - Multi-key sort — most-viewed all-time first, using views this year as a tiebreaker: `{ orderBy: [{ method: "hitsTotal", sortDirection: "desc" }, { method: "hitsLargeSpanTotal", sortDirection: "desc" }] }` - Content owned by specific users, modified in a date range: `{ filter: { ownerIds: [123, 456], modifiedTime: { startDate: "2026-01-01T00:00:00Z", endDate: "2026-06-30T23:59:59Z" } } }`

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "tableau mcp": {
            "tableau": {
                "command": "npx",
                "args": [
                    "-y",
                    "@tableau/mcp-server@latest"
                ],
                "env": {
                    "SERVER": "https://datadev.usfca.edu",
                    "SITE_NAME": "",
                    "PAT_NAME": "Test",
                    "PAT_VALUE": "0U+nE1LeTPOHR2PkXOJXUA==:aq4tBwFzd9x25JWEKFjL4qRJEEgVb074"
                }
            }
        }
    }
}

McpServers

{
    "tableau": {
        "command": "npx",
        "args": [
            "-y",
            "@tableau/mcp-server@latest"
        ],
        "env": {
            "SERVER": "https://datadev.usfca.edu",
            "SITE_NAME": "",
            "PAT_NAME": "Test",
            "PAT_VALUE": "0U+nE1LeTPOHR2PkXOJXUA==:aq4tBwFzd9x25JWEKFjL4qRJEEgVb074"
        }
    }
}

Hosted Tableau MCP (Recommended for Tableau Cloud)

Tableau MCP is available as a managed service athttps://mcp.tableau.com. It uses OAuth 2.1 so every user signs in with their own Tableau Cloud identity, and all existing per-user permissions are enforced automatically.

Point any MCP-compatible client athttps://mcp.tableau.comand complete the OAuth sign-in flow when prompted.

SeePopular Client Integrationsfor step-by-step setup instructions for Slack, Claude, ChatGPT, and other common AI clients.

Tableau Server customersand Cloud customers who require self-hosted infrastructure should see theEnterprise DeploymentandSelf-Hosted Getting Startedguides.

The quickest way to run Tableau MCP locally. RequiresNode.js22.7.5 or later — no cloning or building needed. Configure your AI tool (MCP client) with:

{ "mcpServers": { "tableau": { "command": "npx", "args": ["-y", "@tableau/mcp-server@latest"], "env": { "SERVER": "https://my-tableau-server.com", "SITE_NAME": "my_site", "PAT_NAME": "my_pat", "PAT_VALUE": "pat_value" } } } }

For Docker, building from source, and other self-hosted options, see theGetting Started guide.

For the Superstore Datasource, what are the top 5 states with the most sales in 2025?
Based on the Superstore Datasource, here are the top 5 states with the most sales in 2025: 1. California - $146,388.34 2. New York - $93,922.99 3. Washington - $65,539.90 4. Texas - $43,421.76 5. Pennsylvania - $42,688.31 California leads by a significant margin with over $146,000 in sales, followed by New York with nearly $94,000. These two states alone account for a substantial portion of the total sales across the top 5 states.
Find me the most viewed workbook within the last year.
The most viewed workbook within the last year is: Global Connections - Owner: John Doe - Project: Marketing - Views in last year: 523 - Last Modified: September 2, 2025 - Workbook ID: 111fb672-9401-4913-a167-17b3d89a3e4f
Show me the "Economy" view in the "Finances" project.

This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.

Query databases, build dashboards, and analyze documents in natural language from Claude or any MCP client. 28+ tools, 70+ data sources.

Local Claude Desktop MCP app for generating Power BI .pbit reports from CSV datasets, natural-language instructions, and reference-image styling.

Manage Apache Superset datasets, metrics, and SQL queries.

Connects Claude Desktop to Tableau Server, enabling natural language interactions with your Tableau data and administrative capabilities.

Interact with Tableau Server using natural language to query data and perform administrative tasks.

Windsor MCP enables your LLM to query, explore, and analyze your full-stack business data integrated into Windsor.ai with zero SQL writing or custom scripting.

Official MCP server for dbt (data build tool) providing integration with dbt Core/Cloud CLI, project metadata discovery, model information, and semantic layer querying capabilities.

Get clear, reliable and actionable Customer Insights with AI.

Honeydew semantic layer provides a governed, business-friendly data model that unifies metrics, dimensions, and relationships across sources, enabling consistent self-service analytics and AI-powered data access

Build robust data workflows, integrations, and analytics on a single intuitive platform.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.