Skip to content

Support Tableau Connected Apps JWT Authentication with Site and Scope Enforcement #79

@JRamosMRAS

Description

@JRamosMRAS

Is your feature request related to a problem? Please describe.

We are building an LLM-driven chatbot application that uses tableau-mcp to query Tableau content.

Our Tableau Server/Cloud environment is multi-tenant, with multiple Tableau Sites—each tenant has its own site, and strict data isolation is required so users cannot see data from another tenant's site.

Currently, tableau-mcp authentication is based on Personal Access Tokens (PATs) or other static credentials tied to a Tableau user account. This has two limitations for our use case:

  1. Lack of ephemeral, scoped authentication per request — we cannot dynamically issue short-lived, tenant-specific credentials.
  2. No built-in site restriction — PATs are tied to a user, not to an enforced site_id in the MCP layer, meaning we must manage tenant separation manually.

This makes it challenging to implement secure, per-tenant isolation in a dynamic, multi-user, LLM-based application without risking cross-tenant data exposure.


Describe the solution you'd like

We propose adding support for Tableau Connected Apps JWT authentication with access scopes in tableau-mcp.

When enabled, the MCP server should:

  1. Validate incoming JWTs
    • Verify the signature using the Connected App's public key.
    • Check standard claims (iss, aud, exp, sub).
    • Read scp (scopes) from the JWT to determine allowed API actions.
  2. Enforce scope-based permissions
    • Map Tableau scopes (per Connected Apps scopes docs) to MCP API endpoints.
    • Example: tableau:content:read allows GET calls for sites/workbooks/views; tableau:datasources:download allows datasource export.
  3. Enforce site-level restrictions
    • Extract site_id (or similar) from the JWT claims.
    • All Tableau REST API calls made by MCP must be scoped to that site_id.
  4. Provide configuration options
    • Enable/disable JWT mode via config/env variables.
    • Set Connected App client_id, allowed issuers, and public keys.
    • Optional claim-to-config mapping for site_id.

Example Workflow for a Multi-Tenant LLM App:

  • Tenant A user logs into the chatbot → backend issues a JWT with:
    {
      "sub": "userA@example.com",
      "scp": ["tableau:content:read"],
      "site_id": "site-a",
      "iss": "my-connected-app",
      "aud": "tableau",
      "exp": 1736182045
    }
  • MCP validates JWT, enforces site_id = site-a, and allows only read calls.
  • Tenant B's token would have site_id = site-b and be restricted to their site.

This would enable:

  • Strong tenant isolation by default.
  • Granular, role-like API access controlled by JWT scopes.
  • Short-lived, per-request credentials without managing long-lived PATs.

Additional context

Benefits:

  • Prevents accidental or malicious cross-tenant data access.
  • Simplifies authentication for multi-tenant apps—tokens can be generated dynamically per session.
  • Aligns with Tableau’s Connected Apps security model.
  • Eliminates PAT storage in the MCP service layer.

References:

We would be happy to help with a design proposal or prototype PR if this feature is considered.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions