Resolve 6 metadata_get_* GraphQL drifts in tableau-mcp by replacing untyped LUID filter args with traversal-from-asset queries; centralize result-list unwrapping in _unwrap_metadata_list() matching

Decision

Resolve 6 metadata_get_* GraphQL drifts in tableau-mcp by replacing untyped LUID filter args with traversal-from-asset queries; centralize result-list unwrapping in _unwrap_metadata_list() matching the upstream metadata_client.execute_query data-payload contract; ship as v6.0.5 with full 8-surface version cascade and add nightly live drift detector.

Rationale

Live introspection of Tableau Metadata API 2026.1 confirmed 6 distinct drift cases: (a) CalculatedField_Filter has no parentWorkbookLuid/datasourceLuid — must traverse from workbooks/publishedDatasources; (b) Parameter has no domainType/description, parent field is workbook not parentWorkbook; (c) root tables returns abstract Table lacking schema — must use databaseTables; (d) site-wide columns { ... } busts the 20k node limit — required table_id; (e) DataQualityWarning_Filter has no asset args — traverse from data assets; (f) Workbook does NOT carry DQWs at all (caller must traverse upstream — tool now ValueErrors with clear message). Codex cross-model review caught a critical bug in my first pass: I treated run_custom_graphql_query as returning the full GraphQL envelope, but metadata_client.execute_query already raises on errors and returns just data — pre-final code returned [] for every successful query. Fixed centrally with defensive helper. Verified via in-container end-to-end smoke against live Tableau Cloud: 4108 calc_fields global, 21 calcs on Superstore, 6 parameters incl. ‘Sort by’, 2204 tables with schema populated, 19 columns with remoteType, 55 databases. Live drift detector (now in container image, run via docker exec) reports 0 drift across 17 queries. Regression tests pin corrected query shapes statically. Version cascaded across 8 surfaces (compose×3, server.py, init.py, pyproject.toml, Dockerfile, /health). Reversibility: high — bug fix plus additive tests/script, no signature changes; rollback is IMAGE_TAG=6.0.4 docker compose up -d.

Alternatives Rejected

Outcome

Pending