
Qlik Sense
STDIOMCP server for Qlik Sense Enterprise API integration with analytics tools
MCP server for Qlik Sense Enterprise API integration with analytics tools
Model Context Protocol (MCP) server for integration with Qlik Sense Enterprise APIs. Provides unified interface for Repository API and Engine API operations through MCP protocol.
Qlik Sense MCP Server bridges Qlik Sense Enterprise with systems supporting Model Context Protocol. Server provides 7 essential tools for application metadata retrieval and data analysis operations.
Tool | Description | API | Status |
---|---|---|---|
get_apps | Get comprehensive list of applications with metadata | Repository | ✅ |
get_app_details | Get compact app overview (metadata, fields, master items, sheets/objects) | Engine | ✅ |
engine_get_script | Extract load script from application | Engine | ✅ |
engine_get_field_statistics | Get comprehensive field statistics | Engine | ✅ |
engine_create_hypercube | Create hypercube for data analysis | Engine | ✅ |
get_app_field | Return values of a field with pagination and wildcard search | Engine | ✅ |
get_app_variables | Return variables split by source with pagination and wildcard search | Engine | ✅ |
The easiest way to use Qlik Sense MCP Server is with uvx:
uvx qlik-sense-mcp-server
This command will automatically install and run the latest version without affecting your system Python environment.
pip install qlik-sense-mcp-server
git clone https://github.com/bintocher/qlik-sense-mcp.git cd qlik-sense-mcp make dev
mkdir certs # Copy your Qlik Sense certificates to certs/ directory
cp .env.example .env # Edit .env with your settings
# Server connection QLIK_SERVER_URL=https://your-qlik-server.company.com QLIK_USER_DIRECTORY=COMPANY QLIK_USER_ID=your-username # Certificate paths (absolute paths) QLIK_CLIENT_CERT_PATH=/path/to/certs/client.pem QLIK_CLIENT_KEY_PATH=/path/to/certs/client_key.pem QLIK_CA_CERT_PATH=/path/to/certs/root.pem # API ports (standard Qlik Sense ports) QLIK_REPOSITORY_PORT=4242 QLIK_ENGINE_PORT=4747 # SSL settings QLIK_VERIFY_SSL=false
Create mcp.json
file for MCP client integration:
{ "mcpServers": { "qlik-sense": { "command": "uvx", "args": ["qlik-sense-mcp-server"], "env": { "QLIK_SERVER_URL": "https://your-qlik-server.company.com", "QLIK_USER_DIRECTORY": "COMPANY", "QLIK_USER_ID": "your-username", "QLIK_CLIENT_CERT_PATH": "/absolute/path/to/certs/client.pem", "QLIK_CLIENT_KEY_PATH": "/absolute/path/to/certs/client_key.pem", "QLIK_CA_CERT_PATH": "/absolute/path/to/certs/root.pem", "QLIK_REPOSITORY_PORT": "4242", "QLIK_ENGINE_PORT": "4747", "QLIK_VERIFY_SSL": "false" }, "disabled": false, "autoApprove": [ "get_apps", "get_app_details", "engine_get_script", "engine_get_field_statistics", "engine_create_hypercube", "get_app_field", "get_app_variables" ] } } }
# Using uvx (recommended) uvx qlik-sense-mcp-server # Using installed package qlik-sense-mcp-server # From source (development) python -m qlik_sense_mcp_server.server
# Via MCP client - get first 50 apps (default) result = mcp_client.call_tool("get_apps") print(f"Showing {result['pagination']['returned']} of {result['pagination']['total_found']} apps") # Search for specific apps result = mcp_client.call_tool("get_apps", { "name_filter": "Sales", "limit": 10 }) # Get more apps (pagination) result = mcp_client.call_tool("get_apps", { "offset": 50, "limit": 50 })
# Get comprehensive app analysis result = mcp_client.call_tool("get_app_details", { "app_id": "your-app-id" }) print(f"App has {len(result['data_model']['tables'])} tables")
# Create hypercube for sales analysis result = mcp_client.call_tool("engine_create_hypercube", { "app_id": "your-app-id", "dimensions": ["Region", "Product"], "measures": ["Sum(Sales)", "Count(Orders)"], "max_rows": 1000 })
# Get detailed field statistics result = mcp_client.call_tool("engine_get_field_statistics", { "app_id": "your-app-id", "field_name": "Sales" }) print(f"Average: {result['avg_value']['numeric']}")
Retrieves comprehensive list of Qlik Sense applications with metadata, pagination and filtering support.
Parameters:
limit
(optional): Maximum number of apps to return (default: 50, max: 1000)offset
(optional): Number of apps to skip for pagination (default: 0)name_filter
(optional): Filter apps by name (case-insensitive partial match)app_id_filter
(optional): Filter by specific app ID/GUIDinclude_unpublished
(optional): Include unpublished apps (default: true)Returns: Object containing paginated apps, streams, and pagination metadata
Example (default - first 50 apps):
{ "apps": [...], "streams": [...], "pagination": { "limit": 50, "offset": 0, "returned": 50, "total_found": 1598, "has_more": true, "next_offset": 50 }, "filters": { "name_filter": null, "app_id_filter": null, "include_unpublished": true }, "summary": { "total_apps": 1598, "published_apps": 857, "private_apps": 741, "total_streams": 40, "showing": "1-50 of 1598" } }
Example (with name filter):
# Search for apps containing "dashboard" result = mcp_client.call_tool("get_apps", { "name_filter": "dashboard", "limit": 10 }) # Get specific app by ID result = mcp_client.call_tool("get_apps", { "app_id_filter": "e2958865-2aed-4f8a-b3c7-20e6f21d275c" }) # Get next page of results result = mcp_client.call_tool("get_apps", { "limit": 50, "offset": 50 })
Gets comprehensive application analysis including data model, object counts, and metadata.
Parameters:
app_id
(required): Application identifierReturns: Detailed application object with data model structure
Example:
{ "app_metadata": {...}, "data_model": { "tables": [...], "total_tables": 2, "total_fields": 45 }, "object_counts": {...} }
Retrieves load script from application.
Parameters:
app_id
(required): Application identifierReturns: Object containing script text and metadata
Example:
{ "qScript": "SET DateFormat='DD.MM.YYYY';\n...", "app_id": "app-id", "script_length": 2830 }
Returns values of a single field with pagination and optional wildcard search.
Parameters:
app_id
(required): Application GUIDfield_name
(required): Field namelimit
(optional): Number of values to return (default: 10, max: 100)offset
(optional): Offset for pagination (default: 0)search_string
(optional): Wildcard text mask with *
and %
supportsearch_number
(optional): Wildcard numeric mask with *
and %
supportcase_sensitive
(optional): Case sensitivity for search_string
(default: false)Returns: Object containing field values
Example:
{ "field_values": [ "Russia", "USA", "China" ] }
Retrieves comprehensive field statistics.
Parameters:
app_id
(required): Application identifierfield_name
(required): Field nameReturns: Statistical analysis including min, max, average, median, mode, standard deviation
Example:
{ "field_name": "age", "min_value": {"numeric": 0}, "max_value": {"numeric": 2023}, "avg_value": {"numeric": 40.98}, "median_value": {"numeric": 38}, "std_deviation": {"numeric": 24.88} }
Creates hypercube for data analysis.
Parameters:
app_id
(required): Application identifierdimensions
(required): Array of dimension fieldsmeasures
(required): Array of measure expressionsmax_rows
(optional): Maximum rows to return (default: 1000)Returns: Hypercube data with dimensions, measures, and total statistics
Example:
{ "hypercube_data": { "qDimensionInfo": [...], "qMeasureInfo": [...], "qDataPages": [...] }, "total_rows": 30, "total_columns": 4 }
qlik-sense-mcp/
├── qlik_sense_mcp_server/
│ ├── __init__.py
│ ├── server.py # Main MCP server
│ ├── config.py # Configuration management
│ ├── repository_api.py # Repository API client (HTTP)
│ ├── engine_api.py # Engine API client (WebSocket)
│ └── utils.py # Utility functions
├── certs/ # Certificates (git ignored)
│ ├── client.pem
│ ├── client_key.pem
│ └── root.pem
├── .env.example # Configuration template
├── mcp.json.example # MCP configuration template
├── pyproject.toml # Project dependencies
└── README.md
Main server class handling MCP protocol operations, tool registration, and request routing.
HTTP client for Repository API operations including application metadata and administrative functions.
WebSocket client for Engine API operations including data extraction, analytics, and hypercube creation.
Configuration management class handling environment variables, certificate paths, and connection settings.
# Setup development environment make dev # Show all available commands make help # Build package make build
# Bump patch version and create PR make version-patch # Bump minor version and create PR make version-minor # Bump major version and create PR make version-major
# In tools_list Tool(name="new_tool", description="Tool description", inputSchema={...})
# In handle_call_tool() elif name == "new_tool": result = await asyncio.to_thread(self.api_client.new_method, arguments) return [TextContent(type="text", text=json.dumps(result, indent=2))]
# In repository_api.py or engine_api.py def new_method(self, param: str) -> Dict[str, Any]: """Method implementation.""" return result
SSL: CERTIFICATE_VERIFY_FAILED
Solution:
.env
QLIK_VERIFY_SSL=false
for testingConnectionError: Failed to connect to Engine API
Solution:
401 Unauthorized
Solution:
QLIK_USER_DIRECTORY
and QLIK_USER_ID
python -c " from qlik_sense_mcp_server.config import QlikSenseConfig config = QlikSenseConfig.from_env() print('Config valid:', config and hasattr(config, 'server_url')) print('Server URL:', getattr(config, 'server_url', 'Not set')) "
python -c " from qlik_sense_mcp_server.server import QlikSenseMCPServer server = QlikSenseMCPServer() print('Server initialized:', server.config_valid) "
max_rows
parameterOperation | Average Time | Recommendations |
---|---|---|
get_apps | 0.5s | Use filters |
get_app_details | 2-5s | Analyze specific apps |
engine_create_hypercube | 1-10s | Limit dimensions and measures |
engine_get_field_statistics | 0.5-2s | Use for numeric fields |
Create user in QMC with minimal required permissions:
MIT License
Copyright (c) 2025 Stanislav Chernov
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Project Status: Production Ready | 7/7 Tools Working | v1.2.0
Installation: uvx qlik-sense-mcp-server