Skip to content
Open
Show file tree
Hide file tree
Changes from 66 commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
c160092
Make server non-singleton
anyoung-tableau Jun 13, 2025
39a133b
Make config non-singleton
anyoung-tableau Jun 13, 2025
00a8080
Parameterize transport
anyoung-tableau Jun 13, 2025
41cb5c0
Add streamable http transport layer
anyoung-tableau Jun 13, 2025
5280635
Wire up relatedRequestId
anyoung-tableau Jun 18, 2025
3372525
Add start:http script
anyoung-tableau Jun 18, 2025
f1f0b81
Add signOut API
anyoung-tableau Jun 18, 2025
b72e16c
Add useRestApi
anyoung-tableau Jun 18, 2025
259ade8
Add procfile
anyoung-tableau Jun 18, 2025
a175f29
Change start scripts
anyoung-tableau Jun 18, 2025
0f30937
Rename HTTP_PORT to PORT
anyoung-tableau Jun 18, 2025
1a2d3d6
Fix script name
anyoung-tableau Jun 18, 2025
991b53d
Merge remote-tracking branch 'origin/main' into anyoung/stateless
anyoung-tableau Jun 20, 2025
c58bb59
Merge remote-tracking branch 'origin/main' into anyoung/transport
anyoung-tableau Jun 20, 2025
5e03cc1
Merge remote-tracking branch 'origin/main' into anyoung/heroku
anyoung-tableau Jun 20, 2025
8350669
Move server to its own folder
anyoung-tableau Jul 7, 2025
dbefeeb
[in progress] Add OAuth
anyoung-tableau Jul 8, 2025
14e0fcc
Use a signed JWT instead of Tableau access token directly
anyoung-tableau Jul 9, 2025
383bfa9
Use Date.now() instead
anyoung-tableau Jul 9, 2025
6d0ab3e
Use Tableau user id as JWT sub claim
anyoung-tableau Jul 10, 2025
963050c
Merge remote-tracking branch 'origin/main' into anyoung/stateless
anyoung-tableau Jul 10, 2025
ba98f63
Merge remote-tracking branch 'origin/main' into anyoung/stateless
anyoung-tableau Jul 10, 2025
6a0f94f
Bump version
anyoung-tableau Jul 10, 2025
a9294aa
Fix lint errors
anyoung-tableau Jul 10, 2025
f256e52
Merge remote-tracking branch 'origin/anyoung/stateless' into anyoung/…
anyoung-tableau Jul 10, 2025
666bbb8
Fix lint error
anyoung-tableau Jul 10, 2025
452e259
Address CVE CVE-2025-49596
anyoung-tableau Jul 11, 2025
0b8db08
Move authZ code exchange to OAuth callback
anyoung-tableau Jul 11, 2025
bebbce1
Remove multiple links to spec
anyoung-tableau Jul 11, 2025
577bb90
Organize file
anyoung-tableau Jul 11, 2025
b3a5684
Merge remote-tracking branch 'origin/anyoung/transport' into anyoung/…
anyoung-tableau Jul 11, 2025
f2367e2
Merge remote-tracking branch 'origin/anyoung/heroku' into anyoung/oauth
anyoung-tableau Jul 11, 2025
63b0477
Delete orig files
anyoung-tableau Jul 11, 2025
1f0991e
Fix site id parsing
anyoung-tableau Jul 11, 2025
efe2a2d
Only sign out for PAT auth
anyoung-tableau Jul 11, 2025
eda7ada
Merge remote-tracking branch 'origin/main' into anyoung/oauth
anyoung-tableau Jul 21, 2025
964cb01
Clean up after merge
anyoung-tableau Jul 21, 2025
9aef8e8
Address vulnerabilities
anyoung-tableau Jul 21, 2025
ea5a0b0
Add provider
anyoung-tableau Jul 22, 2025
076f630
Move types
anyoung-tableau Jul 22, 2025
0000f2a
Add schema for /oauth/authorize
anyoung-tableau Jul 22, 2025
bff7f3c
Add additional schemas
anyoung-tableau Jul 22, 2025
c0b28d7
Make state optional for /authorize
anyoung-tableau Jul 22, 2025
bef6190
Add build:inspect:http script
anyoung-tableau Jul 22, 2025
2bd83a3
Fix error
anyoung-tableau Jul 22, 2025
dd49be4
Fix bad merge
anyoung-tableau Jul 22, 2025
f07b223
Add device id guid
anyoung-tableau Jul 22, 2025
f1ae240
Parameterize timeouts
anyoung-tableau Jul 22, 2025
8c6183f
Add schema for MCP token
anyoung-tableau Jul 22, 2025
c3d7780
Remove commented code
anyoung-tableau Jul 22, 2025
071aeca
Allow for alternative auth when OAuth is enabled
anyoung-tableau Jul 22, 2025
24465ef
Add getTableauAuthInfo
anyoung-tableau Jul 22, 2025
849ddd2
Move token API to SDKs folder
anyoung-tableau Jul 23, 2025
b3489ee
Remove stray changes to readme
anyoung-tableau Jul 23, 2025
2fa40ee
Add config tests
anyoung-tableau Jul 23, 2025
1a9e9e1
s/oauth2/oauth
anyoung-tableau Jul 23, 2025
5130334
Mention that OAUTH_ISSUER is required when AUTH is oauth
anyoung-tableau Jul 23, 2025
b51f35c
Validate auth info
anyoung-tableau Jul 23, 2025
bb9827f
Cherry-pick changes from mcp-token-refresh
anyoung-tableau Jul 24, 2025
41a91d7
Cherry-pick fixes from tableau-token-refresh
anyoung-tableau Jul 24, 2025
7f3c4b1
Add target_site
anyoung-tableau Jul 24, 2025
8a59920
Fix redirectUri default
anyoung-tableau Jul 24, 2025
e2ec30b
Fix config test
anyoung-tableau Jul 24, 2025
029e784
Add quotes eslint rule
anyoung-tableau Jul 24, 2025
e243357
Merge remote-tracking branch 'origin/main' into anyoung/oauth
anyoung-tableau Jul 24, 2025
f17406c
Clean up dynamic registration a bit
anyoung-tableau Jul 24, 2025
06f9c5b
Remove interceptor
anyoung-tableau Jul 24, 2025
e6177b6
Validate transport when OAuth is enabled
anyoung-tableau Jul 24, 2025
6272f64
Update auth section in readme
anyoung-tableau Jul 24, 2025
8e558b7
Make SITE_NAME required for non-OAuth auth
anyoung-tableau Jul 25, 2025
48ac213
Relay 401s from getCurrentServerSession
anyoung-tableau Jul 25, 2025
bd4ecae
Implement MCP access token refresh (#72)
anyoung-tableau Jul 28, 2025
fa3aad5
Generate client id and device id at runtime
anyoung-tableau Jul 28, 2025
e1d2401
Replace uuid with randomUUID
anyoung-tableau Jul 28, 2025
750664a
Remove accessToken from AuthConfig
anyoung-tableau Jul 29, 2025
41a5d9e
Add TSM setting
anyoung-tableau Aug 7, 2025
1ac1e22
Clarify a few env vars
anyoung-tableau Aug 7, 2025
ea359a8
Merge remote-tracking branch 'origin/main' into anyoung/oauth
anyoung-tableau Aug 8, 2025
66af838
Add Connected App JWT support (OAuth) (#76)
anyoung-tableau Aug 8, 2025
b599938
Merge remote-tracking branch 'origin/main' into anyoung/oauth
anyoung-tableau Aug 28, 2025
1ed24e1
Use encrypted JWE instead of non-encrypted JWT for MCP access token (…
anyoung-tableau Aug 29, 2025
b928bc0
Merge remote-tracking branch 'origin/main' into anyoung/oauth
anyoung-tableau Sep 2, 2025
b24b0cf
Merge remote-tracking branch 'origin/main' into anyoung/oauth
anyoung-tableau Sep 4, 2025
040da8e
Add docs for OAuth
anyoung-tableau Sep 4, 2025
3746b3a
Make OAuth the defualt behavior for http transport
anyoung-tableau Sep 4, 2025
6774155
Upload docs to artifacts
anyoung-tableau Sep 4, 2025
b42c929
Fix http transport test
anyoung-tableau Sep 4, 2025
6133f34
Link to DISABLE_OAUTH section
anyoung-tableau Sep 5, 2025
f9a4ad2
Default auth to oauth when OAuth is enabled
anyoung-tableau Sep 5, 2025
d0a0510
Add env file generator
anyoung-tableau Sep 5, 2025
4b22e0a
Fix state issue
anyoung-tableau Sep 5, 2025
6f80d9e
Open links in new tab
anyoung-tableau Sep 5, 2025
bc1a241
Add commas to vs code config
anyoung-tableau Sep 5, 2025
94ea897
Make SERVER and SITE_NAME optional when AUTH is oauth (#101)
anyoung-tableau Sep 9, 2025
e34656b
Add OAuth sequence diagram
anyoung-tableau Sep 9, 2025
f1c65d1
Gen private key
anyoung-tableau Sep 9, 2025
2764614
Add Claude redirect URIs
anyoung-tableau Sep 9, 2025
c618981
Revert that, unnecessary
anyoung-tableau Sep 9, 2025
8c5465c
Delete refresh token after timeout
anyoung-tableau Sep 10, 2025
c78b278
Add OAUTH_JWE_PRIVATE_KEY
anyoung-tableau Sep 11, 2025
975db31
Don't get private key
anyoung-tableau Sep 11, 2025
f80a6a4
Merge remote-tracking branch 'origin/main' into anyoung/oauth
anyoung-tableau Sep 22, 2025
0b58e47
Fix lint errors
anyoung-tableau Sep 22, 2025
f391d8c
Fix doc links
anyoung-tableau Sep 22, 2025
dbad79e
Refactor into individual files
anyoung-tableau Sep 23, 2025
bcee110
Merge remote-tracking branch 'origin/main' into anyoung/oauth
anyoung-tableau Oct 2, 2025
6c5c515
Merge remote-tracking branch 'origin/main' into anyoung/oauth
anyoung-tableau Oct 16, 2025
5d2fa24
Prompt when OAuth is disabled
anyoung-tableau Oct 16, 2025
c4aa66c
Update docs
anyoung-tableau Oct 16, 2025
d976547
Log username for tool calls
anyoung-tableau Oct 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
web: node build/index.js
32 changes: 24 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ contributions to help shape the future of this project.
Follow these steps to install Tableau MCP for the first time:

1. Clone the repository
2. Install [Node.js](https://nodejs.org/en/download) (tested with 22.15.0 LTS)
2. Install [Node.js >= 22.7.5](https://nodejs.org/en/download) (tested with 22.15.0 LTS)
3. `npm install`
4. `npm run build`

Expand Down Expand Up @@ -159,20 +159,21 @@ These config files will be used in tool configuration explained below.

#### Required Environment Variables

| **Variable** | **Description** |
| ------------ | ----------------------------------------------------------------------------------------------------------------- |
| `SERVER` | The URL of the Tableau server. |
| `SITE_NAME` | The name of the Tableau site to use. For Tableau Server, set this to an empty string to specify the default site. |
| `PAT_NAME` | The name of the Tableau [Personal Access Token][pat] to use for authentication. |
| `PAT_VALUE` | The value of the Tableau [Personal Access Token][pat] to use for authentication. |
| **Variable** | **Description** |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------- |
| `SERVER` | The URL of the Tableau server. For Tableau Cloud, specify your site's specific pod e.g. `https://prod-useast-c.online.tableau.com` |
| `SITE_NAME` | The name of the Tableau site to use. For Tableau Server, set this to an empty string to specify the default site. |

#### Optional Environment Variables

| **Variable** | **Description** | **Default** | **Note** |
| ------------------------ | --------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TRANSPORT` | The MCP transport type to use for the server. | `stdio` | Possible values are `stdio` or `http`. For `http`, see [HTTP Server Configuration](#http-server-configuration) below for additional variables. See [Transports][mcp-transport] for details. |
| `AUTH` | The authentication method to use by the server. | `pat` | Possible values are `pat` or `oauth`. When `oauth`, `OAUTH_ISSUER` must also be provided. See [OAuth Configuration](#oauth-configuration) below for additional variables. |
| `PAT_NAME` | The name of the Tableau [Personal Access Token][pat] to use for authentication. | | Required if `AUTH` is `pat`. |
| `PAT_VALUE` | The value of the Tableau [Personal Access Token][pat] to use for authentication. | | Required if `AUTH` is `pat`. |
| `DEFAULT_LOG_LEVEL` | The default logging level of the server. | `debug` | |
| `DATASOURCE_CREDENTIALS` | A JSON string that includes usernames and passwords for any datasources that require them. | Empty string | Format is provided in the [DATASOURCE_CREDENTIALS](#datasource_credentials) section below. |
| `DATASOURCE_CREDENTIALS` | A JSON string that includes usernames and passwords for any datasources that require them. | | Format is provided in the [DATASOURCE_CREDENTIALS](#datasource_credentials) section below. |
| `DISABLE_LOG_MASKING` | Disable masking of credentials in logs. For debug purposes only. | `false` | |
| `INCLUDE_TOOLS` | A comma-separated list of tool names to include in the server. Only these tools will be available. | Empty string (_all_ are included) | For a list of available tools, see [toolName.ts](src/tools/toolName.ts). |
| `EXCLUDE_TOOLS` | A comma-separated list of tool names to exclude from the server. All other tools will be available. | Empty string (_none_ are excluded) | Cannot be provided with `INCLUDE_TOOLS`. |
Expand All @@ -192,6 +193,20 @@ used to configure the HTTP server.
| `SSL_CERT` | The path to the SSL certificate file to use for the HTTP server. | | |
| `CORS_ORIGIN_CONFIG` | The origin or origins to allow CORS requests from. | `true` | Acceptable values include `true`, `false`, `*`, or a URL or array of URLs. See [cors config options][cors] for details. |

#### OAuth Configuration

When a URL for `OAUTH_ISSUER` is provided, the following environment variables apply or have
additional meaning:

| **Variable** | **Description** | **Default** | **Notes** |
| ------------------------------------- | --------------------------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OAUTH_ISSUER` | The issuer of the OAuth server. | | Required if `AUTH` is `oauth`. For testing, use `http://127.0.0.1:3927` |
| `SITE_NAME` | The target Tableau site for OAuth. | | If not provided, users will see the site picker if they have access to multiple sites. Choosing a site from a pod different from the one specified in `SERVER` will not work. |
| `OAUTH_REDIRECT_URI` | The redirect URI for the OAuth flow. | `{OAUTH_ISSUER}/Callback` | |
| `OAUTH_JWT_SECRET` | The symmetric secret to sign the access token with. | | Required. See [jose SignJWT docs][sign-jwt] for details. |
| `OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS` | The timeout for the OAuth authorization codes. | _10 seconds_ | Max: 1 hour. |
| `OAUTH_REFRESH_TOKEN_TIMEOUT_MS` | The timeout for the OAuth refresh tokens. | _30 days_ | Max: 1 year. |

##### DATASOURCE_CREDENTIALS

The `DATASOURCE_CREDENTIALS` environment variable is a JSON string that includes usernames and
Expand Down Expand Up @@ -318,3 +333,4 @@ To set up local debugging with breakpoints:
[mcp-transport]: https://modelcontextprotocol.io/docs/concepts/transports
[express]: https://expressjs.com/
[cors]: https://expressjs.com/en/resources/middleware/cors.html#configuration-options
[sign-jwt]: https://github.com/panva/jose/blob/main/docs/jwt/sign/classes/SignJWT.md#examples
3 changes: 2 additions & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ export default [
'simple-import-sort': simpleImportSort,
},
rules: {
'no-console': 'error',
'no-console': ['error', { allow: ['warn', 'error'] }],
'no-duplicate-imports': ['error', { includeExports: true }],
quotes: ['error', 'single', { avoidEscape: true }],
'simple-import-sort/imports': 'error',
'simple-import-sort/exports': 'error',
'@typescript-eslint/explicit-function-return-type': ['error', { allowExpressions: true }],
Expand Down
Loading