> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stackone.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tableau

> 122 actions available for Tableau through StackOne. Use via Actions RPC, Toolset SDK, MCP, or A2A.

export const GettingStarted = ({connector}) => {
  const linkStyle = {
    textDecoration: 'none'
  };
  const authConfigGuides = connector?.authentication?.filter(a => a?.setupGuide) ?? [];
  const linkAccountGuides = connector?.authentication?.filter(a => a?.configGuide) ?? [];
  return <div style={{
    marginTop: '32px',
    paddingTop: '24px'
  }} className="getting-started-section">
      <div style={{
    fontSize: '20px',
    fontWeight: '600',
    marginBottom: '12px'
  }}>Getting Started</div>
      <Steps>
        <Step title="Create or Select a Project">
          Set up a new project or select an existing one. See the <a href="/guides/managing-projects" style={linkStyle}>Projects Guide</a>.
        </Step>
        <Step title="Configure the Connector">
          <>
            Enable the connector and set up auth configuration in your project. See <a href="/guides/explore-connectors" style={linkStyle}>Managing Connectors</a>.
            {authConfigGuides.length > 0 && <>
              <Columns cols={2}>
                {authConfigGuides.map(auth => <Card title="Auth Config" href={`/${auth.setupGuide}`} icon={connector.icon} horizontal>
                    {connector.name} - {auth.label}
                  </Card>)}
              </Columns> 
              </>}
          </>
        </Step>
        <Step title="Link an Account">
          <>
            Connect an account using <a href="/guides/embedding-stackone-hub" style={linkStyle}>StackOne Hub</a> or <a href="/guides/auth-link" style={linkStyle}>Auth Link</a>.
            {linkAccountGuides.length > 0 && <>
                <Columns cols={2}>
                  {linkAccountGuides.map(auth => <Card title="Link Account" href={`/${auth.configGuide}`} icon={connector.icon} horizontal>
                      {connector.name} - {auth.label}
                    </Card>)}
                </Columns>
              </>}
          </>
        </Step>
        <Step title="Use Actions">
          <>
            Invoke actions using one of the methods below:
            <ul style={{
    marginTop: '8px',
    paddingLeft: '20px'
  }}>
              <li style={{
    marginBottom: '4px'
  }}><a href="/mcp/quickstart" style={linkStyle}>MCP</a> – Model Context Protocol for AI assistants</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/a2a/quickstart" style={linkStyle}>A2A</a> – Agent-to-Agent protocol</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/agents/typescript/introduction" style={linkStyle}>AI Toolset (TypeScript)</a> – TypeScript SDK for AI agents</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/agents/python/introduction" style={linkStyle}>AI Toolset (Python)</a> – Python SDK for AI agents</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/platform/api-reference/actions/make-an-rpc-call-to-an-action" style={linkStyle}>Actions RPC</a> – Direct API calls</li>
              <li style={{
    marginBottom: '4px'
  }}><a href="/guides/playground" style={linkStyle}>Playground</a> – Test actions in the dashboard</li>
            </ul>
          </>
        </Step>
      </Steps>
    </div>;
};

export const ActionsLibrary = ({search, setSearch, filtered, sharedStyles = {}, KeyCell, ScopesCell, availableScopes, selectedScopes, setSelectedScopes}) => {
  const libraryStyles = {
    section: {
      marginTop: '24px',
      marginBottom: '16px'
    },
    sectionTitle: {
      fontSize: '18px',
      fontWeight: '600',
      marginBottom: '12px'
    },
    filterRow: {
      display: 'flex',
      gap: '12px',
      marginBottom: '12px',
      alignItems: 'stretch'
    },
    count: {
      fontSize: '12px',
      marginBottom: '8px'
    },
    tableContainer: {
      maxHeight: '500px',
      overflowY: 'auto',
      overflowX: 'auto',
      borderRadius: '8px',
      fontSize: '13px'
    },
    gridTable: {
      display: 'grid',
      minWidth: '600px',
      gridTemplateColumns: '200px 1fr'
    },
    gridTableWithScopes: {
      gridTemplateColumns: '200px 1fr 150px'
    },
    gridHeader: {
      display: 'contents'
    },
    gridHeaderCell: {
      position: 'sticky',
      top: 0,
      padding: '10px 12px',
      fontWeight: '600',
      zIndex: 1
    },
    gridRow: {
      display: 'contents'
    },
    gridCellAction: {
      padding: '10px 12px',
      fontWeight: '500'
    },
    gridCellKey: {
      padding: '10px 12px'
    },
    gridCellScopes: {
      padding: '10px 12px',
      fontSize: '12px'
    },
    gridCellDescription: {
      padding: '10px 12px'
    }
  };
  const styles = {
    ...libraryStyles,
    ...sharedStyles
  };
  const safeAvailableScopes = Array.isArray(availableScopes) ? availableScopes : [];
  const safeSelectedScopes = Array.isArray(selectedScopes) ? selectedScopes : [];
  const hasScopesColumn = safeAvailableScopes.length > 0;
  const hasScopeFilter = safeAvailableScopes.length > 0 && typeof setSelectedScopes === 'function';
  const ScopesCellComponent = ScopesCell || (() => null);
  return <div style={styles.section}>
      <div style={styles.sectionTitle}>Actions</div>
      <div style={styles.filterRow}>
        <SearchBar value={search} onChange={setSearch} placeholder="Search actions" />
        {hasScopeFilter && <FilterDropdown label="Scopes" items={safeAvailableScopes} selectedItems={safeSelectedScopes} onChange={setSelectedScopes} searchPlaceholder="Search scopes..." emptyLabel="No scopes found" />}
      </div>
      <div style={styles.count} className="actions-library-count">
        {filtered.length === 0 ? '0 actions found' : `${filtered.length} action${filtered.length !== 1 ? 's' : ''}`}
      </div>
      {}
      <div className="not-prose actions-library-table-container" style={styles.tableContainer}>
        <div style={{
    ...hasScopesColumn ? {
      ...styles.gridTable,
      ...styles.gridTableWithScopes
    } : styles.gridTable
  }}>
          {}
          <div style={styles.gridHeader}>
            <div style={styles.gridHeaderCell} className="actions-library-grid-header-cell">Action</div>
            <div style={styles.gridHeaderCell} className="actions-library-grid-header-cell">Description</div>
            {hasScopesColumn && <div style={styles.gridHeaderCell} className="actions-library-grid-header-cell">Required scopes</div>}
          </div>
          {}
          {filtered.map(a => <div key={a.id} style={styles.gridRow}>
              <div style={styles.gridCellAction} className="actions-library-grid-cell">
                <div>{a.label}</div>
                <div style={{
    marginTop: '4px'
  }}>
                  <KeyCell id={a.id} />
                </div>
              </div>
              <div style={styles.gridCellDescription} className="actions-library-grid-cell actions-library-grid-cell--description">{a.description}</div>
              {hasScopesColumn && <div style={styles.gridCellScopes} className="actions-library-grid-cell actions-library-grid-cell--scopes">
                  <ScopesCellComponent scopes={a.requiredScopes} actionId={a.id} />
                </div>}
            </div>)}
        </div>
      </div>
    </div>;
};

export const FilterDropdown = ({label, items, selectedItems, onChange, searchPlaceholder = 'Search...', emptyLabel = 'No items found', formatLabel}) => {
  const [dropdownOpen, setDropdownOpen] = React.useState(false);
  const [search, setSearch] = React.useState('');
  const [hoveredItem, setHoveredItem] = React.useState(null);
  const dropdownRef = React.useRef(null);
  const styles = {
    dropdownContainer: {
      position: 'relative'
    },
    dropdownTrigger: {
      display: 'flex',
      alignItems: 'center',
      gap: '8px',
      padding: '10px 14px',
      borderRadius: '8px',
      fontSize: '14px',
      cursor: 'pointer',
      whiteSpace: 'nowrap',
      minWidth: '160px',
      justifyContent: 'space-between'
    },
    dropdownMenu: {
      position: 'absolute',
      top: '100%',
      right: 0,
      marginTop: '4px',
      borderRadius: '8px',
      zIndex: 50,
      minWidth: '220px',
      maxHeight: '320px',
      display: 'flex',
      flexDirection: 'column'
    },
    dropdownHeader: {
      padding: '8px 12px'
    },
    selectActions: {
      display: 'flex',
      alignItems: 'center',
      gap: '8px',
      marginTop: '6px',
      fontSize: '12px'
    },
    selectActionBtn: {
      background: 'none',
      border: 'none',
      cursor: 'pointer',
      padding: '2px 4px',
      fontSize: '12px'
    },
    dropdownSearchInput: {
      width: '100%',
      padding: '8px 10px',
      borderRadius: '6px',
      fontSize: '13px',
      outline: 'none'
    },
    dropdownList: {
      overflowY: 'auto',
      maxHeight: '220px',
      padding: '4px 0'
    },
    dropdownItem: {
      display: 'flex',
      alignItems: 'center',
      gap: '10px',
      padding: '8px 12px',
      cursor: 'pointer',
      fontSize: '13px',
      transition: 'background-color 0.1s'
    },
    checkbox: {
      width: '16px',
      height: '16px',
      borderRadius: '4px',
      display: 'flex',
      alignItems: 'center',
      justifyContent: 'center',
      flexShrink: 0
    },
    checkmark: {
      color: 'white',
      fontSize: '10px',
      fontWeight: 'bold'
    },
    dropdownFooter: {
      padding: '8px 12px',
      display: 'flex',
      justifyContent: 'space-between',
      alignItems: 'center'
    },
    clearButton: {
      fontSize: '12px',
      cursor: 'pointer',
      padding: '4px 8px',
      borderRadius: '4px',
      border: 'none',
      background: 'none'
    },
    badge: {
      fontSize: '11px',
      fontWeight: '600',
      padding: '2px 6px',
      borderRadius: '10px',
      marginLeft: '4px'
    },
    chevron: {
      fontSize: '10px',
      transition: 'transform 0.15s'
    },
    noResults: {
      padding: '12px',
      textAlign: 'center',
      fontSize: '13px'
    }
  };
  const safeSelected = Array.isArray(selectedItems) ? selectedItems : [];
  const formatItemLabel = item => {
    if (typeof formatLabel === 'function') {
      return formatLabel(item);
    }
    return item;
  };
  const filteredItems = React.useMemo(() => {
    if (!search) return items;
    const searchLower = search.toLowerCase();
    return items.filter(item => {
      const labelText = formatItemLabel(item);
      return labelText.toLowerCase().includes(searchLower);
    });
  }, [items, search, formatLabel]);
  const isSelected = item => safeSelected.includes(item);
  const toggleItem = item => {
    const next = isSelected(item) ? safeSelected.filter(v => v !== item) : [...safeSelected, item];
    onChange(next);
  };
  const clearFilters = () => {
    onChange([]);
  };
  const selectAll = () => {
    onChange(items);
  };
  React.useEffect(() => {
    const handleClickOutside = e => {
      if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
        setDropdownOpen(false);
        setSearch('');
        setHoveredItem(null);
      }
    };
    document.addEventListener('mousedown', handleClickOutside);
    return () => document.removeEventListener('mousedown', handleClickOutside);
  }, []);
  return <div style={styles.dropdownContainer} ref={dropdownRef}>
      <button type="button" onClick={() => setDropdownOpen(!dropdownOpen)} style={styles.dropdownTrigger} className={`filter-dropdown__trigger${safeSelected.length > 0 ? ' filter-dropdown__trigger--active' : ''}`}>
        <span>
          {label}
          {safeSelected.length > 0 && <span style={styles.badge} className="filter-dropdown__badge">{safeSelected.length}</span>}
        </span>
        <span style={{
    ...styles.chevron,
    transform: dropdownOpen ? 'rotate(180deg)' : 'rotate(0deg)'
  }} className="filter-dropdown__chevron">
          ▼
        </span>
      </button>
      {dropdownOpen && <div style={styles.dropdownMenu} className="filter-dropdown__menu">
          <div style={styles.dropdownHeader} className="filter-dropdown__header">
            <input type="text" placeholder={searchPlaceholder} value={search} onChange={e => setSearch(e.target.value)} style={styles.dropdownSearchInput} className="filter-dropdown__search" autoFocus />
            <div style={styles.selectActions}>
              <button type="button" onClick={selectAll} style={styles.selectActionBtn} className="filter-dropdown__action-btn">
                Select all
              </button>
              <span className="filter-dropdown__separator">|</span>
              <button type="button" onClick={clearFilters} style={styles.selectActionBtn} className="filter-dropdown__action-btn">
                Clear
              </button>
            </div>
          </div>
          <div style={styles.dropdownList}>
            {filteredItems.length === 0 ? <div style={styles.noResults} className="filter-dropdown__no-results">{emptyLabel}</div> : filteredItems.map(item => {
    const itemClass = ['filter-dropdown__item', hoveredItem === item ? 'filter-dropdown__item--hovered' : '', isSelected(item) ? 'filter-dropdown__item--selected' : ''].filter(Boolean).join(' ');
    const checkboxClass = `filter-dropdown__checkbox${isSelected(item) ? ' filter-dropdown__checkbox--checked' : ''}`;
    return <div key={item} onClick={() => toggleItem(item)} onMouseEnter={() => setHoveredItem(item)} onMouseLeave={() => setHoveredItem(null)} style={styles.dropdownItem} className={itemClass}>
                    <div style={styles.checkbox} className={checkboxClass}>
                      {isSelected(item) && <span style={styles.checkmark}>✓</span>}
                    </div>
                    <span>{formatItemLabel(item)}</span>
                  </div>;
  })}
          </div>
        </div>}
    </div>;
};

export const SearchBar = ({value, onChange, placeholder = 'Search...'}) => {
  const baseStyle = {
    padding: '10px 14px',
    borderRadius: '8px',
    fontSize: '14px',
    outline: 'none',
    flex: 1,
    minWidth: 0
  };
  return <input type="text" placeholder={placeholder} value={value} onChange={e => onChange(e.target.value)} style={baseStyle} className="search-bar" />;
};

export const ConnectorPage = ({connector}) => {
  const styles = {
    header: {
      display: 'flex',
      alignItems: 'center',
      gap: '12px',
      marginBottom: '24px'
    },
    tagsRow: {
      display: 'flex',
      flexWrap: 'wrap',
      gap: '6px',
      marginTop: '8px'
    },
    releaseTag: {
      display: 'inline-block',
      padding: '2px 8px',
      borderRadius: '4px',
      fontSize: '11px',
      fontWeight: '500'
    },
    categoryTag: {
      display: 'inline-block',
      padding: '2px 8px',
      borderRadius: '4px',
      fontSize: '11px',
      fontWeight: '500'
    },
    icon: {
      width: '48px',
      height: '48px',
      borderRadius: '10px',
      padding: '2px'
    },
    title: {
      fontSize: '24px',
      fontWeight: '600'
    },
    subtitle: {
      fontSize: '14px'
    },
    authDescription: {
      fontSize: '14px',
      marginTop: 0
    },
    sectionTitle: {
      fontSize: '18px',
      fontWeight: '600',
      marginBottom: '12px'
    },
    codeWrapper: {
      position: 'relative',
      display: 'inline-flex',
      alignItems: 'center',
      maxWidth: '100%',
      cursor: 'pointer',
      overflowX: 'auto',
      overflowY: 'hidden',
      msOverflowStyle: 'none',
      scrollbarWidth: 'none'
    },
    code: {
      padding: '4px 8px',
      borderRadius: '4px',
      fontSize: '11px',
      display: 'inline-block',
      whiteSpace: 'nowrap',
      transition: 'background-color 0.15s'
    },
    tooltip: {
      position: 'absolute',
      top: '100%',
      left: '50%',
      transform: 'translateX(-50%)',
      padding: '6px 10px',
      borderRadius: '6px',
      fontSize: '11px',
      whiteSpace: 'nowrap',
      marginTop: '6px',
      zIndex: 50,
      maxWidth: '300px',
      wordBreak: 'break-all'
    },
    tooltipArrow: {
      position: 'absolute',
      bottom: '100%',
      left: '50%',
      transform: 'translateX(-50%)',
      borderWidth: '5px',
      borderStyle: 'solid',
      zIndex: 50
    }
  };
  const [search, setSearch] = React.useState('');
  const [copiedId, setCopiedId] = React.useState(null);
  const [selectedScopes, setSelectedScopes] = React.useState([]);
  const availableScopes = React.useMemo(() => {
    const set = new Set();
    connector.actions.forEach(a => {
      if (Array.isArray(a.requiredScopes)) {
        a.requiredScopes.forEach(s => {
          if (s) set.add(s);
        });
      }
    });
    return Array.from(set).sort();
  }, [connector.actions]);
  const filtered = React.useMemo(() => {
    const searchLower = search.toLowerCase();
    return connector.actions.filter(a => {
      const matchesSearch = a.label.toLowerCase().includes(searchLower) || a.description.toLowerCase().includes(searchLower) || a.id.toLowerCase().includes(searchLower);
      if (!matchesSearch) return false;
      if (selectedScopes.length === 0) return true;
      const scopes = Array.isArray(a.requiredScopes) ? a.requiredScopes : [];
      if (scopes.length === 0) return false;
      return selectedScopes.some(scope => scopes.includes(scope));
    });
  }, [connector.actions, search, selectedScopes]);
  const handleImageError = e => {
    e.target.style.display = 'none';
  };
  const formatCategoryLabel = cat => {
    const acronyms = ['ai', 'ats', 'crm', 'hris', 'iam', 'lms'];
    if (acronyms.includes(cat.toLowerCase())) {
      return cat.toUpperCase();
    }
    return cat.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
  };
  const ReleaseTag = () => {
    if (!connector.releaseStage || connector.releaseStage === 'ga') return null;
    const variantClass = connector.releaseStage === 'beta' ? 'connector-page-tag-beta' : 'connector-page-tag-preview';
    return <span style={styles.releaseTag} className={variantClass}>
        {connector.releaseStage.charAt(0).toUpperCase() + connector.releaseStage.slice(1)}
      </span>;
  };
  const CategoryTags = () => {
    if (!connector.categories || connector.categories.length === 0) return null;
    return <>
        {connector.categories.map(cat => <span key={cat} style={styles.categoryTag} className="connector-page-category-tag">
            {formatCategoryLabel(cat)}
          </span>)}
      </>;
  };
  const copyToClipboard = async (text, id) => {
    try {
      await navigator.clipboard.writeText(text);
      setCopiedId(id);
      setTimeout(() => setCopiedId(null), 1500);
    } catch (err) {
      console.error('Failed to copy:', err);
    }
  };
  const CopyChip = ({text, copyId}) => {
    const [isHovered, setIsHovered] = React.useState(false);
    const isCopied = copiedId === copyId;
    if (!text) {
      return null;
    }
    const codeClassName = `connector-page-code${isCopied ? ' connector-page-code--copied' : ''}`;
    return <div style={styles.codeWrapper} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} onClick={() => copyToClipboard(text, copyId)} title="">
        {(isHovered || isCopied) && <div style={styles.tooltip} className="connector-page-tooltip">
            {isCopied ? '✓ Copied!' : 'Click to copy'}
            <div style={styles.tooltipArrow} className="connector-page-tooltip-arrow" />
          </div>}
        <code style={styles.code} className={codeClassName}>
          {text}
        </code>
      </div>;
  };
  const KeyCell = ({id}) => <CopyChip text={id} copyId={id} />;
  const ScopesCell = ({scopes, actionId}) => {
    const scopeList = Array.isArray(scopes) ? scopes.filter(Boolean) : [];
    if (scopeList.length === 0) return null;
    return <div style={{
      display: 'flex',
      flexWrap: 'wrap',
      gap: '6px'
    }}>
        {scopeList.map(scope => <CopyChip key={scope} text={scope} copyId={`scopes:${actionId}:${scope}`} />)}
      </div>;
  };
  return <div>
      {}
      <div style={styles.header}>
        <img src={connector.icon} alt={connector.name} style={styles.icon} className="connector-page-icon" onError={handleImageError} />
        <div>
          <div style={styles.title}>{connector.name}</div>
          <div style={styles.subtitle} className="connector-page-subtitle">
            {connector.actions.length} actions · {connector.authentication.length} auth method{connector.authentication.length !== 1 ? 's' : ''}
          </div>
          {connector.releaseStage && connector.releaseStage !== 'ga' || connector.categories && connector.categories.length > 0 ? <div style={styles.tagsRow}>
              <ReleaseTag />
              <CategoryTags />
            </div> : null}
        </div>
      </div>

      {}
      <div style={styles.sectionTitle}>Authentication</div>
      <Columns cols={2}>        
        {connector.authentication.length > 0 ? connector.authentication.map(auth => {
    const authLabel = auth?.label || '';
    const authDescription = auth?.description;
    const configGuide = auth?.configGuide;
    const setupGuide = auth?.setupGuide;
    const hasConfigGuide = !!configGuide;
    const hasSetupGuide = !!setupGuide;
    const hasAnyGuide = hasConfigGuide || hasSetupGuide;
    return <Card key={authLabel} title={authLabel}>
                {authDescription && <p style={{
      ...styles.authDescription,
      marginBottom: hasAnyGuide ? '8px' : 0
    }} className="connector-page-auth-description">
                    {authDescription}
                  </p>}
                {hasAnyGuide && <span style={{
      fontSize: '14px'
    }}>
                    Guides: {hasSetupGuide && <a href={`/${setupGuide}`} style={{
      textDecoration: 'none'
    }}>Auth Config</a>}
                    {hasConfigGuide && hasSetupGuide && ', '}
                    {hasConfigGuide && <a href={`/${configGuide}`} style={{
      textDecoration: 'none'
    }}>Link Account</a>}
                  </span>}
              </Card>;
  }) : <>
            Contact StackOne for authentication details.
          </>}
      </Columns>

      <ActionsLibrary search={search} setSearch={setSearch} filtered={filtered} sharedStyles={{
    sectionTitle: styles.sectionTitle
  }} KeyCell={KeyCell} ScopesCell={ScopesCell} availableScopes={availableScopes} selectedScopes={selectedScopes} setSelectedScopes={setSelectedScopes} />

      <GettingStarted connector={connector} />

      {connector.documentation?.references?.length > 0 && <>
          <div style={styles.sectionTitle}>References</div>
          <Columns cols={2}>
            {connector.documentation.references.map(ref => {
    let safeHref;
    try {
      const parsed = new URL(ref.url);
      safeHref = parsed.protocol === 'http:' || parsed.protocol === 'https:' ? ref.url : undefined;
    } catch {
      safeHref = undefined;
    }
    return <Card key={`${ref.title}-${ref.url}`} title={ref.title} href={safeHref}>
                  {ref.description}
                </Card>;
  })}
          </Columns>
        </>}

    </div>;
};

export const connector = {
  "key": "tableau",
  "name": "Tableau",
  "icon": "https://stackone-logos.com/api/tableau/filled/png",
  "authentication": [{
    "label": "Personal Access Token",
    "description": "Use your Tableau Personal Access Token (PAT) for secure API authentication. PATs are long-lived tokens that can be revok...",
    "configGuide": "connectors/tableau/guides/link-account/personal-access-token",
    "setupGuide": "connectors/tableau/guides/auth-config/personal-access-token"
  }],
  "actions": [{
    "id": "tableau_query_datasources",
    "label": "Query Data Sources",
    "description": "Get a list of all data sources on the site",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_query_datasource",
    "label": "Query Data Source",
    "description": "Get details of a specific data source",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_update_datasource",
    "label": "Update Data Source",
    "description": "Update data source properties",
    "requiredScopes": ["tableau:datasources:update"]
  }, {
    "id": "tableau_delete_datasource",
    "label": "Delete Data Source",
    "description": "Delete a data source from the site",
    "requiredScopes": ["tableau:datasources:delete"]
  }, {
    "id": "tableau_query_datasource_connections",
    "label": "Query Data Source Connections",
    "description": "Get connection details for a data source",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_update_datasource_connection",
    "label": "Update Data Source Connection",
    "description": "Update connection details for a data source",
    "requiredScopes": ["tableau:datasources:update"]
  }, {
    "id": "tableau_get_datasource_revisions",
    "label": "Get Data Source Revisions",
    "description": "Get revision history for a data source",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_remove_datasource_revision",
    "label": "Remove Data Source Revision",
    "description": "Delete a specific revision of a data source",
    "requiredScopes": ["tableau:datasources:delete"]
  }, {
    "id": "tableau_add_tags_to_datasource",
    "label": "Add Tags To Data Source",
    "description": "Add tags to a data source",
    "requiredScopes": ["tableau:datasource_tags:update"]
  }, {
    "id": "tableau_download_datasource",
    "label": "Download Data Source",
    "description": "Download a data source file",
    "requiredScopes": ["tableau:datasources:download"]
  }, {
    "id": "tableau_unified_list_groups",
    "label": "IAM List Groups",
    "description": "List every group on the connected Tableau site, mapped to the StackOne IAM unified group schema. Wraps Tableau REST API...",
    "requiredScopes": ["tableau:groups:read"]
  }, {
    "id": "tableau_unified_get_group",
    "label": "IAM Get Group",
    "description": "Retrieve a single Tableau site group by LUID, mapped to the IAM unified group schema. Tableau does NOT expose a GET /gro...",
    "requiredScopes": ["tableau:groups:read"]
  }, {
    "id": "tableau_unified_list_resource_types",
    "label": "IAM List Resource Types",
    "description": "Returns the Tableau content types that support resource-scoped permission queries via unified_list_resource_users.",
    "requiredScopes": ["tableau:sites:read"]
  }, {
    "id": "tableau_unified_list_resource_users",
    "label": "IAM List Resource Users",
    "description": "List users and groups that hold permissions on a Tableau content item (workbook, datasource, view, project, or flow), ma...",
    "requiredScopes": ["tableau:permissions:read"]
  }, {
    "id": "tableau_unified_list_roles",
    "label": "IAM List Roles",
    "description": "Returns the nine built-in Tableau site roles as a synthesized role catalog.",
    "requiredScopes": ["tableau:sites:read"]
  }, {
    "id": "tableau_unified_get_role",
    "label": "IAM Get Role",
    "description": "Returns a single Tableau site role by its role key (e.g. \"Creator\", \"Viewer\").",
    "requiredScopes": ["tableau:sites:read"]
  }, {
    "id": "tableau_unified_list_users",
    "label": "IAM List Users",
    "description": "List every user on the connected Tableau site, mapped to the StackOne IAM unified user schema. Wraps Tableau REST API GE...",
    "requiredScopes": ["tableau:users:read"]
  }, {
    "id": "tableau_unified_get_user",
    "label": "IAM Get User",
    "description": "Retrieve a single Tableau site user by their LUID, mapped to the IAM unified user schema. Optionally pass expand=[\"group...",
    "requiredScopes": ["tableau:users:read"]
  }, {
    "id": "tableau_list_schedules",
    "label": "List Schedules",
    "description": "Get all schedules on the site",
    "requiredScopes": ["tableau:schedules:read"]
  }, {
    "id": "tableau_list_extract_refresh_tasks_for_site",
    "label": "List Extract Refresh Tasks For Site",
    "description": "Get all extract refresh tasks on the site",
    "requiredScopes": ["tableau:tasks:read"]
  }, {
    "id": "tableau_run_extract_refresh_task",
    "label": "Run Extract Refresh Task",
    "description": "Run an extract refresh task immediately",
    "requiredScopes": ["tableau:tasks:run"]
  }, {
    "id": "tableau_query_jobs",
    "label": "Query Jobs",
    "description": "Get all jobs on the site",
    "requiredScopes": ["tableau:jobs:read"]
  }, {
    "id": "tableau_get_job",
    "label": "Get Job",
    "description": "Get details of a specific job",
    "requiredScopes": ["tableau:jobs:read"]
  }, {
    "id": "tableau_cancel_job",
    "label": "Cancel Job",
    "description": "Cancel a running or pending job",
    "requiredScopes": ["tableau:jobs:update"]
  }, {
    "id": "tableau_list_project_permissions",
    "label": "List Project Permissions",
    "description": "Get permissions for a specific project",
    "requiredScopes": ["tableau:permissions:read"]
  }, {
    "id": "tableau_add_project_permissions",
    "label": "Add Project Permissions",
    "description": "Add permissions to a project for a user or group",
    "requiredScopes": ["tableau:permissions:update"]
  }, {
    "id": "tableau_delete_project_permission_for_user",
    "label": "Delete Project Permission For User",
    "description": "Remove a specific permission from a project for a user",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_delete_project_permission_for_group",
    "label": "Delete Project Permission For Group",
    "description": "Remove a specific permission from a project for a group",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_list_workbook_permissions",
    "label": "List Workbook Permissions",
    "description": "Get permissions for a specific workbook",
    "requiredScopes": ["tableau:permissions:read"]
  }, {
    "id": "tableau_add_workbook_permissions",
    "label": "Add Workbook Permissions",
    "description": "Add permissions to a workbook for a user or group",
    "requiredScopes": ["tableau:permissions:update"]
  }, {
    "id": "tableau_delete_workbook_permission_for_user",
    "label": "Delete Workbook Permission For User",
    "description": "Remove a specific permission from a workbook for a user",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_delete_workbook_permission_for_group",
    "label": "Delete Workbook Permission For Group",
    "description": "Remove a specific permission from a workbook for a group",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_list_datasource_permissions",
    "label": "List Data Source Permissions",
    "description": "Get permissions for a specific datasource",
    "requiredScopes": ["tableau:permissions:read"]
  }, {
    "id": "tableau_add_datasource_permissions",
    "label": "Add Datasource Permissions",
    "description": "Add permissions to a datasource for a user or group",
    "requiredScopes": ["tableau:permissions:update"]
  }, {
    "id": "tableau_delete_datasource_permission_for_user",
    "label": "Delete Datasource Permission For User",
    "description": "Remove a specific permission from a datasource for a user",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_delete_datasource_permission_for_group",
    "label": "Delete Datasource Permission For Group",
    "description": "Remove a specific permission from a datasource for a group",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_list_default_workbook_permissions",
    "label": "List Default Workbook Permissions",
    "description": "Get default workbook permissions for a project",
    "requiredScopes": ["tableau:permissions:read"]
  }, {
    "id": "tableau_list_default_datasource_permissions",
    "label": "List Default Datasource Permissions",
    "description": "Get default datasource permissions for a project",
    "requiredScopes": ["tableau:permissions:read"]
  }, {
    "id": "tableau_add_default_workbook_permissions",
    "label": "Add Default Workbook Permissions",
    "description": "Add default workbook permissions to a project",
    "requiredScopes": ["tableau:permissions:update"]
  }, {
    "id": "tableau_add_default_datasource_permissions",
    "label": "Add Default Datasource Permissions",
    "description": "Add default datasource permissions to a project",
    "requiredScopes": ["tableau:permissions:update"]
  }, {
    "id": "tableau_delete_default_workbook_permissions_for_user",
    "label": "Delete Default Workbook Permissions For User",
    "description": "Remove default workbook permissions from a project for a user",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_delete_default_workbook_permissions_for_group",
    "label": "Delete Default Workbook Permissions For Group",
    "description": "Remove default workbook permissions from a project for a group",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_delete_default_datasource_permissions_for_user",
    "label": "Delete Default Datasource Permissions For User",
    "description": "Remove default datasource permissions from a project for a user",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_delete_default_datasource_permissions_for_group",
    "label": "Delete Default Datasource Permissions For Group",
    "description": "Remove default datasource permissions from a project for a group",
    "requiredScopes": ["tableau:permissions:delete"]
  }, {
    "id": "tableau_query_projects",
    "label": "Query Projects",
    "description": "Get a list of all projects on the site",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_create_project",
    "label": "Create Project",
    "description": "Create a new project on the site",
    "requiredScopes": ["tableau:projects:create"]
  }, {
    "id": "tableau_update_project",
    "label": "Update Project",
    "description": "Update an existing project",
    "requiredScopes": ["tableau:projects:update"]
  }, {
    "id": "tableau_delete_project",
    "label": "Delete Project",
    "description": "Delete a project from the site",
    "requiredScopes": ["tableau:projects:delete"]
  }, {
    "id": "tableau_get_server_info",
    "label": "Get Server Info",
    "description": "Get Tableau Server product and version information"
  }, {
    "id": "tableau_query_current_site",
    "label": "Query Current Site",
    "description": "Get details of the site you are signed into",
    "requiredScopes": ["tableau:sites:read"]
  }, {
    "id": "tableau_get_current_server_session",
    "label": "Get Current Server Session",
    "description": "Get information about the current session",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_delete_server_session",
    "label": "Delete Server Session",
    "description": "Delete a specified server session (Tableau Server only)",
    "requiredScopes": ["tableau:sessions:delete"]
  }, {
    "id": "tableau_sign_out",
    "label": "Sign Out",
    "description": "Sign out and invalidate the current authentication token",
    "requiredScopes": ["tableau:*:*"]
  }, {
    "id": "tableau_switch_site",
    "label": "Switch Site",
    "description": "Switch to another site without re-authenticating (Tableau Server only)",
    "requiredScopes": ["tableau:sites:switch"]
  }, {
    "id": "tableau_revoke_admin_personal_access_tokens",
    "label": "Revoke Admin Personal Access Tokens",
    "description": "Revoke all PATs created by server administrators (Tableau Server only)",
    "requiredScopes": ["tableau:server_admin_tokens:delete"]
  }, {
    "id": "tableau_list_server_active_directory_domains",
    "label": "List Server Active Directory Domains",
    "description": "List all Active Directory domains configured on the server (Tableau Server only)",
    "requiredScopes": ["tableau:domains:read"]
  }, {
    "id": "tableau_update_server_active_directory_domain",
    "label": "Update Server Active Directory Domain",
    "description": "Update an Active Directory domain configuration (Tableau Server only)",
    "requiredScopes": ["tableau:domains:update"]
  }, {
    "id": "tableau_query_site_by_name",
    "label": "Query Site By Name",
    "description": "Get site details by site name",
    "requiredScopes": ["tableau:sites:read"]
  }, {
    "id": "tableau_query_site_by_content_url",
    "label": "Query Site By Content URL",
    "description": "Get site details by content URL",
    "requiredScopes": ["tableau:sites:read"]
  }, {
    "id": "tableau_get_recently_viewed",
    "label": "Get Recently Viewed",
    "description": "Get recently viewed content for the current user",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_get_embedding_settings",
    "label": "Get Embedding Settings",
    "description": "Get embedding settings for the site",
    "requiredScopes": ["tableau:embedding_site_settings:read"]
  }, {
    "id": "tableau_update_embedding_settings",
    "label": "Update Embedding Settings",
    "description": "Update embedding settings for the site",
    "requiredScopes": ["tableau:embedding_site_settings:update"]
  }, {
    "id": "tableau_update_site",
    "label": "Update Site",
    "description": "Update site settings",
    "requiredScopes": ["tableau:sites:write"]
  }, {
    "id": "tableau_create_site",
    "label": "Create Site",
    "description": "Create a new site (Server Admin only)",
    "requiredScopes": ["tableau:sites:write"]
  }, {
    "id": "tableau_delete_site",
    "label": "Delete Site",
    "description": "Delete a site by ID (Server Admin only)",
    "requiredScopes": ["tableau:sites:delete"]
  }, {
    "id": "tableau_get_site_by_id",
    "label": "Get Site By ID",
    "description": "Get site details using the site ID",
    "requiredScopes": ["tableau:sites:read"]
  }, {
    "id": "tableau_delete_site_by_content_url",
    "label": "Delete Site By Content URL",
    "description": "Delete a site using its content URL (Server Admin only)",
    "requiredScopes": ["tableau:sites:delete"]
  }, {
    "id": "tableau_delete_site_by_name",
    "label": "Delete Site By Name",
    "description": "Delete a site using its site name (Server Admin only)",
    "requiredScopes": ["tableau:sites:delete"]
  }, {
    "id": "tableau_query_views_for_site",
    "label": "Query Views For Site",
    "description": "Get all views across all workbooks in the site",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_list_sites",
    "label": "List Sites",
    "description": "List all sites on Tableau Server (not available for Tableau Cloud)",
    "requiredScopes": ["tableau:sites:read"]
  }, {
    "id": "tableau_get_user_personal_space",
    "label": "Get User Personal Space",
    "description": "Get the personal space for the current user (API 3.13+)",
    "requiredScopes": ["tableau:projects:read"]
  }, {
    "id": "tableau_list_authentication_configurations",
    "label": "List Authentication Configurations",
    "description": "List authentication configurations for a site (API 3.24+, Tableau Cloud only)",
    "requiredScopes": ["tableau:sites:read"]
  }, {
    "id": "tableau_delete_site_async",
    "label": "Delete Site Asynchronously",
    "description": "Delete a site asynchronously by ID (Server Admin only)"
  }, {
    "id": "tableau_delete_site_by_name_async",
    "label": "Delete Site Asynchronously By Name",
    "description": "Delete a site asynchronously by name (Server Admin only)"
  }, {
    "id": "tableau_delete_site_by_content_url_async",
    "label": "Delete Site Asynchronously By Content URL",
    "description": "Delete a site asynchronously by content URL (Server Admin only)",
    "requiredScopes": ["tableau:sites:delete"]
  }, {
    "id": "tableau_query_user_on_site",
    "label": "Query User On Site",
    "description": "Get details of a specific user on the site",
    "requiredScopes": ["tableau:users:read"]
  }, {
    "id": "tableau_get_users_on_site",
    "label": "Get Users On Site",
    "description": "List all users on the site with filtering and pagination",
    "requiredScopes": ["tableau:users:read"]
  }, {
    "id": "tableau_add_user_to_site",
    "label": "Add User To Site",
    "description": "Add a new user to the site",
    "requiredScopes": ["tableau:users:create"]
  }, {
    "id": "tableau_update_user",
    "label": "Update User",
    "description": "Update user details on the site",
    "requiredScopes": ["tableau:users:update"]
  }, {
    "id": "tableau_remove_user_from_site",
    "label": "Remove User From Site",
    "description": "Remove a user from the site",
    "requiredScopes": ["tableau:users:write"]
  }, {
    "id": "tableau_get_groups_for_user",
    "label": "Get Groups For User",
    "description": "Get all groups that a user belongs to",
    "requiredScopes": ["tableau:users:read"]
  }, {
    "id": "tableau_query_groups",
    "label": "Query Groups",
    "description": "Get a list of all groups on the site",
    "requiredScopes": ["tableau:groups:read"]
  }, {
    "id": "tableau_create_group",
    "label": "Create Group",
    "description": "Create a new group on the site",
    "requiredScopes": ["tableau:groups:create"]
  }, {
    "id": "tableau_update_group",
    "label": "Update Group",
    "description": "Update a group on the site",
    "requiredScopes": ["tableau:groups:update"]
  }, {
    "id": "tableau_delete_group",
    "label": "Delete Group",
    "description": "Delete a group from the site",
    "requiredScopes": ["tableau:groups:write"]
  }, {
    "id": "tableau_get_users_in_group",
    "label": "Get Users In Group",
    "description": "Get all users that belong to a group",
    "requiredScopes": ["tableau:groups:read"]
  }, {
    "id": "tableau_add_user_to_group",
    "label": "Add User To Group",
    "description": "Add a user to a group",
    "requiredScopes": ["tableau:groups:update"]
  }, {
    "id": "tableau_remove_user_from_group",
    "label": "Remove User From Group",
    "description": "Remove a user from a group",
    "requiredScopes": ["tableau:groups:update"]
  }, {
    "id": "tableau_list_personal_access_tokens",
    "label": "List Personal Access Tokens",
    "description": "List all personal access tokens for a user (Tableau Cloud only)",
    "requiredScopes": ["tableau:users:read"]
  }, {
    "id": "tableau_revoke_personal_access_token",
    "label": "Revoke Personal Access Token",
    "description": "Revoke a personal access token (Tableau Cloud only)",
    "requiredScopes": ["tableau:users:write"]
  }, {
    "id": "tableau_query_workbooks_for_site",
    "label": "Query Workbooks For Site",
    "description": "Get a list of all workbooks on the site",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_query_workbooks_for_user",
    "label": "Query Workbooks For User",
    "description": "Get all workbooks owned by a specific user",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_query_workbook",
    "label": "Query Workbook",
    "description": "Get details of a specific workbook",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_update_workbook",
    "label": "Update Workbook",
    "description": "Update workbook properties including name, owner, project, and acceleration settings",
    "requiredScopes": ["tableau:workbooks:update"]
  }, {
    "id": "tableau_delete_workbook",
    "label": "Delete Workbook",
    "description": "Delete a workbook from the site",
    "requiredScopes": ["tableau:workbooks:delete"]
  }, {
    "id": "tableau_refresh_workbook",
    "label": "Refresh Workbook",
    "description": "Refresh all extracts in a workbook",
    "requiredScopes": ["tableau:tasks:run"]
  }, {
    "id": "tableau_query_workbook_connections",
    "label": "Query Workbook Connections",
    "description": "Get connection details for a workbook",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_update_workbook_connection",
    "label": "Update Workbook Connection",
    "description": "Update connection details for a workbook",
    "requiredScopes": ["tableau:workbooks:update"]
  }, {
    "id": "tableau_get_workbook_revisions",
    "label": "Get Workbook Revisions",
    "description": "Get revision history for a workbook",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_add_tags_to_workbook",
    "label": "Add Tags To Workbook",
    "description": "Add tags to a workbook",
    "requiredScopes": ["tableau:content:write"]
  }, {
    "id": "tableau_delete_tag_from_workbook",
    "label": "Delete Tag From Workbook",
    "description": "Remove a tag from a workbook",
    "requiredScopes": ["tableau:content:write"]
  }, {
    "id": "tableau_query_views_for_workbook",
    "label": "Query Views For Workbook",
    "description": "Get all views in a specific workbook",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_get_view",
    "label": "Get View",
    "description": "Get details of a specific view",
    "requiredScopes": ["tableau:views:read"]
  }, {
    "id": "tableau_query_view_data",
    "label": "Query View Data",
    "description": "Get underlying data from a view in CSV format",
    "requiredScopes": ["tableau:views:download"]
  }, {
    "id": "tableau_add_tags_to_view",
    "label": "Add Tags To View",
    "description": "Add tags to a view",
    "requiredScopes": ["tableau:content:write"]
  }, {
    "id": "tableau_delete_tag_from_view",
    "label": "Delete Tag From View",
    "description": "Remove a tag from a view",
    "requiredScopes": ["tableau:content:write"]
  }, {
    "id": "tableau_list_custom_views",
    "label": "List Custom Views",
    "description": "Get a list of custom views on the site",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_get_custom_view",
    "label": "Get Custom View",
    "description": "Get details of a specified custom view",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_update_custom_view",
    "label": "Update Custom View",
    "description": "Update a custom view's name or owner",
    "requiredScopes": ["tableau:views:update"]
  }, {
    "id": "tableau_delete_custom_view",
    "label": "Delete Custom View",
    "description": "Delete a custom view",
    "requiredScopes": ["tableau:content:write"]
  }, {
    "id": "tableau_download_workbook",
    "label": "Download Workbook",
    "description": "Download the workbook file in .twbx format",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_download_workbook_pdf",
    "label": "Download Workbook As PDF",
    "description": "Export the workbook as a PDF file",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_download_workbook_powerpoint",
    "label": "Download Workbook As PowerPoint",
    "description": "Export the workbook as a PowerPoint file",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_download_workbook_revision",
    "label": "Download Workbook Revision",
    "description": "Download a specific revision of a workbook",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_get_workbook_preview_image",
    "label": "Get Workbook Preview Image",
    "description": "Get the preview image for a workbook",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_query_view_image",
    "label": "Query View Image",
    "description": "Get the view rendered as an image",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_query_view_pdf",
    "label": "Query View PDF",
    "description": "Export a view as a PDF file",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_download_view_crosstab_excel",
    "label": "Download View Crosstab As Excel",
    "description": "Export view data as an Excel crosstab file",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_get_view_by_path",
    "label": "Get View By Path",
    "description": "Get view details using the view's URL name",
    "requiredScopes": ["tableau:content:read"]
  }, {
    "id": "tableau_hide_view_recommendation",
    "label": "Hide View Recommendation",
    "description": "Hide a recommended view for the current user",
    "requiredScopes": ["tableau:content:write"]
  }, {
    "id": "tableau_unhide_view_recommendation",
    "label": "Unhide View Recommendation",
    "description": "Unhide a previously hidden view recommendation",
    "requiredScopes": ["tableau:recommendation_dismissals:delete"]
  }, {
    "id": "tableau_get_workbook_downgrade_info",
    "label": "Get Workbook Downgrade Info",
    "description": "Get version compatibility information for downgrading a workbook",
    "requiredScopes": ["tableau:workbook_downgrade_info:read"]
  }],
  "releaseStage": "preview",
  "categories": ["iam", "automation"],
  "scopeDefinitions": [{
    "name": "tableau:content:read",
    "description": "Read-only access to Tableau content including workbooks, data sources, views, projects, and sites"
  }, {
    "name": "tableau:content:write",
    "description": "Write access to Tableau content allowing creation and modification of workbooks, data sources, views, and projects"
  }, {
    "name": "tableau:users:read",
    "description": "Read user information including details and permissions"
  }, {
    "name": "tableau:users:create",
    "description": "Create and add users to the site"
  }, {
    "name": "tableau:users:update",
    "description": "Update user information including site role, full name, email, password, and authentication settings"
  }, {
    "name": "tableau:users:write",
    "description": "Write access to user management including creating, updating, and managing user permissions"
  }, {
    "name": "tableau:groups:read",
    "description": "Read group information and membership"
  }, {
    "name": "tableau:groups:create",
    "description": "Create new groups on the site"
  }, {
    "name": "tableau:groups:update",
    "description": "Update existing groups on the site"
  }, {
    "name": "tableau:groups:write",
    "description": "Write access to group management including creating and updating groups"
  }, {
    "name": "tableau:sites:read",
    "description": "Read site information and settings"
  }, {
    "name": "tableau:sites:write",
    "description": "Write access to site configuration and settings"
  }, {
    "name": "tableau:sites:delete",
    "description": "Delete sites (API 3.27+, Tableau Server only)"
  }, {
    "name": "tableau:sites:switch",
    "description": "Switch between different sites on Tableau Server without re-authenticating (API 3.27+, Tableau Server only)"
  }, {
    "name": "tableau:embedding_site_settings:read",
    "description": "Read site embedding security settings (API 3.16+)"
  }, {
    "name": "tableau:embedding_site_settings:update",
    "description": "Update site embedding security settings (API 3.16+)"
  }, {
    "name": "tableau:datasources:download",
    "description": "Download data source files from the site"
  }, {
    "name": "tableau:datasources:read",
    "description": "Read data source information and connections"
  }, {
    "name": "tableau:datasources:update",
    "description": "Update data source properties including owner, project, and certification status"
  }, {
    "name": "tableau:datasources:write",
    "description": "Write access to data sources including publishing and updating"
  }, {
    "name": "tableau:datasources:delete",
    "description": "Delete data sources from the site"
  }, {
    "name": "tableau:datasource_tags:update",
    "description": "Add or remove tags from data sources"
  }, {
    "name": "tableau:workbooks:create",
    "description": "Create and publish workbooks to the site"
  }, {
    "name": "tableau:workbooks:read",
    "description": "Read workbook information and metadata"
  }, {
    "name": "tableau:workbooks:update",
    "description": "Update workbook properties and connections (API 3.27+)"
  }, {
    "name": "tableau:workbooks:write",
    "description": "Write access to workbooks including publishing and updating"
  }, {
    "name": "tableau:workbooks:delete",
    "description": "Delete workbooks from the site"
  }, {
    "name": "tableau:views:read",
    "description": "Read view information and details"
  }, {
    "name": "tableau:views:download",
    "description": "Download view data in CSV format"
  }, {
    "name": "tableau:views:update",
    "description": "Update view and custom view properties"
  }, {
    "name": "tableau:projects:read",
    "description": "Read project information and hierarchy"
  }, {
    "name": "tableau:projects:create",
    "description": "Create new projects on the site"
  }, {
    "name": "tableau:projects:update",
    "description": "Update existing projects on the site"
  }, {
    "name": "tableau:projects:delete",
    "description": "Delete projects from the site"
  }, {
    "name": "tableau:projects:write",
    "description": "Write access to projects including creating, updating, and deleting"
  }, {
    "name": "tableau:permissions:read",
    "description": "Read permissions for content and users"
  }, {
    "name": "tableau:permissions:update",
    "description": "Update permissions for content and users (add or modify permissions)"
  }, {
    "name": "tableau:permissions:write",
    "description": "Write access to permissions including granting, revoking, and updating"
  }, {
    "name": "tableau:permissions:delete",
    "description": "Delete permissions for content and users"
  }, {
    "name": "tableau:flows:read",
    "description": "Read Tableau Prep flow information"
  }, {
    "name": "tableau:flows:write",
    "description": "Write access to Tableau Prep flows"
  }, {
    "name": "tableau:jobs:read",
    "description": "Read job and task information"
  }, {
    "name": "tableau:jobs:update",
    "description": "Update or cancel jobs"
  }, {
    "name": "tableau:tasks:read",
    "description": "Read extract refresh tasks"
  }, {
    "name": "tableau:tasks:run",
    "description": "Run extract refresh tasks"
  }, {
    "name": "tableau:schedules:read",
    "description": "Read schedule information"
  }, {
    "name": "tableau:schedules:create",
    "description": "Create new schedules"
  }, {
    "name": "tableau:schedules:update",
    "description": "Update existing schedules"
  }, {
    "name": "tableau:schedules:write",
    "description": "Write access to schedules"
  }, {
    "name": "tableau:domains:read",
    "description": "Read Active Directory domain information (API 3.27+, Tableau Server only)"
  }, {
    "name": "tableau:domains:update",
    "description": "Update Active Directory domain configuration (API 3.27+, Tableau Server only)"
  }, {
    "name": "tableau:server:read",
    "description": "Read Tableau Server information including version and REST API version (API 3.27+)"
  }, {
    "name": "tableau:sessions:delete",
    "description": "Delete server sessions (API 3.27+, Tableau Server only)"
  }, {
    "name": "tableau:server_admin_tokens:delete",
    "description": "Revoke all personal access tokens created by server administrators (API 3.27+, Tableau Server only)"
  }, {
    "name": "tableau:recommendation_dismissals:delete",
    "description": "Delete recommendation dismissals to unhide views from being recommended (API 3.27+, requires admin permissions)"
  }, {
    "name": "tableau:workbook_downgrade_info:read",
    "description": "Read workbook downgrade compatibility information (API 3.27+)"
  }, {
    "name": "tableau:*:*",
    "description": "Full access to all Tableau resources and operations. Required for Sign Out with UAT (API 3.27+)"
  }]
};

<ConnectorPage connector={connector} />
