Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion docs/docs/configuration/mcp-config/env-vars.md
Original file line number Diff line number Diff line change
Expand Up @@ -698,7 +698,7 @@ instead of inlining it:
- `get-view-image` / `get-custom-view-image` — rendered image (otherwise inline base64)
- `get-view-data` / `get-custom-view-data` — CSV data (otherwise inline text)
- `download-workbook` — workbook file (otherwise a local temp-file path)
- `request-workbook-upload` / `validate-upload-and-publish-workbook`— stage workbook in S3 before publishing (otherwise a local file path)
- `request-upload` / `finalize-upload` — presign, upload, and verify an object in S3; `publish-workbook` then publishes it (otherwise a local file path)

The client fetches the files directly from S3, so the payload never streams back through the MCP
server on read.
Expand Down
13 changes: 9 additions & 4 deletions src/server/oauth/scopes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,11 +184,15 @@ const toolScopeMap: Record<
mcp: ['tableau:mcp:workbook:read'],
api: new Set(['tableau:content:read', 'tableau:mcp_site_settings:read']),
},
'request-workbook-upload': {
'request-upload': {
mcp: ['tableau:mcp:workbook:create'],
api: new Set([]),
},
'validate-upload-and-publish-workbook': {
'finalize-upload': {
mcp: ['tableau:mcp:workbook:create'],
api: new Set([]),
},
'publish-workbook': {
mcp: ['tableau:mcp:workbook:create'],
api: new Set(['tableau:workbooks:create']),
},
Expand Down Expand Up @@ -425,8 +429,9 @@ async function getEnabledToolNames(): Promise<Set<WebToolName>> {
}

if (!authoringToolsEnabled) {
enabledTools.delete('request-workbook-upload');
enabledTools.delete('validate-upload-and-publish-workbook');
enabledTools.delete('request-upload');
enabledTools.delete('finalize-upload');
enabledTools.delete('publish-workbook');
}

return enabledTools;
Expand Down
7 changes: 4 additions & 3 deletions src/tools/web/toolName.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ export const webToolNames = [
'list-jobs',
'list-users',
'list-workbooks',
'request-workbook-upload',
'validate-upload-and-publish-workbook',
'request-upload',
'finalize-upload',
'publish-workbook',
'list-projects',
'list-views',
'list-custom-views',
Expand Down Expand Up @@ -68,7 +69,7 @@ export type WebToolGroupName = (typeof webToolGroupNames)[number];
export const webToolGroups = {
datasource: ['list-datasources', 'get-datasource-metadata', 'query-datasource'],
workbook: ['list-workbooks', 'get-workbook', 'download-workbook'],
authoring: ['request-workbook-upload', 'validate-upload-and-publish-workbook'],
authoring: ['request-upload', 'finalize-upload', 'publish-workbook'],
project: ['list-projects'],
view: [
'list-views',
Expand Down
10 changes: 6 additions & 4 deletions src/tools/web/tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ import { getRecordEventTool } from './recordEvent/recordEvent.js';
import { getRenderInteractiveVizTool } from './renderInteractiveViz/renderInteractiveViz.js';
import { getResetConsentTool } from './resetConsent/resetConsent.js';
import { getRevokeAccessTokenTool } from './revokeAccessToken/revokeAccessToken.js';
import { getFinalizeUploadTool } from './uploads/finalizeUpload.js';
import { getRequestUploadTool } from './uploads/requestUpload.js';
import { getListUsersTool } from './users/listUsers.js';
import { getUpdateUserTool } from './users/updateUser.js';
import { getGetCustomViewDataTool } from './views/getCustomViewData.js';
Expand All @@ -39,8 +41,7 @@ import { getListViewsTool } from './views/listViews.js';
import { getDownloadWorkbookTool } from './workbooks/downloadWorkbook.js';
import { getGetWorkbookTool } from './workbooks/getWorkbook.js';
import { getListWorkbooksTool } from './workbooks/listWorkbooks.js';
import { getRequestWorkbookUploadTool } from './workbooks/requestWorkbookUpload.js';
import { getValidateUploadAndPublishWorkbookTool } from './workbooks/validateUploadAndPublishWorkbook.js';
import { getPublishWorkbookTool } from './workbooks/publishWorkbook.js';

export const webToolFactories = [
getGetDatasourceMetadataTool,
Expand Down Expand Up @@ -69,8 +70,9 @@ export const webToolFactories = [
getGenerateInsightCardsTool,
getDownloadWorkbookTool,
getGetWorkbookTool,
getRequestWorkbookUploadTool,
getValidateUploadAndPublishWorkbookTool,
getRequestUploadTool,
getFinalizeUploadTool,
getPublishWorkbookTool,
getGetViewTool,
getGetViewDataTool,
getGetViewImageTool,
Expand Down
Loading