Skip to main content
Glama
tableau-graphql-mcp

tableau-graphql-mcp

by tdries

graphql_query

Read-only

Run read-only GraphQL queries against Tableau Metadata API to answer lineage, impact analysis, and where-used questions about workbooks, datasources, and fields.

Instructions

Run ANY read-only GraphQL query against the Tableau Metadata API. This is the general-purpose tool; use it for any lineage question. Returns {"data": ..., "errors": ...}.

The Metadata API is a GraphQL graph of Tableau content (workbooks, sheets, dashboards,
datasources, fields) and, with the Data Management add-on, physical assets (databases,
tables, columns) and their upstream/downstream lineage.

How to write a correct query:
- Filters are EXACT and case-sensitive: `filter: {name: "X"}` or `filter: {nameWithin: ["X","Y"]}`
  (nameWithin is the only multi/OR match; there is NO substring or regex).
- Every list field has a `<name>Connection` variant with `first`/`offset`/`after` + `pageInfo`
  (page size max 1000). Keep one query under ~20,000 nodes; narrow filters and page.
- Fields is an interface; branch with `__typename` and inline fragments
  (`... on ColumnField { columns { name } }`, `... on CalculatedField { formula }`).
- Reach a field's owning workbook via `datasource { ... on EmbeddedDatasource { workbook { name } } }`.
- `downstream*` fields (downstreamWorkbooks/Owners, external tables/columns) need Data Management
  (Tableau Catalog) and are often empty otherwise; then resolve via core lineage
  (referencedByFields -> sheets -> workbook), or just call the `where_used` tool.

Entry points include: workbooks, sheets, dashboards, publishedDatasources, embeddedDatasources,
fields, columnFields, calculatedFields, columns, databaseTables, customSQLTables, databases,
flows, tableauUsers, dataQualityWarnings. Call `lineage_examples` for ready-made query templates
and a schema cheat-sheet, or `introspect_schema` to inspect any type's exact fields.

Read-only: mutation and subscription operations are rejected. If a query exceeds the
~20,000-node limit, the response is flagged with `partial_results: true` and a `warning`
(it does NOT auto-page an arbitrary query) so you never mistake a truncated result for a
complete one.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "query": "<query>"
    },
    "name": "graphql_query"
  }
}

Input Schema

NameRequiredDescriptionDefault
queryYes
variablesNo

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only and non-destructive, and the description adds important operational behavior: exact case-sensitive filters, no substring/regex, page size max 1000, an approximate 20,000-node limit, partial_results warnings, and no auto-paging of arbitrary queries. These are substantive details beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well structured and front-loaded: the purpose and return shape come first, followed by concrete query-writing rules and alternatives. Every section provides useful guidance for a complex GraphQL tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex open-world GraphQL tool, the description covers API scope, query syntax constraints, pagination, result truncation behavior, read-only restrictions, and sibling alternatives. An output schema exists, so return-value explanation is not required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning. It explains query construction in detail, including filters, pagination, fragments, and entry points, but does not explain the optional variables parameter at all, leaving one parameter undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: run ANY read-only GraphQL query against the Tableau Metadata API. It explicitly calls itself the general-purpose tool for lineage questions and distinguishes itself from introspect_schema and lineage_examples.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage guidance: use this for any lineage question, call lineage_examples for templates and introspect_schema for schema inspection, and use where_used when Catalog lineage is unavailable. It also states mutation and subscription operations are rejected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.