npm package: @iflow-mcp/undsoul_qlik-claude-mcp
Description: MCP Server for Qlik Cloud and Qlik Sense Enterprise - Connect Claude AI to your analytics platform
Author: undsoul
Latest version: 1.0.0

# Qlik MCP Server

A Model Context Protocol (MCP) server that connects AI assistants like Claude to your Qlik Cloud and Qlik Sense Enterprise environments. This enables natural language interactions with your analytics platform.

**Own your AI. Create your own way to interact with your data.**

## Features

- **34 MCP Tools** across 12 categories
- **Dual Platform Support** - Qlik Cloud and Qlik Sense Enterprise (On-Premise)
- **Natural Language Analytics** - Ask questions about your data in plain English
- **Full Lifecycle Management** - Apps, reloads, users, spaces, and more
- **AI/ML Integration** - AutoML experiments, Qlik Answers assistants
- **Enterprise Governance** - Users, roles, permissions, compliance

---

## Quick Start

### Prerequisites

- **Node.js 18+** - Download from [nodejs.org](https://nodejs.org/)
- **Claude Desktop** - Download from [claude.ai/download](https://claude.ai/download)
- **Qlik Cloud tenant** OR **Qlik Sense Enterprise server**

---

### Step 1: Download the MCP Server

#### Windows (Recommended)

1. **Download the ZIP file** from GitHub:
   - Go to: https://github.com/undsoul/qlik-claude-mcp
   - Click green **"Code"** button → **"Download ZIP"**

2. **Extract to C:\** (recommended for simple paths):
   - Right-click the downloaded ZIP → **Extract All**
   - Extract to: `C:\`
   - You should now have: `C:\qlik-claude-mcp-main\`

3. **Open PowerShell** and install dependencies:
   ```powershell
   cd C:\qlik-claude-mcp-main
   npm install
   ```

#### macOS / Linux

```bash
git clone https://github.com/undsoul/qlik-claude-mcp.git
cd qlik-claude-mcp
npm install
```

---

### Step 2: Install Claude Desktop

1. Download Claude Desktop from [claude.ai/download](https://claude.ai/download)
2. Install and sign in with your Anthropic account

---

### Step 3: Get Your Qlik API Key

#### For Qlik Cloud:
1. Log in to your Qlik Cloud tenant
2. Click your **profile icon** (top right) → **Profile settings**
3. Go to **API keys** section
4. Click **Generate new key**
5. Copy and save the API key (you won't see it again!)

#### For Qlik Sense Enterprise (On-Premise):

1. Open **QMC** → **Start** → **Certificates**
2. Add a machine name (e.g., `MCP-Client`)
3. Click **Export certificates**
4. **Important settings:**
   - **Certificate file format:** Choose **PEM format** (not Windows format)
   - Check **Include secret key**
5. Export and save the files:
   - `client.pem` - Client certificate
   - `client_key.pem` - Private key
6. Note the paths where you saved these files

---

### Step 4: Configure Claude Desktop

#### Open Config File (Easiest Way)

1. **Open Claude Desktop**
2. Click **Settings** (gear icon) or **File menu**
3. Click **"Edit Config"** or **"Settings" → "Developer" → "Edit Config"**
4. This opens `claude_desktop_config.json` in your default text editor
5. Paste the configuration below and **Save** (Ctrl+S)

> **Config file location:**
> - Windows: `C:\Users\{YourName}\AppData\Roaming\Claude\claude_desktop_config.json`
> - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`

---

#### Qlik Cloud Examples

**Windows:**
```json
{
  "mcpServers": {
    "qlik-mcp-os": {
      "command": "node",
      "args": ["C:/qlik-claude-mcp-main/dist/index.js"],
      "env": {
        "QLIK_TENANT_URL": "https://your-tenant.eu.qlikcloud.com",
        "QLIK_API_KEY": "your-api-key-here"
      }
    }
  }
}
```

**macOS:**
```json
{
  "mcpServers": {
    "qlik-mcp-os": {
      "command": "node",
      "args": ["/Users/yourname/qlik-claude-mcp/dist/index.js"],
      "env": {
        "QLIK_TENANT_URL": "https://your-tenant.us.qlikcloud.com",
        "QLIK_API_KEY": "your-api-key-here"
      }
    }
  }
}
```

---

#### Qlik Sense Enterprise (On-Premise) Examples

**Step 1: Export Certificates from QMC**

1. Open Qlik Management Console (QMC)
2. Go to **Certificates** under Configure System
3. Click **Export certificates**
4. Enter machine name (e.g., your server hostname)
5. Check **Include secret key**
6. Export format: **Platform independent PEM-format**
7. Click **Export** - saves to: `C:\ProgramData\Qlik\Sense\Repository\Exported Certificates\<machinename>\`

The folder will contain:
- `client.pem` - Client certificate
- `client_key.pem` - Client private key
- `root.pem` - Root CA certificate

**Step 2: Configure Claude Desktop**

**Windows:**
```json
{
  "mcpServers": {
    "qlik-onprem": {
      "command": "node",
      "args": ["C:/qlik-claude-mcp-main/dist/index.js"],
      "env": {
        "QLIK_TENANT_URL": "https://qlik-server.company.com",
        "QLIK_DEPLOYMENT": "on-premise",
        "QLIK_CERT_PATH": "C:/ProgramData/Qlik/Sense/Repository/Exported Certificates/YourServer",
        "QLIK_USER_DIRECTORY": "COMPANY",
        "QLIK_USER_ID": "administrator"
      }
    }
  }
}
```

**macOS/Linux:**
```json
{
  "mcpServers": {
    "qlik-onprem": {
      "command": "node",
      "args": ["/Users/yourname/qlik-claude-mcp/dist/index.js"],
      "env": {
        "QLIK_TENANT_URL": "https://qlik-server.company.com",
        "QLIK_DEPLOYMENT": "on-premise",
        "QLIK_CERT_PATH": "/path/to/exported-certificates",
        "QLIK_USER_DIRECTORY": "DOMAIN",
        "QLIK_USER_ID": "administrator"
      }
    }
  }
}
```

> **Note:**
> - `QLIK_CERT_PATH` is the **folder** containing `client.pem`, `client_key.pem`, and `root.pem`
> - `QLIK_USER_DIRECTORY` and `QLIK_USER_ID` specify which user to act as (e.g., `DOMAIN\administrator`)
> - The user must have appropriate access rights in QMC

---

#### Multi-Tenant & Hybrid Configurations

You can configure **multiple MCP servers** in the same config file to connect to different Qlik environments simultaneously. This supports:

- **Multiple Qlik Cloud tenants** (e.g., Dev, Test, Prod)
- **Multiple On-Premise servers**
- **Hybrid setups** (Cloud + On-Premise together)

**Example: Two Cloud Tenants + One On-Premise:**
```json
{
  "mcpServers": {
    "qlik-cloud-dev": {
      "command": "node",
      "args": ["C:/qlik-claude-mcp-main/dist/index.js"],
      "env": {
        "QLIK_TENANT_URL": "https://dev-tenant.eu.qlikcloud.com",
        "QLIK_API_KEY": "dev-api-key-here"
      }
    },
    "qlik-cloud-prod": {
      "command": "node",
      "args": ["C:/qlik-claude-mcp-main/dist/index.js"],
      "env": {
        "QLIK_TENANT_URL": "https://prod-tenant.eu.qlikcloud.com",
        "QLIK_API_KEY": "prod-api-key-here"
      }
    },
    "qlik-onprem": {
      "command": "node",
      "args": ["C:/qlik-claude-mcp-main/dist/index.js"],
      "env": {
        "QLIK_TENANT_URL": "https://qlik-server.company.com",
        "QLIK_DEPLOYMENT": "on-premise",
        "QLIK_CERT_PATH": "C:/ProgramData/Qlik/Sense/Repository/Exported Certificates/MyServer",
        "QLIK_USER_DIRECTORY": "COMPANY",
        "QLIK_USER_ID": "administrator"
      }
    }
  }
}
```

Each server appears as a separate MCP connection in Claude Desktop. You can specify which environment to use when asking questions:
- *"Using qlik-cloud-dev, list all apps"*
- *"On qlik-onprem, trigger reload for Sales Dashboard"*

---

### Step 5: Build the MCP Server

**After saving your config**, go back to PowerShell (Windows) or Terminal (macOS) and run:

#### Windows
```powershell
npm run build
```

#### macOS / Linux
```bash
npm run build
```

**Verify build succeeded** - you should see `dist/index.js` created.

---

### Step 6: Restart Claude Desktop

1. **Quit Claude Desktop completely** (not just close the window)
   - macOS: Right-click Claude in menu bar → Quit
   - Windows: Right-click Claude in system tray → Exit
2. **Reopen Claude Desktop**
3. Start a new conversation and try: *"Check my Qlik health"*

---

### Verify It's Working

In Claude Desktop, type:

```
Check my Qlik environment health
```

You should see Claude use the `qlik_health_check` tool and return your tenant status.

---

## Tool Capabilities (33 Tools)

### 1. Search Tools (1)

Unified search across all resources.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_search` | Search apps, datasets, automations, and more | Cloud, On-Prem |

**Example prompts:**
- "Search for apps containing 'Sales'"
- "Find all datasets in the Finance space"
- "List apps modified in the last week"

---

### 2. Governance Tools (5)

Manage users, tenants, and licenses.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_health_check` | Check server status and connectivity | Cloud, On-Prem |
| `qlik_get_tenant_info` | Get tenant/server information | Cloud, On-Prem |
| `qlik_search_users` | Search users by name or email | Cloud, On-Prem |
| `qlik_get_user_info` | Get detailed user information | Cloud, On-Prem |
| `qlik_get_license_info` | Get license and seat allocation | Cloud, On-Prem |

**Example prompts:**
- "Check the health of my Qlik environment"
- "Search for users with 'admin' in their name"
- "Show me the license information"

---

### 3. Reload Tools (3)

Manage app reloads.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_trigger_app_reload` | Trigger an app reload | Cloud, On-Prem |
| `qlik_get_reload_status` | Check reload task status | Cloud, On-Prem |
| `qlik_cancel_reload` | Cancel a running reload | Cloud, On-Prem |

**Example prompts:**
- "Reload the Sales Dashboard app"
- "What's the status of reload task abc123?"
- "Cancel the current reload"

---

### 4. Catalog Tools (1)

Browse spaces and streams.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_get_spaces_catalog` | List all spaces with details | Cloud (Spaces), On-Prem (Streams) |

**Example prompts:**
- "List all spaces in my tenant"
- "Show me the catalog of available spaces"

---

### 5. Lineage Tools (1) - Cloud Only

Track data lineage.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_get_lineage` | Get data lineage for a resource | Cloud |

**Example prompts:**
- "Show me the data lineage for dataset xyz"

---

### 6. Data Tools (5)

Interact with data and selections.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_get_dataset_details` | Get dataset/data connection details | Cloud, On-Prem |
| `qlik_apply_selections` | Apply field selections | Cloud, On-Prem |
| `qlik_clear_selections` | Clear all selections | Cloud, On-Prem |
| `qlik_get_current_selections` | Get active selections | Cloud, On-Prem |
| `qlik_get_available_fields` | List all fields in an app | Cloud, On-Prem |

**Example prompts:**
- "What fields are available in app xyz?"
- "Select 'USA' in the Country field"
- "Clear all selections in the app"

---

### 7. Misc Tools (2)

Natural language and reload info.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_insight_advisor` | Ask natural language questions | Cloud, On-Prem |
| `qlik_get_reload_info` | Get reload history for an app | Cloud, On-Prem |

**Example prompts:**
- "Ask Sales app: What were total sales last year?"
- "Show me the reload history for app xyz"

> **Note:** On-premise `qlik_insight_advisor` requires Insight Advisor Chat license enabled in QMC.

---

### 8. App Tools (1)

Create, update apps and manage data connections.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_generate_app` | Create or update a Qlik app with script and data connections | Cloud, On-Prem |

**Example prompts:**
- "Create a new app called Sales Report"
- "Update the load script for app xyz"

#### Cloud Workflow

On Qlik Cloud, `qlik_generate_app` uses REST APIs to create apps and trigger reloads asynchronously.

**Cloud Example Prompts:**

| What you say | What happens |
|--------------|--------------|
| "Create a Qlik app with sample sales data" | Creates app with inline LOAD script |
| "Create a new app called 'Dashboard' and load this data..." | Creates app in personal space |
| "Update the load script for app abc-123" | Updates existing app's script |

**Typical Cloud Workflow:**

1. **Create app with inline data:**
   ```
   "Create a Qlik app called 'Sales Analysis' with sample data
   for products, regions, and sales amounts"
   ```

2. **Create app using existing dataset:**
   ```
   "Create a Qlik app that loads from the 'Sales.qvd' dataset
   in my Data space"
   ```

3. **Update existing app:**
   ```
   "Update app abc-123 with a new load script that adds
   a calculated field for profit margin"
   ```

**Cloud Data Connection Note:**
On Cloud, data connections are managed via the Qlik Cloud hub or Spaces. Use `qlik_search` with `types: ["dataconnection"]` to find existing connections, then reference them in your load script using `LIB CONNECT TO`.

---

#### On-Premise Workflow (Engine API)
On Qlik Sense Enterprise, the tool uses the Engine API via WebSocket (port 4747) with certificate authentication:

1. **Create App** - `Global.CreateApp()`
2. **Create Data Connection** (optional) - `Doc.CreateConnection()`
3. **Set Load Script** - `Doc.SetScript()`
4. **Execute Reload** - `Doc.DoReload()`
5. **Save App** - `Doc.DoSave()`

**On-Premise Example Prompts:**

| What you say | What happens |
|--------------|--------------|
| "List available ODBC data sources on the server" | Lists all DSNs configured on the Qlik server |
| "Show me the data connections in app abc-123" | Lists all connections in the specified app |
| "Create a Qlik app with sample sales data" | Creates app with inline LOAD script |
| "Create an app that loads data from C:\Data\sales.csv" | Creates folder connection + app |
| "Create an app connected to SQL Server DSN 'MySQLServer'" | Creates ODBC connection + app |

**Typical On-Premise Workflow:**

1. **Discover data sources:**
   ```
   "What ODBC data sources are available on the Qlik server?"
   ```

2. **Explore existing app connections:**
   ```
   "List the data connections in the Sales Dashboard app"
   ```

3. **Create app with data:**
   ```
   "Create a new Qlik app called 'Customer Analysis' that connects to
   the folder C:\QlikData and loads customers.csv"
   ```

**Discovery Parameters:**
```json
// List available ODBC data sources on the server
{ "listOdbcDsns": true }

// List connections in an existing app
{ "appId": "abc-123", "listConnections": true }
```

**On-Premise Data Connection Examples:**

*Folder Connection:*
```json
{
  "appName": "SalesReport",
  "dataConnection": {
    "connectionName": "SalesData",
    "connectionType": "folder",
    "connectionString": "C:\\Data\\Sales\\"
  },
  "loadScript": "LOAD * FROM [lib://SalesData/sales.csv] (txt, codepage is 1252, embedded labels, delimiter is ',', msq);"
}
```

*ODBC Connection:*
```json
{
  "appName": "SQLReport",
  "dataConnection": {
    "connectionName": "SQLServer",
    "connectionType": "ODBC",
    "connectionString": "DSN=MyDSN",
    "username": "user",
    "password": "pass"
  },
  "loadScript": "LIB CONNECT TO 'SQLServer';\nSQL SELECT * FROM Sales;"
}
```

> **Note:** On-premise uses Engine API (port 4747) with certificate auth. Ensure certificates are properly exported from QMC.

---

### 9. Automation Tools (4) - Cloud Only

Manage automations.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_automation_list` | List all automations | Cloud |
| `qlik_automation_get_details` | Get automation details | Cloud |
| `qlik_automation_run` | Execute an automation | Cloud |
| `qlik_automation_list_runs` | List automation runs | Cloud |

**Example prompts:**
- "List all automations"
- "Run the daily ETL automation"
- "Show me the run history for automation xyz"

---

### 10. Alerts Tools (4) - Cloud Only

Data alerting and notifications.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_alert_list` | List all data alerts | Cloud |
| `qlik_alert_get` | Get alert details | Cloud |
| `qlik_alert_trigger` | Manually trigger an alert | Cloud |
| `qlik_alert_delete` | Delete an alert | Cloud |

**Example prompts:**
- "List all data alerts"
- "Show me the details of alert xyz"
- "Trigger the inventory alert"

---

### 11. Qlik Answers Tools (3) - Cloud Only

AI assistants with Q&A capabilities.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_answers_list_assistants` | List AI assistants | Cloud |
| `qlik_answers_get_assistant` | Get assistant details | Cloud |
| `qlik_answers_ask_question` | Ask a question to an assistant | Cloud |

**Example prompts:**
- "List all Qlik Answers assistants"
- "Show me the details of the Sales Assistant"
- "Ask the Sales Assistant: What were our top products last quarter?"

---

### 12. AutoML Tools (4) - Cloud Only

Machine learning experiments and deployments.

| Tool | Description | Platforms |
|------|-------------|-----------|
| `qlik_automl_get_experiments` | List all experiments | Cloud |
| `qlik_automl_get_experiment` | Get experiment details | Cloud |
| `qlik_automl_list_deployments` | List deployments | Cloud |
| `qlik_automl_get_deployment` | Get deployment details | Cloud |

**Example prompts:**
- "List all AutoML experiments"
- "Show me the deployments"
- "Get details for experiment xyz"

---

## Usage Examples

### Basic Queries

```
You: "Check the health of my Qlik Cloud tenant"
Claude: [Uses qlik_health_check] Your tenant is healthy...

You: "List all spaces"
Claude: [Uses qlik_get_spaces_catalog] Found 57 spaces...

You: "Search for users named John"
Claude: [Uses qlik_search_users] Found 3 users matching 'John'...
```

### Data Analysis

```
You: "Analyze the data model for my Sales Dashboard app"
Claude: [Uses qlik_analyze_data_model] The app has 5 tables,
       45 fields, with 1.2M rows in the main fact table...

You: "Select USA in the Country field, then show me the current selections"
Claude: [Uses qlik_apply_selections, qlik_get_current_selections]
       Selection applied. Current selections: Country = USA
```

### Reload Management

```
You: "Show me all currently running reloads"
Claude: [Uses qlik_monitor_active_reloads] 2 reloads in progress...

You: "Reload the Finance Dashboard"
Claude: [Uses qlik_trigger_app_reload] Reload started. Task ID: xyz...

You: "Check the reload history for that app"
Claude: [Uses qlik_get_app_reload_history] Last 5 reloads shown...
```

### AI/ML Features

```
You: "List all Qlik Answers assistants"
Claude: [Uses qlik_answers_list_assistants] Found 3 assistants...

You: "Ask the Sales Assistant: What were our top products last quarter?"
Claude: [Uses qlik_answers_ask_question] Based on the data,
       your top 5 products were...

You: "List AutoML experiments"
Claude: [Uses qlik_automl_get_experiments] Found 2 experiments...
```

---

## Platform Support

### Qlik Cloud
All 34 tools are available on Qlik Cloud.

### Qlik Sense Enterprise (On-Premise)
17 tools work on-premise. Cloud-only features return informative messages:

```json
{
  "success": false,
  "error": "This feature is only available on Qlik Cloud",
  "platform": "on-premise",
  "suggestion": "Alternative approach for on-premise..."
}
```

#### Cloud-Only Features (16 tools)
- Qlik Answers (2 tools)
- AutoML (4 tools)
- Data Alerts (4 tools)
- Automation (4 tools)
- Lineage (1 tool)
- Dataset Details (1 tool)

#### On-Premise Equivalents
| Cloud Feature | On-Premise Alternative |
|---------------|----------------------|
| Spaces | Streams (via QRS `/qrs/stream`) |
| Items API | QRS App API (`/qrs/app`) |
| Cloud Reloads | QRS Reload Tasks (`/qrs/reloadtask`) |
| Insight Advisor | NL Query API (`/api/v1/nl/query`) |
| App Create/Script | Engine API (`Global.CreateApp`, `Doc.SetScript`, `Doc.DoReload`) |
| Data Connections | Engine API (`Doc.CreateConnection`, `Doc.GetConnections`) |
| ODBC Discovery | Engine API (`Global.GetOdbcDsns`) |

---

## Testing

### Quick Smoke Test

```bash
export QLIK_TENANT_URL=https://your-tenant.qlikcloud.com
export QLIK_API_KEY=your-api-key
node test-cloud-quick.cjs
```

### Full Handler Test

```bash
node test-mcp-handlers.mjs
```

---

## Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `QLIK_TENANT_URL` | Yes | Qlik Cloud URL or Qlik Sense Enterprise server URL |
| `QLIK_DEPLOYMENT` | No | `cloud` (default) or `on-premise` |

**For Qlik Cloud:**

| Variable | Required | Description |
|----------|----------|-------------|
| `QLIK_API_KEY` | Yes | API key from Qlik Cloud hub |

**For Qlik Sense Enterprise (On-Premise):**

| Variable | Required | Description |
|----------|----------|-------------|
| `QLIK_CERT_PATH` | Yes | **Folder** containing `client.pem`, `client_key.pem`, `root.pem` |
| `QLIK_USER_DIRECTORY` | Yes | Windows domain (e.g., `COMPANY`) |
| `QLIK_USER_ID` | Yes | Username to act as (e.g., `admin`) |
| `QLIK_VIRTUAL_PROXY` | No | Virtual proxy prefix (if configured) |

---

## Troubleshooting

### "Tool not found" Error
Ensure the MCP server is running and Claude Desktop was restarted after configuration.

### Authentication Errors

**Qlik Cloud:**
- Verify your API key is valid and not expired
- Ensure the API key has appropriate permissions

**Qlik Sense Enterprise (On-Premise):**
- Verify certificate paths are correct and files exist
- Ensure certificates were exported with the private key
- Check that the certificate hasn't expired
- Verify the machine name in the certificate matches your setup

### "Cloud-only feature" Message
Some tools are only available on Qlik Cloud. The error message will suggest alternatives.

### Connection Timeout
Check network connectivity to your Qlik server. Ensure firewalls allow the connection.

### Empty MCP Server / Tools Not Showing

If Claude Desktop shows empty MCP server with no tools:

1. **Check if dist/ folder exists:**
   ```powershell
   dir C:\qlik-claude-mcp-main\dist\
   ```
   If not, run `npm run build` first.

2. **Check MCP server logs:**
   ```powershell
   type "$env:APPDATA\Claude\logs\mcp-server-qlik-mcp-os.log"
   ```

3. **Fully restart Claude Desktop:**
   - Close Claude Desktop
   - Open Task Manager (Ctrl+Shift+Esc)
   - Find "Claude" and click **End Task**
   - Reopen Claude Desktop

4. **Verify config file location:**
   ```powershell
   type "$env:APPDATA\Claude\claude_desktop_config.json"
   ```

### Server Hangs or Slow Response

If the server hangs or responds slowly, use optimized config with memory settings:

```json
{
  "mcpServers": {
    "qlik-mcp-os": {
      "command": "node",
      "args": [
        "--max-old-space-size=4096",
        "C:\\qlik-claude-mcp-main\\dist\\index.js"
      ],
      "env": {
        "QLIK_TENANT_URL": "https://your-tenant.qlikcloud.com",
        "QLIK_API_KEY": "your-api-key",
        "NODE_ENV": "production"
      }
    }
  }
}
```

### "Cannot find module" Error

This means `npm run build` was not executed:

```powershell
cd C:\qlik-claude-mcp-main
npm install
npm run build
```

Then restart Claude Desktop.

---

## Architecture

```
┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  Claude Desktop │────▶│   MCP Server    │────▶│   Qlik Cloud    │
│                 │     │                 │     │   (REST APIs)   │
│  Natural Lang   │◀────│  33 Tools       │◀────│                 │
│  Interface      │     │  12 Categories  │     ├─────────────────┤
└─────────────────┘     └─────────────────┘     │ Qlik Sense Ent. │
                                                │ (QRS + Engine)  │
                                                └─────────────────┘
```

**Cloud:** REST APIs (`/api/v1/*`) with API key authentication

**On-Premise:**
- QRS API (port 4242) - Management operations
- Engine API (port 4747) - App creation, scripts, data connections via WebSocket

---

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Run tests: `npm test`
5. Submit a pull request

---

## License

MIT License - See LICENSE file for details.

---

## Support

- **Issues**: [GitHub Issues](https://github.com/undsoul/qlik-claude-mcp/issues)
- **Documentation**: See `/docs` folder
- **Qlik Community**: [community.qlik.com](https://community.qlik.com)

---

*Built with the Model Context Protocol (MCP) for seamless AI-analytics integration.*