Skip to main content

Update Cloud Extract Refresh Task

Updates the schedule of an extract refresh task on Tableau Cloud. Use this to change how often a refresh runs (e.g. downgrade Daily → Weekly), shift its time window, or modify the day/hour it executes — without recreating the task.

:::warning Admin Only This tool is restricted to Tableau site administrators and requires the ADMIN_TOOLS_ENABLED environment variable to be enabled. :::

:::info Tableau Cloud Only This tool calls the Cloud variant of the update endpoint and is not appropriate for Tableau Server. The Server variant has a different payload shape and is tracked separately. :::

Confirm and audit

This mutation is two-phase, gated on a server-generated single-use confirmation token:

  1. Preview (default — confirm omitted or false): reports the new schedule that would be applied without changing anything, and returns a single-use confirmationToken.
  2. Update (confirm: true + confirmationToken): applies the schedule update. The server verifies and consumes the token first.

The token is server-generated and bound to the previewed taskId and schedule: a token minted while previewing schedule A cannot confirm an update to schedule B, and a confirm: true with no prior preview (no valid token) is rejected server-side. This gate genuinely requires the preview phase to have run for exactly this change; it cannot be bypassed by computing a value. Present the change to the user and get explicit approval before confirming.

MCP-Apps confirm panel (cooperative human-in-the-loop)

When the mcp-apps feature flag is enabled, this tool ships with an MCP App and the preview phase renders an in-iframe confirm panel describing the schedule change (new frequency and time window, plus a live countdown) instead of returning preview text the model could act on. The schedule change is then applied only when a person clicks Apply schedule change in that panel, which invokes the model-invisible confirm-update-cloud-extract-refresh-task tool (visibility: ['app']), passing the task id and the full structured schedule. With the flag on, the model-driven confirm: true path is closed — the assistant cannot apply the change on the user's behalf; the only route is the human gesture. The confirm tool verifies a fresh, single-use human approval recorded during the preview (within MUTATION_PREVIEW_TTL_MINUTES, default 5); a missing or expired approval rejects the update. When the flag is off the tool behaves exactly as the two-phase confirm/confirmationToken flow described above.

Cooperative, not server-enforced

This is cooperative human-in-the-loop: it depends on the MCP client honoring visibility: ['app'] (hiding the confirm-* tool from the model) and rendering the confirm panel. The human approval is recorded during the model-driven preview phase, so a non-cooperating client that ignores the visibility hint could still drive preview → confirm-* back-to-back with no human gesture. This task tool has no tag layer — the app approval is the only gate — so a non-cooperating client has nothing else to clear (the schedule-bound registry nonce still proves a preview ran, but not that a human approved). Server-enforced HITL (an approval primitive the model cannot forge or reach) is tracked as follow-up work (W-23125362).

Authoritative audit

Every attempt — both the preview and the confirmed update, and both allowed and denied attempts (for example a non-admin caller) — emits a structured authoritative audit record to the server's durable log sink (logger audit, level notice), not just to the tool-response text. Each record captures the actor identity, the tool, action (update), phase, the target id, the confirmation evidence kind (registry-nonce for this tool), and the result. A confirmed update emits an allowed record when authorized, then a terminal completed (or failed, with failureDetail) record reflecting the REST outcome — so the trail records what actually happened, not just intent. This routing is centralized in the shared mutation guard so every TMCP mutation tool audits identically.

APIs called

Use cases

Use this tool when you need to:

  • Reduce the frequency of an under-used extract refresh (e.g. Hourly → Daily, Daily → Weekly)
  • Move a refresh window to off-peak hours
  • Change the recurrence intervals (e.g. weekday → weekend)

Required permissions

  • Tableau Cloud: Requires tableau:tasks:write OAuth scope
  • Site Role: Must be one of:
    • SiteAdministratorCreator
    • SiteAdministratorExplorer
    • ServerAdministrator

Configuration

Enable this tool by setting:

ADMIN_TOOLS_ENABLED=true

See also: Environment Variables

Arguments

ParameterTypeRequiredDescription
taskIdstring (UUID)YesThe ID of the extract refresh task to update. Obtain from list-extract-refresh-tasks.
confirmbooleanNoSet true to apply the update (requires confirmationToken). When omitted or false, previews the change without applying it.
confirmationTokenstringNoThe single-use token returned by a prior preview of this same taskId and schedule. Required when confirm is true; ignored otherwise. A token minted for a different schedule will not validate.
scheduleobjectYesThe new schedule to apply. Replaces the existing schedule wholesale.

schedule shape

FieldTypeRequiredDescription
frequencyenumYesOne of Hourly, Daily, Weekly, Monthly.
frequencyDetails.startstringYesStart time in 24-hour HH:mm:ss format, e.g. "06:00:00".
frequencyDetails.endstringHourly onlyEnd time in 24-hour HH:mm:ss format. Required for Hourly (minute portion must match start, must be strictly after start). Omit for Daily/Weekly/Monthly — Tableau ignores it.
frequencyDetails.intervals.intervalarrayNoRecurrence intervals. Each entry can specify weekDay (Sunday..Saturday), monthDay, hours, or minutes depending on the frequency.

Schedule constraints

The schema enforces these rules — invalid input is rejected before any Tableau API call:

  • Time formatstart and end must be zero-padded HH:mm:ss (e.g. "06:00:00", not "6:00:00").
  • Minute boundary – The minute portion of start (and end, when present) must be on a 5-minute boundary: 00, 05, 10, 15, 20, 25, 30, 35, 40, 45, 50, or 55, with seconds = 00. 07:26:00 is rejected; 07:25:00 and 07:30:00 are accepted.
  • Hourlystart and end must share the same minute portion (e.g. 06:00:00/18:00:00 ✓, 06:00:00/18:30:00 ✗); end must be strictly after start (numeric comparison, not lexical).
  • Daily / Weekly / Monthlyend is ignored — omit it.
  • Hourly and Daily require at least one interval with weekDay (Tableau rejects them otherwise with 409004).
  • Weekly requires at least one interval with weekDay; Monthly requires at least one interval with monthDay.

Tableau may still reject a schema-valid request with 409004 Conflict (Invalid subscription schedule) for site-specific rules. In that case the tool surfaces Tableau's structured error verbatim — e.g. Tableau 409 [409004]: Conflict: Invalid subscription schedule. (...) — so callers can recover without parsing axios errors. A 404 is mapped to a "Tableau Cloud only" hint pointing at list-extract-refresh-tasks since the most common cause is calling against a Tableau Server site or with a stale taskId.

Example: Daily → Weekly Sunday at 06:00

{
"taskId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"schedule": {
"frequency": "Weekly",
"frequencyDetails": {
"start": "06:00:00",
"intervals": { "interval": [{ "weekDay": "Sunday" }] }
}
}
}

Example: Hourly between 08:00 and 18:00 every 2 hours, Mondays

{
"taskId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"schedule": {
"frequency": "Hourly",
"frequencyDetails": {
"start": "08:00:00",
"end": "18:00:00",
"intervals": { "interval": [{ "hours": 2 }, { "weekDay": "Monday" }] }
}
}
}

Response

A confirmation message describing the updated task and its new schedule:

Extract refresh task 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' has been successfully updated. New schedule: Weekly (start 06:00:00).

Error cases

ScenarioBehavior
Task ID does not existReturns a 404 error
User is not a site administratorReturns an error indicating admin permissions are required
ADMIN_TOOLS_ENABLED not setTool is not registered and unavailable to the client
Invalid frequency valueSchema-level rejection before any API call
Missing frequencyDetails.startSchema-level rejection before any API call
Tableau Server (not Cloud)This tool is Cloud-only; calling it against a Server site is not supported