tableau-embed

tableau-embed

Embeds live, interactive Tableau dashboards in ChatGPT, pushing mark selections to the model so questions about specific data points are answered with live queried numbers.

Category
访问服务器

README

Tableau MCP App

Render a live, interactive Tableau dashboard inside ChatGPT, click a mark, and ask about what you clicked.

Not a screenshot and not a link out. The real viz, embedded in the conversation, filterable and hoverable — and when you select something, the selection is pushed to the model so that "why is this one so low?" resolves to the mark under your cursor.

You click Fasteners on the dashboard.

  Fasteners selected on "KPI by Sub-Category" - nothing else is filtered.
  Mark: Sub-Category: Fasteners | AGG(KPI Value): 8,532 | AGG(KPI Label): $8.5K
  Parameters: Profit Bin Size = 200 | Top Customers = 5 | p.KPI = Sales

You: "why is this one so low?"

ChatGPT: "Sales: $8,532, lowest of 17 sub-categories. Average line sale: $37.26...
          980 units across 226 orders. Average discount 7.9%, so discounting is
          not the main cause. Profit: $2,429, a healthy 28.5% margin."

Those numbers are queried live from the Tableau data source, not invented — verified against the raw query response, which is a distinction worth insisting on.

What this actually is

An MCP Apps server. It exposes one tool that returns a ui:// resource — an HTML view the host mounts in a sandboxed iframe — which loads the Tableau Embedding API, renders your viz, and reports the on-screen state back to the model as the user interacts with it.

It deliberately returns no data of its own. The embed supplies the scope; a Tableau data query tool supplies the numbers. See How it works for why that split is the right one.

Status, honestly

ChatGPT Works. Renders, interacts, and pushes state; a selected mark was verified to scope the answer against a live query. You have to name the connector when asking — see Invoking it.
Claude Desktop Renders nothing. It approves the frameDomains CSP declaration and then blocks frame-src anyway — a host defect no server-side change can work around. Details.
Tableau Public Works anonymously, no credentials needed.
Tableau Cloud Works, via a Direct Trust Connected App JWT signed server-side.

This is a working prototype built to answer a question — can you have a real conversation with a dashboard you're looking at? — and the answer turned out to be yes, with caveats worth reading.

Invoking it

Name the connector:

"Use the tableau-embed connector to show me the Superstore Performance dashboard"

This is the documented invocation, not a workaround for a bug. Asked without naming it, "show me the dashboard" reliably loses to ChatGPT's own chart builder, which will happily construct a convincing dashboard out of sample data and present it as an answer. Three rewrites of the tool description failed to change that. Once the dashboard is on screen, ordinary questions work normally — you only need to name the connector for the initial render.

Quickstart

Requires Node 18+ and, for the Cloud path, a Tableau Connected App.

git clone https://github.com/nuggenlabs/tableau-chatgpt-embed.git
cd tableau-chatgpt-embed
npm install
npm test          # proves the viz renders under the real sandbox CSP, headlessly

npm test is worth running before anything else. It reproduces the MCP Apps iframe sandbox and its Content Security Policy locally, drives a real Tableau viz through it in headless Chrome, and tells you which of the four layers fails if one does. It also drives a real mark selection and asserts the selection reaches the host — so a broken state push fails the build rather than surfacing as a confused answer three weeks later.

To run it against a dashboard and connect it to ChatGPT:

cp .env.example .env      # fill in, or delete the four credential lines for Tableau Public
npm start

Then expose it over HTTPS and register the /mcp URL as a connector. On Windows, run.ps1 does the whole sequence — server, tunnel, health check, paste-ready URL:

powershell -ExecutionPolicy Bypass -File .\run.ps1

Full walkthrough, including the credential traps: docs/SETUP.md.

Documentation

Document What's in it
Setup Credentials, tunnels, the startup preflight, and getting it into ChatGPT
How it works Architecture, how on-screen state reaches the model, mark selection
Host support What works where, and the Claude Desktop frame-src block in detail
Troubleshooting Failures that cost real time here, and what each one actually was
Scoping test A protocol for testing whether the model uses on-screen state

Two findings worth stealing

A tool description is a routing instruction — and it can lose. "Show me the Superstore dashboard" was answered by ChatGPT building a plausible lookalike from a sample dataset — invented numbers, presented as an answer. Three successive rewrites of the description failed to win the request back, including one that names the competing behaviour and refuses the substitution outright. A tool competes with everything the host can do, not just its siblings in the same server, and against a first-party tool a description may simply not be enough. Unresolved — name the connector, as below.

Ask the harness, not the model. A model is not a reliable instrument for measuring its own context. When on-screen state stopped reaching ChatGPT, four plausible theories each blamed the wrong layer; what settled it was planting a random token in every push and asking for it back — thirteen pushes, every call resolved, none delivered. docs/SCOPING-TEST.md is the general form of that lesson.

Layout

src/
  server.js         MCP server: the tool, the ui:// resource, HTTP + stdio transports
  view.html         the embedded view - renders the viz, reads state, pushes it to the model
  build-view.js     inlines the MCP Apps client SDK into the view at build time
  connected-app.js  Direct Trust JWT minting for authenticated Cloud embeds
  preflight.js      startup credential and URL checks, so failures surface here not in ChatGPT
  env.js            dependency-light .env loader; shell variables win over the file
test/
  sandbox-harness.js   reproduces the host: the iframe sandbox, the CSP, the ui/ JSON-RPC contract
  feasibility.test.js  end-to-end - viz renders, host contract satisfied, state reaches the model
  server.smoke.js      MCP protocol correctness
  preflight.test.js    credential-failure classification, stubbed
  env.test.js          .env parsing and precedence
docs/                  see the table above
run.ps1                Windows launcher: server + tunnel + health + paste-ready URL

No build step and three runtime dependencies. The Tableau Embedding API is loaded by the view at runtime from Tableau's own CDN, which the sandbox CSP has to allow — that constraint drives more of the design than anything else.

Not yet built

  • Choosing a dashboard by name. One viz is baked in at startup via TABLEAU_VIZ_URL. Switching conflicts with the one-embed-per-conversation rule, which exists because a second embed mounts a fresh unfiltered viz and silently resets the reported scope.
  • Inbound authentication. /mcp is open to anyone who can reach it, and resources/read mints an embed token on demand. Fine behind an ephemeral tunnel; do not put this on a permanent public hostname without putting something in front of it.

License

MIT — see LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选