🍔

Tableau MCPのOAuth認証を試してみた

に公開

カスタマーサクセスマネージャーの玉井です。

やっっとTableauの2025.3がリリースされました。それに伴い、Tableau MCPのOAuth認証が使えるようになったので、実際にやってみたいと思います。

前段の話〜MCPの認証認可について

ご存知の方も多いと思いますが、Model Context Protocol (MCP) は、大規模言語モデル(LLM)を、外部ツール・サービス等に安全に接続するための標準的な仕組み・規格です(Anthropic社が提唱しました)。

MCPの登場によって、人間の代わりにLLMが色々なサービスにアクセスできるようになり、おかげでめちゃくちゃ便利な時代になりました。ただ、LLMが色々なサービスにアクセスできるようになったというのは、便利な反面、非常にリスクも伴います。セキュリティをしっかりしなくてはいけません。当然な話で、色々なサービスにアクセスできるようになったということは、機密性の高いリソースにアクセスする可能性もあるわけで、誰がどの範囲でアクセスを許可されているのか等を厳格に管理することが必須です。

MCPの通信方式として、STDIO方式というものがあります。どう考えても、今すぐググってもらったほうが正しい知識が得られると思いますが、ここでもサラッと書いておくと、MCPサーバーをMCPクライアントと同じ場所(要するにローカル)で起動して使う方法です。これは個人でパパッと検証するには楽なんですけど、大企業で複数人が使うと想定した場合、多数のユーザーが各々の端末で設定することになるので、セキュリティリスクがあったり、バージョンがユーザーによって違ってきたり、課題が結構出てきます。

なので、大規模利用を考えると、必然的に、HTTP方式を選ぶことになります。HTTP方式であれば、リモートMCPとして1つのMCPサーバーを用意して、ユーザーはそれを共同利用する、という形式をとることもできます。ただし、HTTP形式である以上、利用する際の認証まわりが課題になってきます。

そこで、MCPは2025年3月に、認証として仕様としてOAuth 2.1を採用[1]されました。

ちなみに本家のドキュメントはこちら。

https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization

元々、Tableau MCPにはHTTP方式として利用できるオプションはありましたが、今までは認証という概念がなかった(PATかConnect APPとしてTableau ServerやCloudに登録しておく)のですが、最近、ようやくMCP本元が定めるOAuth認証の仕組みを搭載した…ということです、たぶん。

Tableau MCPのOAuth認証に対応しているのは…

2025年12月現在、Tableau Server 2025.3以降のみ、Tableau MCPをOAuth認証で使用することができます。2025.1以前や、Tableau Cloudはまだ未対応[2]となっています。

Tableau MCPのOAuthのドキュメントはこちら。

https://tableau.github.io/tableau-mcp/docs/configuration/mcp-config/oauth

検証環境について

というわけで、実際に試してみたいと思います。

上記の通り、現在はTableau Server 2025.3じゃないとできないので、Tableau ServerとリモートTableau MCPを、Google Cloudに用意します。

全体像ざっくり

以下を準備します。

準備する

Tableau Serverの準備

Compute Engineを用意し、Tableau Server 2025.3をインストールします。出たてほやほやの最新バージョンですが、インストール自体は従来通りの作業で終わります。

ちなみにスペックは以下の通り。

  • n2-standard-8
    • メモリがちょっと足りませんがゴリ押しインストール
  • Rocky Linux 8
    • Tableau Server Linux 2025.3
    • ローカル認証
  • ブート50GB + データ500GB(SSD)
  • Shielded VM有効

また、セキュリティ的にちょっと色々と事情があるので、直接接続ではなく、ロードバランサーを前面に置きます。

ここまではTableau MCPは関係無いので、サラッと書いて終わります。

Tableau MCPのデプロイ

この後、Tableau MCPをCloud Runにデプロイするのですが、その前に、OAuth認証のための、いくつか設定をします。

OAuth認証の準備

Tableau MCPのOAuth認証では、RSA秘密鍵がJWEアクセストークンの復号に必要ですので、まず、OAuth認証で使用するJWE用のRSA秘密鍵を生成します。

openssl genrsa -out oauth-private.pem 2048

で、秘密鍵をSecret Managerに保存します。

gcloud secrets create oauth-jwe-private-key \
  --project=${PROJECT_ID} \
  --replication-policy="automatic"

gcloud secrets versions add oauth-jwe-private-key \
  --data-file=oauth-private.pem \
  --project=${PROJECT_ID}

これで、Tableau MCPで使用する秘密鍵を安全に管理することができます。

サービスアカウント

Cloud Run用のサービスアカウントを作成します。

gcloud iam service-accounts create tableau-mcp-sa \
  --display-name="Tableau MCP Service Account" \
  --project=${PROJECT_ID}

そして、そのサービスアカウントに、Secret Managerへのアクセス権限を付与しておきます。

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:tableau-mcp-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

Cloud Runへデプロイ

基本的には以下と同じです。

https://zenn.dev/cavernaria/articles/dabb3c072a8c84

ただ、今回はOAuth認証でTableau MCPを使用するため、デプロイ時に指定する環境変数が、上記記事とは異なります。

SERVICE_NAME="tableau-mcp-server"
TABLEAU_SERVER_URL="https://xxxxxxxx"

gcloud run deploy ${SERVICE_NAME} \
  --image=${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO_NAME}/tableau-mcp-server:latest \
  --region=${REGION} \
  --project=${PROJECT_ID} \
  --platform=managed \
  --ingress=all \
  --no-allow-unauthenticated \
  --min-instances=1 \
  --service-account=tableau-mcp-sa@${PROJECT_ID}.iam.gserviceaccount.com \
  --set-env-vars="TRANSPORT=http,AUTH=oauth,OAUTH_ISSUER=http://localhost:8080,SERVER=${TABLEAU_SERVER_URL},SITE_NAME=,TRUST_PROXY_CONFIG=true" \
  --set-secrets="OAUTH_JWE_PRIVATE_KEY=oauth-jwe-private-key:latest"
  • AUTH
    • 認証方式をOAuthに指定します。
  • OAUTH_ISSUER
    • MCPサーバーのホストを指定します。
    • 上記記事と同じく、プロキシ経由でアクセスするため、ローカルを指定しています。
  • OAUTH_JWE_PRIVATE_KEY
    • 認証時に使用する秘密鍵を指定します。
    • 先ほど設定したSecret Managerを使います。

サイトはデフォルトのため、SITE_NAMEは空欄にしています。

Tableau Server側の設定

Tableau MCPのOAuth認証を実施するためには、実はTableau Server側の設定も必要です。

具体的には以下のコマンドを実行します。

tsm configuration set -k oauth.allowed_redirect_uri_hosts -v "localhost,your-cloud-run-url.run.app"
tsm pending-changes apply

MCPホスト(今回はClaude Desktop)からOAuth認証が走る時、Tableau Server(の認証画面)にリダイレクトするわけですが、デフォルトで何でもかんでもリダイレクトを許可するようになっていないので、明示的にリダイレクトを許可するMCPホストを上記tsmコマンドで指定する必要があります[3]。

Claude Desktopの設定

リモートMCPサーバーに接続する扱いになるので、拡張機能ではなく、普通に設定ファイルを編集して対応します[4]。

{
  "mcpServers": {
    "tableau-cloud-run": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "http://localhost:8080/tableau-mcp"
      ]
    }
  }
}

実際に認証してみる

事前の設定

ユーザー

Tableau Serverに2人のユーザーを準備します。

  • admin
    • サーバー管理者
    • 要するに全部が見える
  • テスト玉太郎
    • Viewer
    • パーミッションの無いワークブックやプロジェクトは見れない

パーミッション

Tableau Serverには以下のプロジェクトがあります。

このうち、テスト玉太郎は、etcプロジェクトは一切見えなくしてあります(ワークブック等も全部拒否にしてます)。

OAuth認証ということは、すごく雑にいうと、Tableau Serverのユーザーで認証するということなので、MCP経由で取得できる情報に、権限の差が出ることがわかれば、検証成功となります(テスト玉太郎としてTableau MCPに色々聞いても、etcプロジェクトの情報は一切出なければ良い)。

いざ認証

Claude Desktopを起動すると、すぐさまリダイレクトされます。映しちゃいけない部分を避けることに四苦八苦しながら録画したものをご覧ください。

上記はテスト玉太郎でログインしています。ワークブックは3つしか出てきていません。

しかし、管理者として認証してから、同じ質問してみると、以下の通り、ワークブックが4つでてきます。

管理者が聞いたときしか出てきていないStalking Niinoというワークブックは、パーミッションでテスト玉太郎には表示させないようにしているetcというプロジェクト下にあります。動作としては意図通りなので成功といえるでしょう。。

MCPの認証認可について

さて、Tableau MCPのOAuth認証の検証ができたわけですが、そもそも「MCP」の認証認可については、まだまだ課題があるようです。

以下の記事が非常に参考になりました。

https://hi120ki.github.io/ja/blog/posts/20250728/

MCP自体がまだ認証認可について課題が色々あり、絶賛議論中なので、もう少しそれらが確立されない限り、Tableau MCPの本格利用も、もうちょっと先かもしれません(物理的には使えるが、組織のセキュリティポリシー等と照らし合わせたときに、本当に安全に使えると判断できるかどうかはまだ難しい気がしました)。

おわりに

氣づき

無知な私は「OAuth認証さえ搭載されれば、Tableau MCPは組織で使える!」と思っていましたが、そもそもMCP自体の大規模利用(エンタープライズ)における認証認可問題は現在進行系で課題議論中であり、そこが落ち着かない限り、Tableau MCPも同じである…ということに氣づきました。

今回の検証をするにあたって目を通したもの[5]

https://hi120ki.github.io/ja/blog/posts/20250728/
https://speakerdeck.com/hi120ki/mcp-authorization
https://auth0.com/blog/jp-an-introduction-to-mcp-and-authorization/
https://zenn.dev/demouth/articles/57f8444c7a487f
https://zenn.dev/toccasystems/articles/mcp-oauth21-pkce-guide
https://qiita.com/icoxfog417/items/ef2c3382056968032dd5

脚注
  1. 採択?仕様追加?日本語でなんと表現すればいいのかわからない… ↩︎

  2. 2026年前半に対応予定 ↩︎

  3. たぶんこのパラメータが2025.3以降にしかない? ↩︎

  4. プロキシ経由なのでlocalhost指定 ↩︎

  5. 理解したとはいっていない ↩︎

Discussion