Releases: txn2/mcp-data-platform
mcp-data-platform-v1.56.1
Tool List Change Notifications
MCP clients now receive notifications/tools/list_changed when the server's tool list changes. Previously, clients that reconnected after a server upgrade kept their stale cached tool list and would not see newly registered tools until a manual disconnect/reconnect.
This enables seamless upgrades — deploying a new version with additional tools (e.g., trino_export from v1.56.0) is immediately visible to connected clients without requiring them to restart their session.
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.56.1Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.56.1_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.56.1_linux_amd64.tar.gzmcp-data-platform-v1.56.0
Highlights
New: trino_export — Query-to-Asset Export (#331)
A new MCP tool that executes a validated SQL query and writes the full result set directly to S3 as an immutable portal asset, bypassing the LLM token budget. The agent shapes queries interactively with trino_query, then hands off bulk execution to trino_export when the shape is finalized.
Parameters: sql, format (csv/json/markdown/text), name, plus optional connection, description, tags, limit, idempotency_key, timeout_seconds, create_public_link.
Returns: Asset metadata only (ID, portal URL, share URL, row count, size) — data goes to S3, not through the LLM.
Key capabilities:
- Four output formats — CSV (with formula injection escaping), JSON, Markdown, plain text
- Hard size caps — configurable
max_rows(default 100K) andmax_bytes(default 100 MB) per deployment - Query timeout — configurable
default_timeout/max_timeout, separate from size caps - Idempotency —
idempotency_keyprevents duplicate assets on retry, backed by a partial unique index with race condition handling - Sensitivity inheritance — if a query touches a PII-classified table (via DataHub tags), the resulting asset automatically inherits
_sys-classification:piitags - Public share links —
create_public_link: truegenerates a shareable URL for automation pipelines, with default notice text - Read-only enforcement — always enforced regardless of deployment
read_onlyconfig (exports are SELECT-only by definition) - Provenance — captures session tool call history, source tables, query SQL, and format in the asset's provenance metadata
- No partial state — no asset record is created unless the S3 write fully succeeds
- Persona/RBAC gate — requires explicit authorization via tools allow/deny patterns
Configuration:
portal:
export:
enabled: true # auto-enabled when portal + trino configured
max_rows: 100000
max_bytes: 104857600 # 100 MB
default_timeout: "5m"
max_timeout: "10m"New migration: 000033_export_idempotency adds idempotency_key column with partial unique index to portal_assets.
Large Asset Preview Guard
Assets exceeding 2 MB are no longer loaded inline in the portal viewer. A "too large to preview" message with a download button is shown instead. This prevents the browser from choking on multi-megabyte CSV or JSON exports.
Affected surfaces:
- Authenticated portal (asset viewer, preview modal, admin viewer)
- Public viewer (backend skips S3 fetch, renders download prompt)
- New download endpoint:
GET /portal/view/{token}/contentfor public share content downloads
Provenance Middleware: Multiple Harvest Tools
MCPProvenanceMiddleware now accepts variadic tool names for provenance harvesting. Both save_artifact and trino_export trigger session tool call capture.
Other Changes
- docs: comprehensive portal documentation with screenshots (#329)
- docs: complete OpenAPI spec with examples for all endpoints (#330)
- deps: bump go.opentelemetry.io/otel/sdk from 1.41.0 to 1.43.0 (#328)
- deps: bump dompurify from 3.3.2 to 3.4.0 (#327)
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.56.0Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.56.0_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.56.0_linux_amd64.tar.gzmcp-data-platform-v1.55.11
What's Changed
Markdown rendering for knowledge and memory content (#326)
Knowledge insights and memory records in the portal now render through the existing MarkdownRenderer component instead of displaying as plain text blocks. This enables formatted content — bullet lists, code blocks for SQL, backtick-wrapped column/table names — in both the user and admin knowledge pages.
Frontend:
- Insight and memory detail panels (admin drawers, user cards) use
MarkdownRendererwithbaremode - Table cell previews remain plain text (truncated content would break rendered markdown)
- Sanitize mermaid SVG output with DOMPurify to prevent XSS
- Strip first/last child prose margins to prevent spacing bleed in card layouts
- Guard against null/undefined content
Backend:
capture_insightandmemory_managetool field descriptions now note markdown support- Knowledge capture prompt encourages markdown formatting when it aids clarity
Existing plain-text content renders identically — no migration or schema changes needed.
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.55.11Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.55.11_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.55.11_linux_amd64.tar.gzmcp-data-platform-v1.55.10
What's Changed
This release fixes 6 server bugs and 4 tool description gaps identified during deep testing of a production deployment (v1.55.9, admin persona, dual Trino connections).
Bug Fixes
B5: Artifact version numbering starts at 1 (was 2)
The first version created by save_artifact was incorrectly numbered 2 due to an off-by-one in the asset store. New assets now correctly start at version 1.
B1: manage_prompt create no longer leaks database errors
- Omitting the
personasfield no longer triggers a raw PostgreSQLNOT NULLconstraint error. The field now defaults to an empty list. - All
manage_prompterror responses now return clean messages without driver-specific details (pq:prefix, SQLSTATE codes).
B2: query_context no longer resolves non-dataset URNs
Responses from datahub_search, datahub_get_lineage, and other DataHub tools no longer contain spurious "invalid dataset URN" errors for domain, tag, query, and owner URNs. Only dataset URNs are resolved for table availability.
B3: available_connections no longer returns duplicates
The query_context.available_connections array in enriched responses now correctly deduplicates connection names.
D1: Default Trino connection is used when connection param is omitted
When a default connection is configured, trino_query and other Trino tools no longer require the connection parameter. The default is used automatically. The error message with available connections still appears when no default is configured.
D2: Approved insights can now be rejected
The insight state machine now allows approved → rejected, providing a revoke path for erroneous approvals. Full lifecycle: pending → approved/rejected/superseded; approved → applied/rejected; applied → rolled_back.
Tool Description Improvements
manage_prompt: Now states it manages database-stored prompts only; static prompts from server configuration are not listed or editable.manage_artifact: Notes thatlistreturns full metadata including provenance per asset.apply_knowledge: Documents the insight lifecycle state machine and valid transitions.manage_promptpersonas field: Clarifies the field defaults to an empty list if omitted.
Not Included (External Dependencies)
The following issues identified during testing are tracked separately as they reside in upstream libraries or require product decisions:
- Opaque OpenSearch aggregation errors (mcp-trino)
- Tag creation not idempotent on name (mcp-datahub)
- Empty
matched_fields.valuefor filter-based search hits (DataHub GraphQL) - S3 key layout migration across artifact versions (product decision)
- Provenance included by default in artifact list (product decision)
- Static + database prompt store unification (product decision)
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.55.10Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.55.10_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.55.10_linux_amd64.tar.gzmcp-data-platform-v1.55.9
Fix: resources/read URI extraction
extractResourceURI used json.Marshal on the MCP request to parse the URI, which failed because ServerRequest contains function fields that cannot be serialized. This caused every resources/read to fall through the middleware to the SDK's fallback handler. Replaced with a direct type assertion to *mcp.ReadResourceParams via GetParams().
Diagnosed via production logs added in v1.55.8.
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.55.9Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.55.9_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.55.9_linux_amd64.tar.gzmcp-data-platform-v1.55.8
Diagnostic logging for managed resources pipeline
Adds DEBUG-level logging at every decision point in the managed resources middleware to diagnose why resources uploaded via the REST API are not visible through the MCP resources primitive in production.
Also fixes the SDK fallback resource handler to return valid content instead of nil Contents, which caused read handler returned nil information errors.
Upgrade notes
- No config changes required. Logging is at DEBUG level and does not affect production behavior.
- Set log level to DEBUG to see the diagnostic output.
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.55.8Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.55.8_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.55.8_linux_amd64.tar.gzmcp-data-platform-v1.55.7
Managed resources visible to MCP clients
Managed resources are now registered with the MCP server's native resource map via AddResource(), making them discoverable by all MCP clients. The server declares listChanged: true in its resource capabilities and sends notifications/resources/list_changed when resources are created, updated, or deleted via the REST API.
Behavior
- Startup: Existing global resources are loaded from the database and registered with the MCP server.
- Create/Update: New or updated resources are registered, triggering a list change notification to connected clients.
- Delete: Resources are removed from the server, triggering the notification.
- Scope filtering: The middleware filters the resource list by the caller's visible scopes.
Other changes
- Dependency updates:
golang.org/x/crypto,testcontainers-go/modules/postgres - CI: bumped
actions/setup-node,actions/upload-artifact,actions/upload-pages-artifact
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.55.7Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.55.7_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.55.7_linux_amd64.tar.gzmcp-data-platform-v1.55.6
Fix: S3 instance name resolution for managed resources
The default S3 connection fallback in v1.55.5 resolved the correct instance config internally but returned an empty ConnectionName, causing the S3 client to never be created. The root cause was getS3Config("") — it found the default instance but its ConnectionName fallback used the empty string that was passed in.
What changed
Added resolveDefaultS3Instance() which resolves the instance name directly from the S3 toolkits config map, returning the actual key (e.g., "acme"). managedResourceS3Connection() now uses this resolved name, so getS3Config receives a non-empty instance name and sets ConnectionName correctly.
Upgrade notes
- No config changes required. This fixes the default S3 connection fallback introduced in v1.55.5.
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.55.6Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.55.6_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.55.6_linux_amd64.tar.gzmcp-data-platform-v1.55.5
Managed resources automatically use the default S3 connection
When resources.managed.s3_connection was not explicitly configured, managed resources disabled blob storage entirely — resources/read could not serve file content even though an S3 toolkit was available for other features (portal, DataHub). Since managed resources are enabled by default when a database is available, they should also use an available S3 connection by default.
What changed
Added managedResourceS3Connection() which returns the explicit s3_connection if set, otherwise falls back to the default/first S3 toolkit instance. This follows the same convention-over-configuration pattern as managedResourceURIScheme() and the instance resolution used by semantic, query, and storage providers.
The info log now shows the resolved S3 connection name instead of the raw config value, so operators can see which S3 backend is actually in use.
Upgrade notes
- No config changes required. Deployments with an S3 toolkit configured for any purpose (portal, DataHub, etc.) will now automatically use it for managed resources.
- Deployments without any S3 toolkit continue to work — blob storage is disabled gracefully and resources store metadata only.
- To use a specific S3 connection for managed resources (different from the default), set
resources.managed.s3_connectionexplicitly.
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.55.5Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.55.5_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.55.5_linux_amd64.tar.gzmcp-data-platform-v1.55.4
MCP clients now see managed resources after REST API changes
Managed resources uploaded via the REST API (POST /api/v1/resources) were invisible to MCP clients because the MCP SDK client caches resources/list responses and only refreshes when the server sends a notifications/resources/list_changed notification. The REST API never triggered this notification, so clients showed a stale resource list for the entire session.
What changed
NotifyResourceListChangedadded to Platform — triggersnotifications/resources/list_changedso connected MCP clients refresh their cached resource list.- Resource handler now calls
NotifyFnafter successful create, update, and delete operations. - Managed resources middleware now authenticates users directly for
resources/listandresources/readmethods instead of depending onPlatformContextfrom the tools/call pipeline. This fixes the case where the middleware had the right data in the database but couldn't serve it because the auth context was missing.
Full managed resources round-trip now works
- Upload a resource via
POST /api/v1/resources - Connected MCP clients receive
notifications/resources/list_changed resources/listreturns the new resource (filtered by caller's visible scopes)resources/readreturns the resource content via themcp://URI scheme
Upgrade notes
- No config changes required.
- Deployments without an S3 connection for managed resources will store metadata in the database but cannot serve blob content via
resources/read. Theresources/listwill still show the resource metadata.
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.55.4Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.55.4_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.55.4_linux_amd64.tar.gz