今こそTableau REST APIを触ってみる

なぜ今、Tableau REST APIに注目するのか

Tableau MCPやTableau LangChainといった、生成AIを活用した新たな機能が次々とリリースされています。これらの機能は、データ分析と利用の可能性を大きく広げています。

しかしこれらの革新的な機能の裏側で、TableauのAPIがどのように働きTableau ServerやTableau Cloudと連携しているかをご存知でしょうか?

本記事では、これらの生成AI機能の背景に存在するTableau APIの中でもREST APIに焦点を当てます。プログラミング経験を持つTableau実務担当者や管理者の皆様に向けて、REST APIが提供する自由度と、実務に直結する可能性を具体的な利用例とともにご紹介します。

MCPやLangChainは「何」をどう動かしているのか

Tableauが提供しているAPIと連携し、チャットボット形式での操作を提供するTableau MCPや自然言語での質問応答を可能にするTableau LangChainは、Tableauの新しい利用体験を提供しています。

例えばTableau MCPでは2025年11月現在、以下のような機能がリリースされており、ユーザーにとって便利で直感的な操作を実現しています。(一部抜粋 詳細はこちら

  1. list-datasources 指定した Tableau サイトに公開されているデータソースの一覧を取得します。
  2. list-workbooks 指定した Tableau サイト上のワークブック一覧を取得します。
  3. get-workbook 指定したワークブックの詳細情報を取得します。
  4. get-view-data 指定したビューのデータを CSV 形式で取得します。
  5. get-view-image 指定したビューの画像を取得します。
  6. get-datasource-metadata 指定したデータソースのフィールド(列)メタデータを取得します。
  7. list-all-pulse-metric-definitions すべての Pulse メトリクス定義を一覧取得します。
  8. list-pulse-metric-subscriptions 現在のユーザーの Pulse メトリクス購読(サブスクリプション)一覧を取得します。

APIという選択肢

現状のTableau MCPではまだ機能が限定されており、「やりたいこと」すべてに対応できないこともあります。チャットボット形式で使用できるTableau MCPは便利ですが、コードが書ける、APIを触ったことがある人にとっては、APIという選択肢も有効です。

実際、Tableau MCPでは以下のAPIが使われています。

  1. REST API
  2. Metadata API
  3. VDS API

中でもREST APIは、Tableau Server / Tableau Cloud のコンテンツをプログラムから管理・操作可能なAPIとなっています。これにより現状のMCPでは実現できない、より高度で、企業独自の自動化や連携も設計できるのです。

また、APIの中身を知ることでTableau MCPやTableau LangChainで「どこまでできるのか」「将来何ができるようになりそうか」を理解する一助にもなるのです。

Tableau REST APIで「できること」

Tableau REST APIは、Tableau Server/Cloud上のほとんどのコンテンツや設定をプログラムから操作できるように設計されています。その機能群は多岐にわたりますが、実務上のメリットに焦点を当ててご紹介します。(詳細はこちら

運用効率化に直結する機能(ユーザー、グループ管理など)

  1. Users and Groups Methods: 新入社員の入社時や異動時に、ユーザーアカウントの追加、グループへの割り当て、ライセンスの付与などを行えます。手作業によるミスや工数を削減できます。
  2. Projects Methods: プロジェクトの作成、権限設定、コンテンツの整理などを一括で行い、ガバナンスを効かせた運用をサポートします。
  3. Permissions Methods: ワークブックやデータソースに対するアクセス権限をプログラムで一元管理できます。

データ連携・更新を自動化する機能

  1. Data Sources Methods / Extract and Encryption Methods: 外部システムでデータソースの準備が完了したタイミングで、Tableau内のデータソースや抽出の更新をトリガーできます。これにより、常に最新のデータをダッシュボードに反映させることが可能です。
  2. Publishing Methods: 外部ツールで作成したワークブックやデータソースを、API経由でTableauに公開(パブリッシュ)できます。

Metadataへのアクセス

  1. Metadata Methods: データソースのスキーマ、定義情報といったメタデータを取得できます。
  2. Workbooks and Views Methods: 特定のビューの情報を取得し、外部アプリケーションに組み込むなど、コンテンツの活用を高度化できます。

実践!PythonでTableau REST APIを扱ってみる

今回は、「Tableau Cloud上の大量のダッシュボードを把握・管理・棚卸しする」という課題を想定し、Tableau REST APIを使って「Tableau Cloud上のダッシュボードの所在地(フルパス)」を取得してみようと思います。

ちなみにTableau MCPでは、ワークブックが存在しているプロジェクトしか分からず、完全な所在地がわかりません。

そこで、Tableau REST APIの機能を組み合わせて、Pythonを用いてフルパス取得を試みます。

ステップ1: 環境準備

Tableau側

以下を準備していきます

  1. Tableau Server / Tableau CloudのURL
  2. Tableau Server:インストール先となるサーバー名またはIPアドレス
  3. Tableau Cloud:prod-apnortheast-a.online.tableau.com
  4. Tableau Server / Tableau Cloudのサイト名
  5. REST APIのバージョン
    1. こちらから、お使いのTableau Server/Cloud に対応したREST APIのバージョンをご使用ください。(今回の検証では3.27を使用します)
  • 個人用アクセストークン

    ①Tableau Cloudの設定から、「個人用アクセストークン」が有効かどうか確認します。

    ②アカウントアイコン>マイアカウントの設定>設定>個人用アクセストークンに移動します。

    ③テキストボックスに[トークン名]を記入し、「トークンを作成する」を選択します。

    ④[トークン名]と[シークレット]をメモします。

Python側

今回は以下を使用しました。

    1. バージョン:Python 3.12
    2. インストールが必要なモジュール
      1. requests (2.32.3)
      2. polars (1.0.0) →pandasでも可

ステップ2: REST APIを使用するための準備

REST APIを使用してTableau Server / Tableau Cloudの情報を取得するためにはもう1つ準備があります。

それが「認証」です。

ステップ1で発行した個人用アクセストークンを使用し、アクセストークンとSite IDを取得します。以下に使用したコードを記載します。

import json
from requests import get, post
#接続先情報
TABLEAU_SERVER = "prod-apnortheast-a.online.tableau.com"
#Tableau Cloudの場合。Tableau Serverの場合は、インストール先となるサーバー名またはIPアドレス。
TABLEAU_URI = "xxxxx" #サイト名
TABLEAU_VERSION = "3.27" #お使いのTableau Server/Cloud に対応したREST APIのバージョン
# REST APIのトークン情報
TABLEAU_TOKEN_NAME = "yyyyy" #トークン名
TABLEAU_TOKEN_VALUE = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" #シークレット
# tokenとSite IDを取得する関数
def get_token(server, uri, version, name, secret):
    # Requestを送信する準備
    signin_url = "https://{server}/api/{version}/auth/signin".format(server=server, version=version)
    payload = {
        "credentials": {
            "personalAccessTokenName": name,
            "personalAccessTokenSecret": secret,
            "site": {"contentUrl": uri}
        }
    }
    headers = {"accept": "application/json", "content-type": "application/json"}

    # Requestを送信する
    request = post(signin_url, json=payload, headers=headers)
    request.raise_for_status()
    # HTTP Responseを取得
    response = json.loads(request.content)
    # credentialsのエレメントからTokenを取得する
    token = response["credentials"]["token"]
    # Site IDエレメントからSite IDを取得する
    site_id = response["credentials"]["site"]["id"]
    return token, site_id

# ----- ここからメイン処理スタート ----- #
token,site_id = get_token(TABLEAU_SERVER, TABLEAU_URI, TABLEAU_VERSION, TABLEAU_TOKEN_NAME, TABLEAU_TOKEN_VALUE)
 

ステップ3: 必要なAPI Methodの確認

今回の目的は「Tableau Cloud上のダッシュボードの所在地(フルパス)の取得」です。

そこでREST APIのドキュメントを参考にし、どの機能を使うべきか下調べをします。

https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref.htm

今回は以下の機能を使用します。

  1. Projects Methods / Query Projects →プロジェクトIDと名前、及びその親プロジェクトIDを取得するため
  1. Workbooks Methods / Query Workbooks for Site →ワークブックと、ワークブックが存在しているプロジェクトIDを取得するため

以下に、Projects Methods / Query Projectsを使用したコードを記載します。ここで「content」はAPIの機能を表します。

例:Projects Methods→projects

※APIで取得したデータの構造や内容が気になる方は、コード内のprint( json.dumps( ) )をご利用ください。

# 接続先情報とget tokenはステップ2を参照
# REST APIから情報を取得する関数
def get_content(server, version, token, site_id, content):
    # Requestを送信する準備
    main_headers = {"X-tableau-auth":token, "accept": "application/json"}
    # pageSize=1000を指定(デフォルトは100)
    url="https://{server}/api/{version}/sites/{id}/{content}?pageSize=1000".format(server=server, version=version, id=site_id, content=content)

    # Requestを送信してcontentsを取得
    contents = get(url, headers=main_headers).content
    # json形式でcontentsを返す
    return json.loads(contents)

# ----- ここからメイン処理スタート ----- #
token,site_id = get_token(TABLEAU_SERVER, TABLEAU_URI, TABLEAU_VERSION, TABLEAU_TOKEN_NAME, TABLEAU_TOKEN_VALUE)
# Project情報を取得
content = "projects"
projects_data = get_content(TABLEAU_SERVER, TABLEAU_VERSION, token, site_id, content)
#print(json.dumps(projects_data, indent=2)) # 構成を見る際は、コメントアウトを外してください

ステップ4: 整形処理とコードの作成

REST APIを使用して必要な情報を取得できたので、ここからは取得した情報をもとに「ダッシュボードの所在地(フルパス)」を作成していきます。

Projects Methods / Query Projectsでは、プロジェクトと、その親プロジェクトの情報を取得できるので、「親子関係を持つプロジェクトの辞書から、ルートからのフルパスを作成する」という処理を作成します。

from functools import lru_cache
# ProjectのFull Pathを取得する関数
# キャッシュを使用するため、project_dictは引数に入れず外側で参照
@lru_cache(maxsize=None)
def get_full_path(project_id):
    path = []
    # IDから現在のフォルダを取得
    current = projects_dict.get(project_id)
    while current:
        path.insert(0, current["Project Name"])  # ルートからの順序で追加
        # 親をたどる
        current = projects_dict.get(current["Parent ID"])

    # パス文字列に結合して返す
    return r"\\".join(path)

# 構成を見て、取得したい情報を指定
projects_list = projects_data["projects"]["project"]
# プロジェクトIDごとに、プロジェクト名と親プロジェクトIDを辞書化
projects_dict = {
    project["id"]: {
        "Project Name": project["name"],
        "Parent ID": project.get("parentProjectId")
    }
    for project in projects_list
}
# Project IDをキーに、ProjectのFull Pathを辞書化
full_paths_dict = {project_id: get_full_path(project_id) for project_id in projects_dict}

ワークブックの情報も、プロジェクトと同様に取得して、先ほど作成したフルパスと結合させます。

# Workbook情報を取得
content = "workbooks"
workbooks_data = get_content(TABLEAU_SERVER, TABLEAU_VERSION, token, site_id, content)
#print(json.dumps(workbooks_data, indent=2)) # 構成を見る際は、コメントアウトを外してください
# 構成を見て、取得したい情報を指定
workbooks_list = workbooks_data["workbooks"]["workbook"]
output_data = []
# WorkbookとProjectのFull Pathを結び付ける
for workbook in workbooks_list:
    proj = workbook.get("project") or {}
    proj_id = proj.get("id")
    proj_path = full_paths_dict.get(proj_id, "Unknown Project")
    workbook_name = workbook.get("name", "(no name)")
    url =workbook.get("webpageUrl") or ""
    output_data.append({"Path": f"{proj_path}\\{workbook_name}", "URL": url})
 

最後に、CSV化の処理を挟んで完成です。

import json
import polars as pl
from functools import lru_cache
from requests import get, post
# ----- 各種設定 ----- #
# 接続先情報
TABLEAU_SERVER = "prod-apnortheast-a.online.tableau.com"
#Tableau Cloudの場合。Tableau Serverの場合は、インストール先となるサーバー名またはIPアドレス。

TABLEAU_URI = "xxxxx" #サイト名
TABLEAU_VERSION = "3.27" #お使いのTableau Server/Cloud に対応したREST APIのバージョン

# REST APIのトークン情報
TABLEAU_TOKEN_NAME = "yyyyy" #トークン名
TABLEAU_TOKEN_VALUE = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" #シークレット

# tokenとSite IDを取得する関数
def get_token(server, uri, version, name, secret):
    # Requestを送信する準備
    signin_url = "https://{server}/api/{version}/auth/signin".format(server=server, version=version)
    payload = {
        "credentials": {
            "personalAccessTokenName": name,
            "personalAccessTokenSecret": secret,
            "site": {"contentUrl": uri}
        }
    }
    headers = {"accept": "application/json", "content-type": "application/json"}

    # Requestを送信する
    request = post(signin_url, json=payload, headers=headers)
    request.raise_for_status()
    # HTTP Responseを取得
    response = json.loads(request.content)
    # credentialsのエレメントからTokenを取得する
    token = response["credentials"]["token"]
    # Site IDエレメントからSite IDを取得する
    site_id = response["credentials"]["site"]["id"]
    return token, site_id

# REST APIから情報を取得する関数
def get_content(server, version, token, site_id, content):
    # Requestを送信する準備
    main_headers = {"X-tableau-auth":token, "accept": "application/json"}
    # pageSize=1000を指定(デフォルトは100)
    url="https://{server}/api/{version}/sites/{id}/{content}?pageSize=1000".format(server=server, version=version, id=site_id, content=content)

    # Requestを送信してcontentsを取得
    contents = get(url, headers=main_headers).content
    # json形式でcontentsを返す
    return json.loads(contents)

# ProjectのFull Pathを取得する関数
# キャッシュを使用するため、project_dictは引数に入れず外側で参照
@lru_cache(maxsize=None)
def get_full_path(project_id):
    path = []
    # IDから現在のフォルダを取得
    current = projects_dict.get(project_id)
    while current:
        path.insert(0, current["Project Name"])  # ルートからの順序で追加
        # 親をたどる
        current = projects_dict.get(current["Parent ID"])

    # パス文字列に結合して返す
    return r"\\".join(path)

# ----- ここからメイン処理スタート ----- #
token,site_id = get_token(TABLEAU_SERVER, TABLEAU_URI, TABLEAU_VERSION, TABLEAU_TOKEN_NAME, TABLEAU_TOKEN_VALUE)
# Project情報を取得
content = "projects"
projects_data = get_content(TABLEAU_SERVER, TABLEAU_VERSION, token, site_id, content)
#print(json.dumps(projects_data, indent=2)) # 構成を見る際は、コメントアウトを外してください

# 構成を見て、取得したい情報を指定
projects_list = projects_data["projects"]["project"]
# プロジェクトIDごとに、プロジェクト名と親プロジェクトIDを辞書化
projects_dict = {
    project["id"]: {
        "Project Name": project["name"],
        "Parent ID": project.get("parentProjectId")
    }
    for project in projects_list
}
# Project IDをキーに、ProjectのFull Pathを辞書化
full_paths_dict = {project_id: get_full_path(project_id) for project_id in projects_dict}

# Workbook情報を取得
content = "workbooks"
workbooks_data = get_content(TABLEAU_SERVER, TABLEAU_VERSION, token, site_id, content)
#print(json.dumps(workbooks_data, indent=2)) # 構成を見る際は、コメントアウトを外してください

# 構成を見て、取得したい情報を指定
workbooks_list = workbooks_data["workbooks"]["workbook"]

output_data = []
# WorkbookとProjectのFull Pathを結び付ける
for workbook in workbooks_list:
    proj = workbook.get("project") or {}
    proj_id = proj.get("id")
    proj_path = full_paths_dict.get(proj_id, "Unknown Project")
    workbook_name = workbook.get("name", "(no name)")
    url =workbook.get("webpageUrl") or ""
    output_data.append({"Path": f"{proj_path}\\{workbook_name}", "URL": url})
df_output = pl.DataFrame(output_data)

# Path順でソートする
df_output = df_output.sort("Path")
df_output.write_csv("./DsB_FullPath.csv")
 

出力結果は以下の通りです。ついでにダッシュボードのURLも取得してみました。

Path,URL
Admin Insights\Admin Insights Starter,https://prod-apnortheast-a.online.tableau.com/#/site/......
Admin Insights\売上yyyymm,https://prod-apnortheast-a.online.tableau.com/#/site/......
検証用\\レビュー用\\可視化研修,https://prod-apnortheast-a.online.tableau.com/#/site/.....
 

まとめと今後の展望

REST APIを使用することで、より自由にTableau ServerやTableau Cloudのコンテンツの整理や自動運用が実現できます。

ただし、生成AIによるMCPの方がコードを書かずに操作できるため、便利なこともまた事実です。今後はREST APIの自由度とMCPの使いやすさが融合していくことを期待し、新たな機能追加を期待しながら待ちましょう。

株式会社キーウォーカーでは、Tableau REST APIを使用した運用支援も可能です「自社の運用に合わせたAPI連携を構築したい」「Tableauのガバナンスを強化したい」といったご要望がございましたら、ぜひお気軽にご相談ください。

ShtockData

お問い合わせフォーム

お問い合わせ項目を選択してください