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 "Install 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-mcplist 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: SAP Datasphere MCP Server
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.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/EngIcaro/qlik-lineage-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server