Skip to main content

A comprehensive toolkit for working with Hex: SDK, CLI, and MCP integration

Project description

Hex Toolkit

A comprehensive toolkit for working with Hex - includes Python SDK, CLI, and MCP integration for Claude.

Features

  • 🐍 Simple, Pythonic interface - Easy to use with clear method names
  • 🔧 Complete API coverage - Projects, runs, and more
  • 🤖 MCP Support - Use Hex directly in Claude Desktop and Claude Code
  • 📦 Minimal dependencies - Built on httpx for reliability
  • 🔐 Secure - API key authentication with environment variable support

Installation

# Basic installation
pip install hex-toolkit

# With CLI support
pip install "hex-toolkit[cli]"

# With MCP (Model Context Protocol) support
pip install "hex-toolkit[mcp]"

# Install everything
pip install "hex-toolkit[all]"

Quick Start

from hex_toolkit import HexClient

# Initialize the client
client = HexClient(api_key="your-api-key")

# List all projects
projects = client.projects.list()
for project in projects["values"]:
    print(f"{project['title']} - {project['id']}")

# Get a specific project
project = client.projects.get("project-id")
print(project["title"])

# Run a project
run = client.projects.run(
    project_id="project-id",
    input_params={"param1": "value1"}
)
print(f"Run started: {run['runId']}")

# Check run status
status = client.runs.get_status(project_id="project-id", run_id=run["runId"])
print(f"Status: {status['status']}")

Configuration

The client can be configured via environment variables:

export HEX_API_KEY="your-api-key"
export HEX_API_BASE_URL="https://app.hex.tech/api"  # Optional

Or directly in code:

client = HexClient(
    api_key="your-api-key",
    base_url="https://custom.hex.tech/api",
    timeout=60.0
)

Usage Examples

Working with Projects

# List projects with filters
projects = client.projects.list(
    limit=50,
    include_archived=False,
    creator_email="user@example.com"
)

# Access project data - all fields use camelCase like the API
for project in projects["values"]:
    print(f"ID: {project['id']}")
    print(f"Title: {project['title']}")
    print(f"Type: {project['type']}")  # "PROJECT" or "COMPONENT"
    print(f"Created: {project['createdAt']}")
    print(f"Last edited: {project['lastEditedAt']}")

Pagination

# List projects with pagination
after_cursor = None
all_projects = []

while True:
    response = client.projects.list(limit=100, after=after_cursor)
    all_projects.extend(response["values"])

    # Check if there are more pages
    pagination = response.get("pagination", {})
    after_cursor = pagination.get("after")
    if not after_cursor:
        break

print(f"Found {len(all_projects)} projects total")

Running Projects

# Simple run
run = client.projects.run("project-id")

# Run with parameters
run = client.projects.run(
    project_id="project-id",
    input_params={
        "date_start": "2024-01-01",
        "date_end": "2024-01-31",
        "metric": "revenue"
    },
    update_published_results=True
)

# Run with notifications
run = client.projects.run(
    project_id="project-id",
    notifications=[{
        "type": "ALL",
        "includeSuccessScreenshot": True,
        "slackChannelIds": ["C0123456789"],
    }]
)

Monitoring Runs

import time

# Wait for completion
run_id = run["runId"]
project_id = run["projectId"]

while True:
    status = client.runs.get_status(project_id, run_id)
    print(f"Status: {status['status']}")

    if status["status"] in ["COMPLETED", "ERRORED", "KILLED"]:
        print(f"Run finished with status: {status['status']}")
        if status.get("elapsedTime"):
            print(f"Elapsed time: {status['elapsedTime']}ms")
        break

    time.sleep(5)

Error Handling

from hex_toolkit.exceptions import (
    HexAPIError,
    HexAuthenticationError,
    HexNotFoundError,
    HexRateLimitError
)

try:
    project = client.projects.get("invalid-id")
except HexNotFoundError as e:
    print(f"Project not found: {e.message}")
except HexAuthenticationError:
    print("Invalid API key")
except HexRateLimitError as e:
    print(f"Rate limited. Retry after: {e.retry_after} seconds")
except HexAPIError as e:
    print(f"API error: {e.message}")
    print(f"Status code: {e.status_code}")
    print(f"Trace ID: {e.trace_id}")

Creating Embedded URLs

# Create a basic embedded URL
embed = client.embedding.create_presigned_url("project-id")
print(f"Embed URL: {embed['url']}")

# Create with options
embed = client.embedding.create_presigned_url(
    project_id="project-id",
    expires_in=300000,  # 5 minutes
    input_parameters={"filter": "Q1"},
    display_options={
        "theme": "dark",
        "noEmbedFooter": True
    }
)

MCP (Model Context Protocol) Support

The SDK includes built-in MCP support for using Hex directly within Claude Desktop and Claude Code. Learn more about MCP.

Quick Setup

# Install the MCP server
hex mcp install

# Check installation status
hex mcp status

# Use in Claude - look for the 🔧 icon!

See the MCP documentation for detailed setup and usage instructions.

API Resources

Projects

  • client.projects.list(**filters) - List all projects
  • client.projects.get(project_id) - Get a specific project
  • client.projects.run(project_id, **options) - Run a project

Runs

  • client.runs.get_status(project_id, run_id) - Get run status
  • client.runs.list(project_id, **filters) - List runs for a project
  • client.runs.cancel(project_id, run_id) - Cancel a run

Embedding

  • client.embedding.create_presigned_url(project_id, **options) - Create embedded URL

Semantic Models

  • client.semantic_models.ingest(semantic_model_id, **options) - Ingest semantic model

Response Format

All methods return plain Python dictionaries matching the Hex API response format:

# Project dict structure
project = {
    "id": "12345678-1234-1234-1234-123456789012",
    "title": "Sales Dashboard",
    "type": "PROJECT",
    "createdAt": "2024-01-01T00:00:00Z",
    "lastEditedAt": "2024-01-15T12:30:00Z",
    "creator": {"email": "user@example.com"},
    "owner": {"email": "user@example.com"},
    # ... other fields
}

# Run response structure
run = {
    "projectId": "12345678-1234-1234-1234-123456789012",
    "runId": "87654321-4321-4321-4321-210987654321",
    "runUrl": "https://app.hex.tech/app/runs/...",
    "runStatusUrl": "https://app.hex.tech/api/v1/projects/.../runs/...",
    # ... other fields
}

Development

Setup

# Install with development dependencies using uv
uv pip install -e ".[dev]"

# Run tests
uv run pytest

# Run linting
uv run ruff format src tests
uv run ruff check src tests

Running Tests

# Run all tests
uv run pytest

# Run with coverage
uv run pytest --cov=src/hex_toolkit

# Run specific test file
uv run pytest tests/test_client.py

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests
  5. Submit a pull request

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hex_toolkit-0.1.0.tar.gz (86.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hex_toolkit-0.1.0-py3-none-any.whl (30.3 kB view details)

Uploaded Python 3

File details

Details for the file hex_toolkit-0.1.0.tar.gz.

File metadata

  • Download URL: hex_toolkit-0.1.0.tar.gz
  • Upload date:
  • Size: 86.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.3

File hashes

Hashes for hex_toolkit-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ad0b29d15bb99cc1b0ad250cc232d43a8679b5964381ab6ece29116705248569
MD5 85e29ea232926f7a41337f6c3f3bd170
BLAKE2b-256 da694b77c6d48c7b3937d2bcf0c8c1404c6b3bb77e482d14bd7096747b612928

See more details on using hashes here.

File details

Details for the file hex_toolkit-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for hex_toolkit-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c4a576e1e86e75a188baef6936a6302ec179dd4a7291acd0767248c86c53df89
MD5 49d0dd4647da68f7c6694232fca59af1
BLAKE2b-256 b2b750bc06cd5b62b4bb30a0dbb08b398de63abc179270c22c21ff51a6be5196

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page