{
  "markdown": "# mcp-superset\n\n<!-- mcp-name: io.github.bintocher/mcp-superset -->\n\n[![PyPI version](https://img.shields.io/pypi/v/mcp-superset.svg)](https://pypi.org/project/mcp-superset/)\n[![PyPI downloads](https://img.shields.io/pypi/dm/mcp-superset.svg)](https://pypi.org/project/mcp-superset/)\n[![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![CI](https://github.com/bintocher/mcp-superset/actions/workflows/ci.yml/badge.svg)](https://github.com/bintocher/mcp-superset/actions/workflows/ci.yml)\n[![CodeQL](https://github.com/bintocher/mcp-superset/actions/workflows/codeql.yml/badge.svg)](https://github.com/bintocher/mcp-superset/actions/workflows/codeql.yml)\n\n[![Superset 6.0.1](https://img.shields.io/badge/Superset-6.0.1-orange.svg)](https://superset.apache.org/)\n[![MCP](https://img.shields.io/badge/MCP-compatible-green.svg)](https://modelcontextprotocol.io/)\n[![Typed](https://img.shields.io/badge/typed-py.typed-blue.svg)](https://peps.python.org/pep-0561/)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)\n[![Tools: 137](https://img.shields.io/badge/MCP_tools-132%2B-brightgreen.svg)](#available-tools-132)\n[![GitHub stars](https://img.shields.io/github/stars/bintocher/mcp-superset.svg?style=social)](https://github.com/bintocher/mcp-superset)\n\nA comprehensive [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for [Apache Superset](https://superset.apache.org/). Gives AI assistants (Claude, GPT, etc.) full control over your Superset instance — dashboards, charts, datasets, SQL Lab, users, roles, RLS, and more — through 137 tools.\n\n## Comparison with Other Superset MCP Servers\n\n| Feature | **mcp-superset** | [superset-mcp](https://github.com/aptro/superset-mcp) | [superset-mcp (Winding2020)](https://github.com/Winding2020/superset-mcp) | [superset-mcp-server](https://github.com/LiusCraft/superset-mcp-server) |\n|---------|:-:|:-:|:-:|:-:|\n| **Total tools** | **137** | 60 | 31 | 4 |\n| Language | Python | Python | TypeScript | TypeScript |\n| Dashboard CRUD | 15 tools | 5 | 8 | - |\n| Dashboard native filters | **5 tools** | - | - | - |\n| Chart CRUD | 11 tools | 5 | 7 | - |\n| Database tools | 18 tools | 14 | 1 | 1 |\n| Dataset tools | 11 tools | 3 | 7 | - |\n| SQL Lab | 5 tools | 7 | 1 | 1 |\n| **Security (users/roles)** | **26 tools** | 2 | - | - |\n| **Row Level Security** | **5 tools** | - | - | - |\n| **Groups** | **9 tools** | - | - | - |\n| **Permissions audit** | **yes** | - | - | - |\n| **Dashboard access grant/revoke** | **yes** | - | - | - |\n| **Auto datasource_access sync** | **yes** | - | - | - |\n| Reports & annotations | 10 tools | - | - | - |\n| Tags | 7 tools | 7 | - | - |\n| Asset export/import | yes | - | - | - |\n| **Safety: confirmation flags** | **14 types** | - | - | - |\n| **Safety: DDL/DML blocking** | **yes** | - | - | - |\n| **Safety: system role protection** | **yes** | - | - | - |\n| Transport | HTTP, SSE, stdio | stdio | stdio | stdio |\n| Auth method | JWT + auto-refresh + CSRF | Username/password + token file | Username/password or token | LDAP |\n| Superset versions | 6.0.1 | 4.1.1 | not specified | not specified |\n| CLI with args | `--host --port --transport` | - | - | - |\n| PyPI package | `mcp-superset` | `superset-mcp` | `superset-mcp` (npm) | - |\n| uvx support | **yes** | - | - | - |\n| License | MIT | MIT | - | Apache 2.0 |\n| GitHub stars | new | 170 | 21 | 5 |\n\n**Key differentiators:**\n- Only MCP server with **full security management** (users, roles, RLS, groups, permissions audit)\n- Only one with **built-in safety validations** (confirmation flags, DDL/DML blocking)\n- Only one with **dashboard native filter management**\n- Only one with **automatic datasource_access synchronization**\n- Only one with **multiple transport options** (HTTP, SSE, stdio)\n- Only one with **configurable CLI** (`--host`, `--port`, `--transport`, `--env-file`)\n\n## Features\n\n- **137 MCP tools** covering the complete Superset REST API\n- **Dashboard management** — CRUD, copy, publish/unpublish, export/import, embedded mode, native filters\n- **Chart management** — CRUD, copy, data retrieval, export/import, cache warmup\n- **Database management** — CRUD, connection testing, schema/table introspection, SQL validation\n- **Dataset management** — CRUD, duplicate, schema refresh, export/import\n- **SQL Lab** — query execution, formatting, cost estimation, results & CSV export\n- **Security** — users, roles, permissions, Row Level Security (RLS), groups\n- **Access control automation** — grant/revoke dashboard access with automatic datasource permission sync\n- **Audit** — comprehensive permissions matrix (user x dashboards x datasets x RLS)\n- **Tags, reports, annotations, saved queries** — full CRUD\n- **Asset export/import** — full instance backup and restore\n- **Built-in safety** — confirmation flags for destructive operations, DDL/DML blocking in SQL Lab\n- **JWT authentication** with automatic token refresh and CSRF handling\n- **Streamable HTTP, SSE, and stdio transports**\n\n## Quick Start\n\n### Installation\n\n```bash\n# From PyPI\npip install mcp-superset\n\n# With uv (recommended)\nuv pip install mcp-superset\n\n# Run without installing (uvx)\nuvx mcp-superset\n```\n\n### Configuration\n\nCreate a `.env` file in the current directory, or set environment variables:\n\n```env\n# Required\nSUPERSET_BASE_URL=https://superset.example.com\nSUPERSET_USERNAME=admin\nSUPERSET_PASSWORD=your_password\n\n# Optional\nSUPERSET_AUTH_PROVIDER=db          # db (default) or ldap\nSUPERSET_MCP_HOST=127.0.0.1       # Server host (default: 127.0.0.1)\nSUPERSET_MCP_PORT=8001             # Server port (default: 8001)\nSUPERSET_MCP_TRANSPORT=streamable-http  # streamable-http (default), sse, or stdio\n```\n\n#### Session-cookie authentication (SSO/OAuth)\n\nWhen Superset is behind SSO (OAuth/OIDC/SAML), password login via the REST\nAPI is unavailable. Instead, supply a browser **session cookie**:\n\n| Variable | Description |\n| --- | --- |\n| `SUPERSET_SESSION_COOKIE` | Session cookie value copied from your browser. When set, this mode is used instead of username/password. |\n| `SUPERSET_SESSION_COOKIE_NAME` | Cookie name. Defaults to `session`. |\n\nCopy the cookie from your browser's dev tools (Application → Cookies →\nyour Superset domain → `session`). The MCP server sends it on every request\nand fetches CSRF tokens with it. The session cannot be renewed server-side,\nso when it expires you must paste a fresh value and restart the server.\n\nTwo things worth checking before you use this mode:\n\n- **The cookie name is not always `session`.** Instances that set\n  `SESSION_COOKIE_NAME` in `superset_config.py` use a different name (`s`, for\n  example). Use the name shown in dev tools and set `SUPERSET_SESSION_COOKIE_NAME`\n  accordingly.\n- **The instance must accept session authentication on `/api/v1/`.** Where the\n  REST API is configured for JWT only, requests carrying a valid session cookie\n  still return `401 {\"msg\": \"Missing Authorization Header\"}` - refreshing the\n  cookie will not help, and JWT mode is the only option there.\n\nTreat the cookie as a credential: it grants full access to your Superset\naccount for the lifetime of the session. Keep it in `.env` (which is\ngitignored), not in shell history or committed config.\n\n### Running\n\n```bash\n# Using CLI (after pip install)\nmcp-superset\n\n# Run without installing\nuvx mcp-superset\n\n# Using Python module\npython -m mcp_superset\n\n# With uv from source\nuv run mcp-superset\n\n# With custom settings\nmcp-superset --host 0.0.0.0 --port 9000 --transport sse\n\n# With custom .env file\nmcp-superset --env-file /path/to/.env\n\n# Using stdio transport (for Claude Desktop, Cursor, etc.)\nmcp-superset --transport stdio\n```\n\n### CLI Options\n\n| Option | Default | Env Variable | Description |\n|--------|---------|-------------|-------------|\n| `--host` | `127.0.0.1` | `SUPERSET_MCP_HOST` | Server bind address |\n| `--port` | `8001` | `SUPERSET_MCP_PORT` | Server bind port |\n| `--transport` | `streamable-http` | `SUPERSET_MCP_TRANSPORT` | Transport: `streamable-http`, `sse`, `stdio` |\n| `--env-file` | auto-detect | — | Path to `.env` file |\n| `--version` | — | — | Show version and exit |\n\n### Connecting to MCP Clients\n\n#### Claude Code\n\nAdd to your project's `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"superset\": {\n      \"type\": \"http\",\n      \"url\": \"http://localhost:8001/mcp\"\n    }\n  }\n}\n```\n\nThen start the server: `mcp-superset` or `uvx mcp-superset`.\n\n#### Claude Desktop\n\nAdd to `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"superset\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-superset\", \"--transport\", \"stdio\"],\n      \"env\": {\n        \"SUPERSET_BASE_URL\": \"https://superset.example.com\",\n        \"SUPERSET_USERNAME\": \"admin\",\n        \"SUPERSET_PASSWORD\": \"your_password\"\n      }\n    }\n  }\n}\n```\n\n#### Cursor / Windsurf\n\n```json\n{\n  \"mcpServers\": {\n    \"superset\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-superset\", \"--transport\", \"stdio\"],\n      \"env\": {\n        \"SUPERSET_BASE_URL\": \"https://superset.example.com\",\n        \"SUPERSET_USERNAME\": \"admin\",\n        \"SUPERSET_PASSWORD\": \"your_password\"\n      }\n    }\n  }\n}\n```\n\n#### Other MCP Clients\n\nAny MCP-compatible client can connect via:\n- **Streamable HTTP**: `http://<host>:<port>/mcp`\n- **SSE**: `http://<host>:<port>/sse`\n- **stdio**: pipe to `mcp-superset --transport stdio`\n\n## Available Tools (137)\n\n### Dashboards (15 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_dashboard_list` | List dashboards with filtering and pagination |\n| `superset_dashboard_get` | Get dashboard details by ID |\n| `superset_dashboard_create` | Create a new dashboard |\n| `superset_dashboard_update` | Update dashboard properties |\n| `superset_dashboard_delete` | Delete a dashboard (requires confirmation) |\n| `superset_dashboard_copy` | Duplicate a dashboard |\n| `superset_dashboard_publish` | Publish a draft dashboard |\n| `superset_dashboard_unpublish` | Unpublish a dashboard |\n| `superset_dashboard_charts` | List charts in a dashboard |\n| `superset_dashboard_datasets` | List datasets used by a dashboard |\n| `superset_dashboard_export` | Export dashboard as ZIP (base64) |\n| `superset_dashboard_import` | Import dashboard from ZIP file |\n| `superset_dashboard_embedded_get` | Get embedded configuration |\n| `superset_dashboard_embedded_set` | Enable embedded mode with allowed domains |\n| `superset_dashboard_embedded_delete` | Disable embedded mode |\n\n### Dashboard Filters (5 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_dashboard_filter_list` | List native filters on a dashboard |\n| `superset_dashboard_filter_add` | Add a native filter (auto-generates correct ID format) |\n| `superset_dashboard_filter_update` | Update an existing native filter |\n| `superset_dashboard_filter_delete` | Remove a native filter (requires confirmation) |\n| `superset_dashboard_filter_reset` | Remove all filters (requires confirmation) |\n\n### Charts (11 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_chart_list` | List charts with filtering and pagination |\n| `superset_chart_get` | Get chart details by ID |\n| `superset_chart_create` | Create a new chart |\n| `superset_chart_update` | Update chart properties |\n| `superset_chart_delete` | Delete a chart (requires confirmation) |\n| `superset_chart_copy` | Duplicate a chart |\n| `superset_chart_data` | Execute chart query and get data |\n| `superset_chart_get_data` | Get data from a saved chart |\n| `superset_chart_export` | Export chart as ZIP (base64) |\n| `superset_chart_import` | Import chart from ZIP file |\n| `superset_chart_cache_warmup` | Warm up chart cache |\n\n### Databases (18 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_database_list` | List database connections |\n| `superset_database_get` | Get database details |\n| `superset_database_create` | Register a new database connection |\n| `superset_database_update` | Update database settings |\n| `superset_database_delete` | Remove a database (requires confirmation) |\n| `superset_database_test_connection` | Test database connectivity |\n| `superset_database_schemas` | List schemas in a database |\n| `superset_database_tables` | List tables in a schema |\n| `superset_database_catalogs` | List catalogs (for multi-catalog databases) |\n| `superset_database_connection_info` | Get connection string info |\n| `superset_database_function_names` | List available SQL functions |\n| `superset_database_related_objects` | Find charts/datasets using this database |\n| `superset_database_validate_sql` | Validate SQL syntax |\n| `superset_database_validate_parameters` | Validate connection parameters |\n| `superset_database_select_star` | Generate SELECT * query for a table |\n| `superset_database_table_metadata` | Get table column and index metadata |\n| `superset_database_export` | Export database config as ZIP |\n| `superset_database_available_engines` | List supported database engines |\n\n### Datasets (11 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_dataset_list` | List datasets with filtering |\n| `superset_dataset_get` | Get dataset details including columns and metrics |\n| `superset_dataset_create` | Create a dataset from a table or SQL query |\n| `superset_dataset_update` | Update dataset properties |\n| `superset_dataset_delete` | Delete a dataset (requires confirmation) |\n| `superset_dataset_duplicate` | Duplicate a dataset |\n| `superset_dataset_refresh_schema` | Refresh columns from source |\n| `superset_dataset_related_objects` | Find charts using this dataset |\n| `superset_dataset_export` | Export dataset as ZIP |\n| `superset_dataset_import` | Import dataset from ZIP |\n| `superset_dataset_get_or_create` | Get existing or create new dataset |\n\n### SQL Lab & Queries (13 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_sqllab_execute` | Execute a SQL query (SELECT only) |\n| `superset_sqllab_format_sql` | Format/beautify SQL |\n| `superset_sqllab_results` | Fetch results of a completed query |\n| `superset_sqllab_estimate_cost` | Estimate query execution cost |\n| `superset_sqllab_export_csv` | Export query results as CSV |\n| `superset_query_list` | List executed queries |\n| `superset_query_get` | Get query details and results |\n| `superset_query_stop` | Stop a running query |\n| `superset_saved_query_list` | List saved queries |\n| `superset_saved_query_create` | Save a new query |\n| `superset_saved_query_get` | Get saved query details |\n| `superset_saved_query_update` | Update a saved query |\n| `superset_saved_query_delete` | Delete a saved query (requires confirmation) |\n\n### Security & Access Control (26 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_get_current_user` | Get current authenticated user info |\n| `superset_get_current_user_roles` | Get roles of current user |\n| `superset_user_list` | List users with filtering |\n| `superset_user_get` | Get user details |\n| `superset_user_create` | Create a new user |\n| `superset_user_update` | Update user properties |\n| `superset_user_delete` | Delete a user (requires confirmation) |\n| `superset_role_list` | List roles |\n| `superset_role_get` | Get role details |\n| `superset_role_create` | Create a new role |\n| `superset_role_update` | Update role name/description |\n| `superset_role_delete` | Delete a role (requires confirmation, blocks system roles) |\n| `superset_permission_list` | List all available permissions |\n| `superset_role_permissions_get` | Get permissions assigned to a role |\n| `superset_role_permission_add` | Set role permissions (full replacement, requires confirmation) |\n| `superset_role_copy_permissions` | Copy all permissions from one role to another |\n| `superset_dashboard_grant_role_access` | Grant a role access to dashboard and its datasets |\n| `superset_dashboard_revoke_role_access` | Revoke a role's access to dashboard datasets |\n| `superset_bulk_user_role_add` | Add a role to multiple users (by IDs or by current role) |\n| `superset_bulk_user_role_remove` | Remove a role from multiple users |\n| `superset_bulk_user_role_replace` | Replace one role with another for all matching users |\n| `superset_rls_list` | List Row Level Security rules |\n| `superset_rls_get` | Get RLS rule details |\n| `superset_rls_create` | Create an RLS rule |\n| `superset_rls_update` | Update an RLS rule (requires both roles and tables) |\n| `superset_rls_delete` | Delete an RLS rule (requires confirmation) |\n\n### Groups (9 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_group_list` | List groups |\n| `superset_group_get` | Get group details with members and roles |\n| `superset_group_create` | Create a new group |\n| `superset_group_update` | Update group name |\n| `superset_group_delete` | Delete a group |\n| `superset_group_add_users` | Add users to a group |\n| `superset_group_remove_users` | Remove users from a group |\n| `superset_group_add_roles` | Add roles to a group |\n| `superset_group_remove_roles` | Remove roles from a group |\n\n### Tags (7 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_tag_list` | List tags |\n| `superset_tag_get` | Get tag details |\n| `superset_tag_create` | Create a tag (optionally bind to objects) |\n| `superset_tag_update` | Update a tag |\n| `superset_tag_delete` | Delete a tag (requires confirmation) |\n| `superset_tag_get_objects` | List objects associated with a tag |\n| `superset_tag_bulk_create` | Create multiple tags at once |\n\n### System & Reports (21 tools)\n\n| Tool | Description |\n|------|-------------|\n| `superset_report_list` | List scheduled reports |\n| `superset_report_get` | Get report details |\n| `superset_report_create` | Create a scheduled report |\n| `superset_report_update` | Update a report |\n| `superset_report_delete` | Delete a report (requires confirmation) |\n| `superset_annotation_layer_list` | List annotation layers |\n| `superset_annotation_layer_get` | Get annotation layer details |\n| `superset_annotation_layer_create` | Create an annotation layer |\n| `superset_annotation_layer_update` | Update an annotation layer |\n| `superset_annotation_layer_delete` | Delete an annotation layer (requires confirmation) |\n| `superset_annotation_list` | List annotations in a layer |\n| `superset_annotation_get` | Get annotation details |\n| `superset_annotation_create` | Create an annotation |\n| `superset_annotation_update` | Update an annotation |\n| `superset_annotation_delete` | Delete an annotation (requires confirmation) |\n| `superset_recent_activity` | Get recent user activity |\n| `superset_log_list` | Get audit logs |\n| `superset_get_menu` | Get Superset menu structure |\n| `superset_get_base_url` | Get configured Superset base URL |\n| `superset_assets_export` | Export all Superset assets as ZIP |\n| `superset_assets_import` | Import assets from ZIP file |\n\n### Audit (1 tool)\n\n| Tool | Description |\n|------|-------------|\n| `superset_permissions_audit` | Generate comprehensive permissions matrix |\n\n## Safety Features\n\nThe server includes extensive built-in protections to prevent accidental data loss or misconfiguration.\n\n### Confirmation Flags\n\nDestructive operations require explicit confirmation parameters:\n\n| Operation | Required Flag | What It Shows |\n|-----------|--------------|---------------|\n| Delete dashboard | `confirm_delete=True` | Dashboard name, slug, chart count |\n| Delete chart | `confirm_delete=True` | Linked dashboards |\n| Delete dataset | `confirm_delete=True` | Affected charts and dashboards |\n| Delete database | `confirm_delete=True` | Affected datasets, charts |\n| Delete RLS rule | `confirm_delete=True` | Clause, roles, datasets |\n| Delete role | `confirm_delete=True` | Blocks system roles |\n| Delete user | `confirm_delete=True` | Blocks service account deletion |\n| Update chart params | `confirm_params_replace=True` | — |\n| Update dataset columns | `confirm_columns_replace=True` | — |\n| Update database URI | `confirm_uri_change=True` | Affected charts/dashboards |\n| Update user roles | `confirm_roles_replace=True` | Current roles |\n| Set role permissions | `confirm_full_replace=True` | — |\n| Grant dashboard access | `confirm_grant=True` | Dry-run results |\n| Revoke dashboard access | `confirm_revoke=True` | Dry-run results |\n| Bulk add role to users | `confirm=True` | User count, sample list |\n| Bulk remove role from users | `confirm=True` | User count, prevents last role removal |\n| Bulk replace role | `confirm=True` | Old/new role names, user count |\n| Copy role permissions | `confirm=True` | Source/target permission counts |\n\n### Automatic Protections\n\n- **DDL/DML blocking** — SQL Lab rejects `DROP`, `DELETE`, `UPDATE`, `INSERT`, `TRUNCATE`, `ALTER`, `CREATE`, `GRANT`, `REVOKE` (SQL comments are stripped before checking)\n- **System role protection** — cannot delete Admin, Alpha, Gamma, Public roles\n- **Service account protection** — cannot delete the MCP service user\n- **RLS safety** — `rls_update` requires both `roles` and `tables` to prevent silent data wipe\n- **Native filter IDs** — automatically generated in `NATIVE_FILTER-<uuid>` format\n- **Chart validation** — rejects charts without `granularity_sqla` (required for dashboard time filters)\n- **Auto-sync** — datasource_access permissions are automatically synchronized when dashboard roles change\n\n## Architecture\n\n```\nsuperset-mcp/\n├── pyproject.toml              # Package configuration\n├── .env.example                # Environment variable template\n├── LICENSE                     # MIT License\n├── README.md                   # This file\n├── README_RU.md                # Russian documentation\n├── CHANGELOG.md                # Version history\n└── src/mcp_superset/\n    ├── __init__.py             # Package init with __version__\n    ├── __main__.py             # CLI entry point with argparse\n    ├── server.py               # FastMCP server setup and configuration\n    ├── auth.py                 # JWT authentication (login, refresh, CSRF)\n    ├── client.py               # HTTP client (auto-auth, retry, RISON pagination)\n    ├── models.py               # Pydantic models\n    └── tools/\n        ├── __init__.py         # register_all_tools()\n        ├── helpers.py          # Auto-sync datasource_access logic\n        ├── dashboards.py       # Dashboard + filter tools (20)\n        ├── charts.py           # Chart tools (11)\n        ├── databases.py        # Database tools (18)\n        ├── datasets.py         # Dataset tools (11)\n        ├── queries.py          # SQL Lab + saved query tools (13)\n        ├── security.py         # User, role, permission, RLS, bulk operations (26)\n        ├── groups.py           # Group management tools (9)\n        ├── audit.py            # Permissions audit tool (1)\n        ├── tags.py             # Tag tools (7)\n        └── system.py           # Reports, annotations, logs, assets (21)\n```\n\n## Superset Compatibility\n\n- **Tested with**: Apache Superset 6.0.1\n- **Authentication**: JWT (recommended) — API Key (`sst_*`) is not implemented in Superset\n- **Required Superset user**: Admin role (for full API access)\n\n### Recommended Superset Configuration\n\nAdd to your `superset_config.py`:\n\n```python\nfrom datetime import timedelta\n\n# Increase JWT token lifetime (default is 15 min)\nJWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=1)\nJWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30)\n\n# Max API page size\nFAB_API_MAX_PAGE_SIZE = 100\n```\n\n## Development\n\n### Setup\n\n```bash\ngit clone https://github.com/bintocher/mcp-superset.git\ncd superset-mcp\n\n# Create virtual environment and install in editable mode\nuv venv\nuv pip install -e \".[dev]\"\n\n# Copy and configure .env\ncp .env.example .env\n# Edit .env with your Superset credentials\n```\n\n### Running Locally\n\n```bash\n# Run from source\nuv run python -m mcp_superset\n\n# Or with CLI\nuv run mcp-superset --port 8001\n```\n\n### Running Tests\n\n```bash\nuv run python test_all_tools.py\n```\n\n## Known Superset API Quirks\n\nThese are handled automatically by the MCP server, but useful to know when debugging:\n\n| Quirk | Details |\n|-------|---------|\n| RISON pagination | Superset ignores `page`/`page_size` as query params; must use RISON in `q` parameter |\n| CSRF required | All POST/PUT/DELETE need `X-CSRFToken` header + session cookie |\n| Referer required | SQL Lab returns 403 without `Referer` header |\n| Tag API returns `{}` | Tag creation doesn't return the ID; must query list |\n| Tag update needs `name` | Field is mandatory even if unchanged |\n| Role permissions replace | `POST /security/roles/{id}/permissions` replaces ALL permissions |\n| RLS update replaces | `PUT /rowlevelsecurity/{id}` replaces ALL provided fields |\n| Dataset update columns | `PUT /dataset/{id}` with `columns` replaces ALL columns |\n| Dashboard copy | Requires `json_metadata` (can be `\"{}\"`) |\n| Native filter IDs | Must be `NATIVE_FILTER-<uuid>` format |\n| `filter_time` needs `granularity_sqla` | Charts without it silently ignore time filters |\n| Number formatting | `SMART_NUMBER` abbreviates; use `,d` or `,.2f` for exact |\n\n## License\n\n[MIT](LICENSE) — Stanislav Chernov ([@bintocher](https://github.com/bintocher))\n",
  "bytes": 25358,
  "sha": "c1937a49fba04c035faa06e211c6885e3c5a686e385a8080fd59ecf365c2af7a",
  "repo_slug": "bintocher/mcp-superset",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_bintocher_mcp_superset_89992d2d/readme"
}