qlik-lineage-mcp
Provides tools for analyzing data-file lineage in Qlik Cloud tenants, including identifying unused columns and ghost files, enabling savings on capacity pricing.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@qlik-lineage-mcp list unused columns in the SalesData.qvd file"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Qlik Lineage MCP
A read-only Model Context Protocol (MCP) server that exposes data-file lineage analyses for Qlik Cloud tenants. Built especially for tenants on the capacity pricing model (daily peak GB), where dropping unused columns / ghost files yields direct savings.
Tools
Tool | What it answers |
| Given a data file (QVD or Parquet) and its space, which columns are not consumed by any app in the tenant? |
| Given a space, which data files are not consumed by any app — including transitive chains (file -> file -> app)? |
Both tools are read-only. They recommend, they never delete.
Related MCP server: secoda-analysis-mcp
Quick start
# 1. Install deps with uv (or pip)
uv sync
# 2. Copy and fill the env file
copy .env.example .env
# edit QLIK_TENANT_URL and QLIK_API_KEY
# 3. Run the MCP server (stdio transport)
uv run qlik-lineage-mcpWire the server into Claude Desktop / Claude Code / VS Code:
{
"mcpServers": {
"qlik-lineage": {
"command": "uv",
"args": ["run", "qlik-lineage-mcp"],
"cwd": "C:/path/to/qlik-lineage-mcp"
}
}
}Architecture
src/qlik_lineage_mcp/
├── server.py # FastMCP entry point — auto-registers everything in tools/
├── config.py # env-var loader (.env fallback)
├── qlik_client.py # all Qlik Cloud HTTP calls live here
├── models.py # format-agnostic Pydantic models (DataFile = QVD or Parquet)
└── tools/
├── __init__.py # auto-discovers and calls register(mcp) on each module
├── unused_columns.py
└── ghost_files.pyAdding a new tool: drop a file in tools/ that exports register(mcp: FastMCP).
server.py does not need to be edited.
How unused_columns works
A 3-phase pipeline that uses Qlik's field-level lineage (no script parsing):
Enumerate columns —
GET /lineage-graphs/nodes/{file_qri}?level=fieldexposes every column of the target file as a node whose QRI starts with the file QRI.Find consumer apps — iterate every app in the tenant and read its
data/lineage. Apps whose discriminators include alib://...{file_name}LOAD reference are the consumers.Detect renames — for each consumer app, fetch
GET /lineage-graphs/nodes/{app_qri}?level=field. Edges whose source is a field of the target file map the original column to the alias used by the app. Qlik decomposes composite expressions automatically, soLOAD A_COD & '\' & A_LOJA AS KEY FROM fileproduces two edges (A_COD->KEY,A_LOJA->KEY) — no script parser needed.
Cost: one file-side call + N data/lineage calls (one per app, also paid
by ghost_files) + M field-level lineage calls (one per consumer app).
Known limitations
Rename detection requires the consumer app to have been reloaded since field-level lineage was activated in the tenant. Apps that have not been reloaded show no edges in their field-level graph, so renames in those apps are invisible. The output lists which consumer apps could not be inspected so the verdict is auditable.
ghost_fileswalks every app'sdata/lineageand builds an app/file graph, then runs a fixpoint to mark useful chains. Dependencies hidden insideSUB/CALL/$(include)or dynamic file paths are missed.Apps whose
data/metadatacannot be fetched (permissions, errors) are surfaced as a top-levelmetadata_unavailable_appscaveat — verdicts are conditional on those apps being checkable.Parquet support is implemented format-agnostically but until a real Parquet item-endpoint fixture is captured, surfacing of Parquet files is best-effort. The tools flag this in their output.
Testing
uv run pytestAll tests run against captured JSON fixtures in tests/fixtures/ —
no live tenant calls.
Available Tools
2 toolsghost_filesC
Return data files in a space that no app in the tenant consumes.
Args: space_name: Display name of the space to scan. Case-insensitive.
Inputs: space_name (required).
unused_columnsA
Return columns of a data file that no app in the tenant consumes.
Args:
file_name: Data file name with extension (e.g. Sales.qvd).
Case-insensitive but extension must match.
space_name: Display name of the space the file lives in.
Case-insensitive.
lineage_activation_date: ISO 8601 date when field-level lineage
was activated in the tenant (e.g. "2025-06-01"). Consumer
apps last reloaded before this date have no edges in their
lineage graph and are marked as stale instead of being queried.
Omit to skip staleness detection.
Inputs: file_name (required), space_name (required), lineage_activation_date.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: ghost_files identifies unused data files, while unused_columns identifies unused columns within a file. No overlap.
Both tool names follow a consistent snake_case verb_noun pattern (ghost_files, unused_columns), making them predictable.
With only 2 tools, the server is focused on a narrow domain (identifying unused resources). While minimal, the scope is appropriately scoped for its specific purpose.
The tools cover file-level and column-level unused resources, but missing capabilities such as listing spaces, retrieving lineage graphs, or identifying unused apps, which may be needed for full lineage analysis.
Related MCP Connectors
Hosted MCP server for AWS cloud spend: service breakdowns, anomalies, savings and forecasts.
- Costory FinOps MCPDeprecatedio.costory
FinOps harness MCP: allocated cloud, data and LLM bills. Build on it or switch. Cloud read-only.
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- AlicenseCqualityDmaintenanceA read-only MCP server that enables users to query Databricks SQL, browse metadata, and monitor Delta Lake tables. It also supports tracking Databricks Jobs, DLT Pipelines, and cluster metrics through natural language interfaces.254MIT
- AlicenseAqualityDmaintenanceA read-only MCP server for exploring and analyzing a Secoda data catalog, enabling AI chat, semantic search, glossary browsing, and data lineage tracing.12Apache 2.0
- -licenseNot gradedqualityCmaintenanceMCP server for SAP Datasphere that enables AI assistants to perform data discovery, metadata exploration, analytics queries, ETL data extraction, database user management, and data profiling with built-in PII masking.-
- FlicenseNot gradedqualityBmaintenanceRead-only Azure storage intelligence MCP server enabling scoped investigations, risk analytics, cost savings simulation, data health checks, and admin tenant-wide discovery across a synthetic storage estate.-