Hex MCP

Un servidor para listar, buscar, ejecutar y gestionar proyectos de Hex.

Documentación

Servidor MCP hex-mcp

Un servidor MCP para Hex que implementa herramientas de orquestación, monitoreo, acceso a contenido de celdas, gestión de permisos, organización de colecciones y gestión de grupos.

Qué Hace (Y Qué No Hace)

Casos de Uso Prácticos

Orquestación y Automatización:

  • Ejecutar proyectos de Hex desde sistemas externos (DAGs de Airflow, pipelines de CI/CD)
  • Monitorear el estado de ejecuciones programáticamente
  • Cancelar ejecuciones de larga duración o bloqueadas
  • Descubrir y buscar proyectos entre espacios de trabajo

Monitoreo Operacional:

  • Verificar si las ejecuciones programadas se completaron correctamente
  • Obtener historial de ejecuciones para auditoría
  • Acceso programático a metadatos de proyectos (propietario, última edición, descripción)

Acceso a Contenido de Celdas (NUEVO):

  • Leer estructura de notebooks y metadatos de celdas
  • Leer código fuente de consultas SQL desde celdas SQL
  • Leer código Python/R desde celdas CODE
  • Útil para migración de consultas, análisis de código y auditoría de contenido

Gestión de Permisos (NUEVO):

  • Gestionar programáticamente el acceso de usuarios y grupos a proyectos
  • Actualizar permisos en lote entre múltiples proyectos
  • Gestionar configuraciones de acceso público y de todo el espacio de trabajo
  • Agregar o eliminar proyectos de colecciones

Organización de Colecciones (NUEVO):

  • Crear y gestionar colecciones para organizar proyectos
  • Organizar proyectos por departamento, equipo o tema
  • Controlar la visibilidad y el acceso de las colecciones
  • Organizar proyectos en colecciones en lote

Gestión de Grupos (NUEVO):

  • Crear y gestionar grupos de usuarios para la gestión de permisos
  • Agregar y eliminar usuarios de grupos en lote
  • Usar grupos para simplificar la gestión de permisos entre proyectos
  • Mantener estructuras de equipo organizadas

Gestión de Conexiones de Datos (NUEVO):

  • Listar y gestionar conexiones de bases de datos y almacenes de datos
  • Crear conexiones para BigQuery, Snowflake, Postgres, Redshift, Athena, Databricks
  • Actualizar configuraciones y credenciales de conexiones
  • Controlar el uso compartido de conexiones de datos en el espacio de trabajo

Limitaciones Críticas

Acceso limitado al contenido de notebooks:

  • ✅ Puede leer contenido de celdas SQL y CODE
  • ❌ No puede leer celdas MARKDOWN, INPUT o de visualización
  • ❌ No puede crear ni eliminar celdas
  • ❌ No puede modificar la estructura del notebook
  • ❌ No puede ver resultados de consultas ni gráficos
  • ❌ No puede gestionar dependencias ni parámetros del notebook

No es adecuado para:

  • Construir o crear notebooks desde cero
  • Desarrollo colaborativo de notebooks
  • Depurar consultas o ejecución de código
  • Copia de seguridad completa de notebooks (solo celdas SQL/CODE accesibles)
  • Leer documentación en markdown o parámetros de entrada

Cuándo Usar Esto

Use hex-mcp cuando necesite:

  • Orquestar ejecuciones de Hex desde sistemas externos
  • Monitorear estado e historial de ejecuciones
  • Leer consultas SQL y código de notebooks existentes
  • Auditar o migrar contenido SQL/CODE entre proyectos
  • Gestionar permisos y control de acceso entre proyectos
  • Automatizar actualizaciones de permisos en lote para usuarios, grupos y colecciones
  • Organizar proyectos en colecciones por departamento, equipo o tema
  • Mantener grupos de usuarios para simplificar la gestión de permisos
  • Estandarizar la organización del espacio de trabajo en su instancia de Hex
  • Gestionar conexiones de datos e integraciones de bases de datos programáticamente
  • Automatizar la configuración de conexiones para nuevos espacios de trabajo o entornos

Para desarrollo y edición completa de notebooks, use directamente la interfaz web de Hex.

Herramientas Disponibles

Operaciones de Proyectos

  • list_hex_projects: Lista los proyectos de Hex disponibles
  • search_hex_projects: Busca proyectos de Hex por patrón
  • get_hex_project: Obtiene información detallada sobre un proyecto específico

Ejecución de Proyectos

  • run_hex_project: Ejecuta un proyecto de Hex
  • get_hex_run_status: Verifica el estado de una ejecución de proyecto
  • get_hex_project_runs: Obtiene el historial de ejecuciones de proyectos
  • cancel_hex_run: Cancela un proyecto en ejecución

Operaciones de Celdas (NUEVO)

  • list_hex_cells: Lista todas las celdas de un proyecto con código fuente para celdas SQL/CODE
  • update_hex_cell: Actualiza el código fuente y/o la conexión de datos de celdas SQL o CODE

Gestión de Permisos (NUEVO)

  • update_hex_project_user_sharing: Otorga o revoca acceso de usuarios a proyectos
  • update_hex_project_group_sharing: Otorga o revoca acceso de grupos a proyectos
  • update_hex_project_collection_sharing: Agrega o elimina proyectos de colecciones
  • update_hex_project_workspace_sharing: Actualiza el acceso público y de todo el espacio de trabajo

Gestión de Colecciones (NUEVO)

  • list_hex_collections: Lista todas las colecciones del espacio de trabajo
  • get_hex_collection: Obtiene información detallada sobre una colección específica
  • create_hex_collection: Crea una nueva colección con configuraciones de uso compartido opcionales
  • update_hex_collection: Actualiza nombre, descripción o configuraciones de uso compartido de la colección

Gestión de Grupos (NUEVO)

  • list_hex_groups: Lista todos los grupos del espacio de trabajo
  • get_hex_group: Obtiene información detallada sobre un grupo específico
  • create_hex_group: Crea un nuevo grupo con miembros iniciales opcionales
  • update_hex_group: Actualiza el nombre del grupo y/o la membresía (agregar/eliminar usuarios)
  • delete_hex_group: Elimina un grupo del espacio de trabajo

Gestión de Conexiones de Datos (NUEVO)

  • list_hex_data_connections: Lista todas las conexiones de datos del espacio de trabajo
  • get_hex_data_connection: Obtiene información detallada sobre una conexión de datos específica
  • create_hex_data_connection: Crea una nueva conexión de base de datos/almacén de datos
  • update_hex_data_connection: Actualiza configuración, credenciales o uso compartido de la conexión

Instalación

Usar uv es la forma recomendada de instalar hex-mcp:

uv add hex-mcp

O usando pip:

pip install hex-mcp

Para confirmar que funciona, puede ejecutar:

hex-mcp --version

Configuración

Usando el comando de configuración (recomendado)

La forma más fácil de configurar hex-mcp es usando el comando config y pasando su clave de API y URL de API (opcional, con valor predeterminado https://app.hex.tech/api/v1):

hex-mcp config --api-key "your_hex_api_key" --api-url "https://app.hex.tech/api/v1"

[!NOTA] Esto guarda su configuración en un archivo en su directorio de inicio (por ejemplo, ~/.hex-mcp/config.yml), haciéndola disponible para todas las invocaciones de hex-mcp.

Usando variables de entorno

Alternativamente, el servidor MCP de Hex se puede configurar con variables de entorno:

  • HEX_API_KEY: Su clave de API de Hex
  • HEX_API_URL: La URL base de la API de Hex

Al configurar variables de entorno para servidores MCP, deben ser globales para que Cursor las detecte, o usar la bandera --env-file de uv al invocar el servidor.

Uso con Cursor

Cursor permite que los agentes de IA interactúen con Hex mediante el protocolo MCP. Siga estos pasos para configurar y usar hex-mcp con Cursor. Puede crear un archivo .cursor/mcp.json en la raíz de su proyecto con el siguiente contenido:

{
  "mcpServers": {
    "hex-mcp": {
      "command": "uv",
      "args": ["run", "hex-mcp", "run"]
    }
  }
}

Alternativamente, puede usar el comando hex-mcp directamente si está en su PATH:

{
  "mcpServers": {
    "hex-mcp": {
      "command": "hex-mcp",
      "args": ["run"]
    }
  }
}

Una vez que esté funcionando, puede usarlo en Cursor iniciando una nueva conversación de IA (Agente) y pidiéndole que liste o ejecute un proyecto de Hex.

[!IMPORTANTE] El servidor MCP y la CLI aún están en desarrollo y sujetos a cambios que pueden romper la compatibilidad.

Ejemplos de Uso

Lectura de Contenido de Celdas

Use list_hex_cells para leer la estructura y el código fuente de un notebook de Hex:

# List all cells in a project
cells = list_hex_cells(project_id="your-project-uuid")

# The response includes cell metadata and source code for SQL/CODE cells
# Example response structure:
{
    "values": [
        {
            "id": "cell-uuid-123",
            "staticId": "static-id-456",
            "cellType": "SQL",
            "label": "Load Customer Data",
            "dataConnectionId": "connection-uuid-789",
            "contents": {
                "sqlCell": {
                    "source": "SELECT * FROM customers WHERE active = true"
                },
                "codeCell": null
            }
        },
        {
            "id": "cell-uuid-456",
            "cellType": "CODE",
            "label": "Process Data",
            "dataConnectionId": null,
            "contents": {
                "sqlCell": null,
                "codeCell": {
                    "source": "import pandas as pd\ndf = df.dropna()"
                }
            }
        },
        {
            "id": "cell-uuid-789",
            "cellType": "MARKDOWN",
            "label": "Documentation",
            "dataConnectionId": null,
            "contents": {
                "sqlCell": null,
                "codeCell": null
            }
        }
    ],
    "pagination": {
        "next": null,
        "previous": null
    }
}

Nota: Solo las celdas SQL y CODE incluyen contenido fuente. Las celdas MARKDOWN, INPUT y de visualización devuelven null tanto para sqlCell como para codeCell.

Paginación

Para proyectos con muchas celdas, use paginación:

# First page
page1 = list_hex_cells(project_id="your-project-uuid", limit=50)

# Next page using cursor
if page1["pagination"]["next"]:
    page2 = list_hex_cells(
        project_id="your-project-uuid",
        limit=50,
        after=page1["pagination"]["next"]
    )

# Previous page
if page2["pagination"]["previous"]:
    page1_again = list_hex_cells(
        project_id="your-project-uuid",
        limit=50,
        before=page2["pagination"]["previous"]
    )

Actualización de Contenido de Celdas

Actualice celdas SQL o CODE programáticamente:

# Update SQL cell source code
result = update_hex_cell(
    cell_id="cell-uuid-123",
    sql_source="SELECT * FROM updated_table WHERE active = true"
)

# Update CODE cell source code
result = update_hex_cell(
    cell_id="cell-uuid-456",
    code_source="import pandas as pd\ndf = df.dropna()"
)

# Update SQL cell data connection (without changing source)
result = update_hex_cell(
    cell_id="cell-uuid-123",
    data_connection_id="new-connection-uuid"
)

# Update both SQL source and connection in one call
result = update_hex_cell(
    cell_id="cell-uuid-123",
    sql_source="SELECT * FROM production.customers",
    data_connection_id="production-connection-uuid"
)

Importante:

  • Solo puede actualizar tipos de celda SQL y CODE
  • No puede actualizar celdas MARKDOWN, INPUT o de visualización
  • Requiere permiso EDIT_PROJECT_CONTENTS
  • No puede actualizar sql_source y code_source en la misma llamada (las celdas son SQL o CODE)

Ejemplo de Migración de Consultas

Extraiga y actualice consultas SQL entre proyectos:

import json

# Get all cells from source project
cells_response = list_hex_cells(project_id="source-project-uuid")
cells = json.loads(cells_response)

# Filter for SQL cells
sql_cells = [
    cell for cell in cells["values"]
    if cell["cellType"] == "SQL" and cell["contents"]["sqlCell"]
]

# Migrate queries to new data connection
new_connection_id = "production-bigquery-connection"

for cell in sql_cells:
    original_query = cell["contents"]["sqlCell"]["source"]

    # Update table references (example: dev -> prod)
    updated_query = original_query.replace("dev.schema", "prod.schema")

    # Update the cell with new query and connection
    result = update_hex_cell(
        cell_id=cell["id"],
        sql_source=updated_query,
        data_connection_id=new_connection_id
    )

    print(f"Updated cell: {cell['label']}")

print(f"Migrated {len(sql_cells)} SQL cells to production")

Ejemplo de Refactorización de Código

Actualice código Python en lote entre múltiples celdas:

import json

# Get all CODE cells
cells_response = list_hex_cells(project_id="project-uuid")
cells = json.loads(cells_response)

code_cells = [
    cell for cell in cells["values"]
    if cell["cellType"] == "CODE" and cell["contents"]["codeCell"]
]

# Update import statements
for cell in code_cells:
    original_code = cell["contents"]["codeCell"]["source"]

    # Replace deprecated import
    if "from old_library" in original_code:
        updated_code = original_code.replace(
            "from old_library import func",
            "from new_library import func"
        )

        # Update the cell
        result = update_hex_cell(
            cell_id=cell["id"],
            code_source=updated_code
        )

        print(f"Updated cell: {cell['label']}")

Gestión de Permisos de Proyectos

Controle el acceso a proyectos de Hex programáticamente usando los endpoints de uso compartido.

Otorgar Acceso a Usuarios

from hex_mcp.server import update_hex_project_user_sharing

# Grant edit access to a single user
result = update_hex_project_user_sharing(
    project_id="project-123",
    user_permissions=[
        {"user_id": "user-456", "access": "CAN_EDIT"}
    ]
)

# Grant access to multiple users with different permissions
result = update_hex_project_user_sharing(
    project_id="project-123",
    user_permissions=[
        {"user_id": "user-001", "access": "CAN_VIEW"},
        {"user_id": "user-002", "access": "CAN_EDIT"},
        {"user_id": "user-003", "access": "FULL_ACCESS"}
    ]
)

# Revoke user access
result = update_hex_project_user_sharing(
    project_id="project-123",
    user_permissions=[
        {"user_id": "user-456", "access": "NONE"}
    ]
)

Niveles de Acceso:

  • NONE: Revoca todo el acceso
  • APP_ONLY: Acceso solo dentro de aplicaciones (versiones publicadas)
  • CAN_VIEW: Ver proyecto en vista lógica (solo lectura)
  • CAN_EDIT: Editar contenido del proyecto
  • FULL_ACCESS: Editar contenido y gestionar configuraciones/permisos del proyecto

Otorgar Acceso a Grupos

from hex_mcp.server import update_hex_project_group_sharing

# Grant access to a group
result = update_hex_project_group_sharing(
    project_id="project-123",
    group_permissions=[
        {"group_id": "group-789", "access": "CAN_VIEW"}
    ]
)

# Grant access to multiple groups
result = update_hex_project_group_sharing(
    project_id="project-123",
    group_permissions=[
        {"group_id": "analytics-team", "access": "CAN_EDIT"},
        {"group_id": "leadership-team", "access": "CAN_VIEW"}
    ]
)

Agregar Proyectos a Colecciones

from hex_mcp.server import update_hex_project_collection_sharing

# Add project to a collection
result = update_hex_project_collection_sharing(
    project_id="project-123",
    collection_permissions=[
        {"collection_id": "collection-456", "access": "CAN_VIEW"}
    ]
)

# Add to multiple collections with different access levels
result = update_hex_project_collection_sharing(
    project_id="project-123",
    collection_permissions=[
        {"collection_id": "public-dashboards", "access": "APP_ONLY"},
        {"collection_id": "internal-analytics", "access": "CAN_EDIT"}
    ]
)

# Remove from collection
result = update_hex_project_collection_sharing(
    project_id="project-123",
    collection_permissions=[
        {"collection_id": "collection-456", "access": "NONE"}
    ]
)

Gestionar Acceso Público y del Espacio de Trabajo

from hex_mcp.server import update_hex_project_workspace_sharing

# Make project viewable by entire workspace
result = update_hex_project_workspace_sharing(
    project_id="project-123",
    workspace_access="CAN_VIEW"
)

# Make project publicly accessible
result = update_hex_project_workspace_sharing(
    project_id="project-123",
    public_access="APP_ONLY"
)

# Update both workspace and public access
result = update_hex_project_workspace_sharing(
    project_id="project-123",
    workspace_access="CAN_EDIT",
    public_access="APP_ONLY"
)

# Revoke public access (keep workspace access)
result = update_hex_project_workspace_sharing(
    project_id="project-123",
    public_access="NONE"
)

Ejemplo de Gestión de Permisos en Lote

Estandarice permisos entre múltiples proyectos:

import json
from hex_mcp.server import (
    list_hex_projects,
    update_hex_project_user_sharing,
    update_hex_project_workspace_sharing
)

# Get all projects
projects_response = list_hex_projects()
projects = json.loads(projects_response)

# Define standard access policies
analytics_team_users = ["user-001", "user-002", "user-003"]
leadership_users = ["user-100", "user-101"]

for project in projects:
    project_id = project["projectId"]

    # Grant analytics team edit access
    update_hex_project_user_sharing(
        project_id=project_id,
        user_permissions=[
            {"user_id": user_id, "access": "CAN_EDIT"}
            for user_id in analytics_team_users
        ]
    )

    # Grant leadership view access
    update_hex_project_user_sharing(
        project_id=project_id,
        user_permissions=[
            {"user_id": user_id, "access": "CAN_VIEW"}
            for user_id in leadership_users
        ]
    )

    # Make viewable by workspace, not public
    update_hex_project_workspace_sharing(
        project_id=project_id,
        workspace_access="CAN_VIEW",
        public_access="NONE"
    )

    print(f"Updated permissions for: {project['name']}")

Notas Importantes:

  • Todas las operaciones de uso compartido requieren permisos apropiados del espacio de trabajo
  • Los IDs de usuarios/grupos deben existir en su espacio de trabajo de Hex
  • Los IDs de colecciones deben ser colecciones válidas a las que tenga acceso
  • El acceso del espacio de trabajo aplica a todos los miembros del espacio de trabajo
  • El acceso público (publicWeb) permite que cualquier persona con el enlace acceda

Gestión de Colecciones

Organice proyectos en colecciones para una mejor organización del espacio de trabajo.

Listar Colecciones

from hex_mcp.server import list_hex_collections
import json

# List all collections
collections = list_hex_collections()
data = json.loads(collections)

for collection in data["values"]:
    print(f"{collection['name']}: {collection['id']}")
    print(f"  Created by: {collection.get('creator', {}).get('email', 'N/A')}")

# List with pagination
page1 = list_hex_collections(limit=10)
data = json.loads(page1)

if data["pagination"]["next"]:
    page2 = list_hex_collections(limit=10, after=data["pagination"]["next"])

Obtener Detalles de Colección

from hex_mcp.server import get_hex_collection
import json

# Get specific collection
collection = get_hex_collection(collection_id="collection-123")
data = json.loads(collection)

print(f"Collection: {data['name']}")
print(f"Description: {data.get('description', 'No description')}")
print(f"Sharing with {len(data['sharing'].get('users', []))} users")
print(f"Sharing with {len(data['sharing'].get('groups', []))} groups")

Crear Colecciones

from hex_mcp.server import create_hex_collection
import json

# Create simple collection
collection = create_hex_collection(
    name="Q4 2026 Analytics",
    description="Analytics projects for Q4 2026"
)
data = json.loads(collection)
print(f"Created collection: {data['id']}")

# Create with sharing settings
collection = create_hex_collection(
    name="Executive Dashboards",
    description="Dashboards for executive team",
    sharing_users=[
        {"id": "user-ceo", "access": "CAN_VIEW"},
        {"id": "user-cfo", "access": "CAN_VIEW"}
    ],
    workspace_access="NONE"  # Only specified users can access
)

# Create with group access
collection = create_hex_collection(
    name="Finance Reports",
    description="Financial reporting and analysis",
    sharing_groups=[
        {"id": "finance-team", "access": "CAN_EDIT"}
    ],
    workspace_access="CAN_VIEW"
)

Actualizar Colecciones

from hex_mcp.server import update_hex_collection
import json

# Update collection name and description
result = update_hex_collection(
    collection_id="collection-123",
    name="Q1 2027 Analytics",
    description="Updated for Q1 2027"
)

# Update sharing settings
result = update_hex_collection(
    collection_id="collection-123",
    sharing_users=[
        {"id": "user-456", "access": "CAN_EDIT"}
    ],
    workspace_access="CAN_VIEW"
)

# Update multiple fields at once
result = update_hex_collection(
    collection_id="collection-123",
    name="Updated Collection Name",
    description="Updated description",
    sharing_groups=[
        {"id": "analytics-team", "access": "CAN_EDIT"}
    ],
    workspace_access="CAN_VIEW"
)

Ejemplo de Organización de Colecciones

Organice todos los proyectos por departamento:

import json
from hex_mcp.server import (
    list_hex_projects,
    list_hex_collections,
    create_hex_collection,
    update_hex_project_collection_sharing
)

# Define department structure
departments = {
    "Engineering": ["user-eng-lead", "group-engineering"],
    "Finance": ["user-fin-lead", "group-finance"],
    "Marketing": ["user-mkt-lead", "group-marketing"]
}

# Create collections for each department
collection_ids = {}
for dept_name, members in departments.items():
    # Create collection
    collection = create_hex_collection(
        name=f"{dept_name} Projects",
        description=f"All {dept_name} department projects",
        workspace_access="CAN_VIEW"
    )
    data = json.loads(collection)
    collection_ids[dept_name] = data["id"]
    print(f"Created collection for {dept_name}: {data['id']}")

# Get all projects
projects = list_hex_projects()
projects_data = json.loads(projects)

# Organize projects into collections based on name patterns
for project in projects_data:
    project_id = project["projectId"]
    project_name = project["name"].lower()

    # Determine which collection(s) this project belongs to
    if "engineering" in project_name or "technical" in project_name:
        update_hex_project_collection_sharing(
            project_id=project_id,
            collection_permissions=[
                {"collection_id": collection_ids["Engineering"], "access": "CAN_EDIT"}
            ]
        )
        print(f"Added '{project['name']}' to Engineering collection")

    elif "finance" in project_name or "revenue" in project_name:
        update_hex_project_collection_sharing(
            project_id=project_id,
            collection_permissions=[
                {"collection_id": collection_ids["Finance"], "access": "CAN_EDIT"}
            ]
        )
        print(f"Added '{project['name']}' to Finance collection")

    elif "marketing" in project_name or "campaign" in project_name:
        update_hex_project_collection_sharing(
            project_id=project_id,
            collection_permissions=[
                {"collection_id": collection_ids["Marketing"], "access": "CAN_EDIT"}
            ]
        )
        print(f"Added '{project['name']}' to Marketing collection")

print("Collection organization complete!")

Notas de Gestión de Colecciones:

  • Las colecciones ayudan a organizar proyectos por equipo, departamento o tema
  • Las colecciones pueden tener sus propias configuraciones de uso compartido independientes de los proyectos
  • Un proyecto puede pertenecer a múltiples colecciones
  • El acceso del espacio de trabajo en colecciones controla quién puede ver que la colección existe
  • Crear colecciones requiere permisos apropiados del espacio de trabajo

Gestión de Grupos

Organice usuarios en grupos para simplificar la gestión de permisos.

Listar Grupos

from hex_mcp.server import list_hex_groups
import json

# List all groups
groups = list_hex_groups()
data = json.loads(groups)

for group in data["values"]:
    print(f"{group['name']}: {group['id']}")
    print(f"  Created: {group['createdAt']}")

# List with pagination and sorting
page1 = list_hex_groups(
    limit=10,
    sort_by="name",
    sort_direction="asc"
)
data = json.loads(page1)

if data["pagination"]["next"]:
    page2 = list_hex_groups(limit=10, after=data["pagination"]["next"])

Obtener Detalles de Grupo

from hex_mcp.server import get_hex_group
import json

# Get specific group
group = get_hex_group(group_id="group-123")
data = json.loads(group)

print(f"Group: {data['name']}")
print(f"ID: {data['id']}")
print(f"Created: {data['createdAt']}")

Crear Grupos

from hex_mcp.server import create_hex_group
import json

# Create simple group
group = create_hex_group(name="Analytics Team")
data = json.loads(group)
print(f"Created group: {data['id']}")

# Create with initial members
group = create_hex_group(
    name="Finance Team",
    member_user_ids=[
        "user-123",
        "user-456",
        "user-789"
    ]
)
data = json.loads(group)
print(f"Created group with 3 members: {data['id']}")

Actualizar Grupos

from hex_mcp.server import update_hex_group
import json

# Update group name
result = update_hex_group(
    group_id="group-123",
    name="Senior Analytics Team"
)

# Add members to group
result = update_hex_group(
    group_id="group-123",
    add_member_user_ids=["user-new-1", "user-new-2"]
)

# Remove members from group
result = update_hex_group(
    group_id="group-123",
    remove_member_user_ids=["user-old-1"]
)

# Update name and membership together
result = update_hex_group(
    group_id="group-123",
    name="Lead Analytics Team",
    add_member_user_ids=["user-lead"],
    remove_member_user_ids=["user-junior"]
)

Eliminar Grupos

from hex_mcp.server import delete_hex_group

# Delete a group (does not delete the users, only the group)
result = delete_hex_group(group_id="group-old-team")
print(result)  # "Group deleted successfully"

Ejemplo de Gestión de Grupos en Lote

Cree grupos basados en departamentos y asigne usuarios:

import json
from hex_mcp.server import (
    create_hex_group,
    update_hex_group,
    update_hex_project_group_sharing
)

# Define department structure with user lists
departments = {
    "Engineering": {
        "leads": ["user-eng-lead-1", "user-eng-lead-2"],
        "members": ["user-eng-1", "user-eng-2", "user-eng-3"]
    },
    "Data Science": {
        "leads": ["user-ds-lead"],
        "members": ["user-ds-1", "user-ds-2", "user-ds-3", "user-ds-4"]
    },
    "Analytics": {
        "leads": ["user-analytics-lead"],
        "members": ["user-analyst-1", "user-analyst-2"]
    }
}

# Create groups for each department
group_ids = {}
for dept_name, users in departments.items():
    # Create main department group
    all_members = users["leads"] + users["members"]
    group = create_hex_group(
        name=f"{dept_name} Team",
        member_user_ids=all_members
    )
    data = json.loads(group)
    group_ids[dept_name] = data["id"]
    print(f"Created {dept_name} Team: {data['id']} ({len(all_members)} members)")

    # Create leadership sub-group
    lead_group = create_hex_group(
        name=f"{dept_name} Leadership",
        member_user_ids=users["leads"]
    )
    lead_data = json.loads(lead_group)
    group_ids[f"{dept_name}_Leadership"] = lead_data["id"]
    print(f"Created {dept_name} Leadership: {lead_data['id']} ({len(users['leads'])} members)")

# Grant group access to relevant projects
# Engineering team gets edit access to technical projects
update_hex_project_group_sharing(
    project_id="technical-project-123",
    group_permissions=[
        {"group_id": group_ids["Engineering"], "access": "CAN_EDIT"}
    ]
)

# Analytics team gets view access to all dashboards
update_hex_project_group_sharing(
    project_id="dashboard-project-456",
    group_permissions=[
        {"group_id": group_ids["Analytics"], "access": "CAN_VIEW"}
    ]
)

# Leadership groups get view access to executive dashboards
for dept in ["Engineering", "Data Science", "Analytics"]:
    leadership_group_id = group_ids[f"{dept}_Leadership"]
    update_hex_project_group_sharing(
        project_id="executive-dashboard-789",
        group_permissions=[
            {"group_id": leadership_group_id, "access": "CAN_VIEW"}
        ]
    )

print("Group-based permission management complete!")

Ejemplo de Reorganización de Equipos

Maneje cambios de equipo actualizando membresías de grupos:

import json
from hex_mcp.server import (
    list_hex_groups,
    update_hex_group
)

# Get all groups
groups = list_hex_groups()
groups_data = json.loads(groups)

# Find specific groups that need updates
engineering_group = None
for group in groups_data["values"]:
    if group["name"] == "Engineering Team":
        engineering_group = group
        break

if engineering_group:
    # New hires joining
    new_engineers = ["user-new-eng-1", "user-new-eng-2"]

    # Engineers leaving
    departing_engineers = ["user-old-eng-1"]

    # Update group membership
    result = update_hex_group(
        group_id=engineering_group["id"],
        add_member_user_ids=new_engineers,
        remove_member_user_ids=departing_engineers
    )

    print(f"Updated {engineering_group['name']}")
    print(f"  Added: {len(new_engineers)} members")
    print(f"  Removed: {len(departing_engineers)} members")

Notas de Gestión de Grupos:

  • Los grupos simplifican la gestión de permisos al permitir otorgar acceso a múltiples usuarios a la vez
  • Un usuario puede pertenecer a múltiples grupos
  • Máximo 100 usuarios pueden agregarse o eliminarse en una sola operación de actualización
  • Eliminar un grupo no elimina a los usuarios, solo al grupo en sí
  • Los permisos de grupo son heredados por todos los miembros del grupo
  • Use grupos con endpoints de uso compartido de proyectos para otorgar acceso a nivel de equipo

Gestión de Conexiones de Datos

Gestione conexiones de bases de datos y almacenes de datos para proyectos de Hex.

Listar Conexiones de Datos

from hex_mcp.server import list_hex_data_connections
import json

# List all data connections
connections = list_hex_data_connections()
data = json.loads(connections)

for conn in data["values"]:
    print(f"{conn['name']} ({conn['type']}): {conn['id']}")
    if conn.get('description'):
        print(f"  Description: {conn['description']}")

# List with pagination and sorting
page1 = list_hex_data_connections(
    limit=10,
    sort_by="NAME",
    sort_direction="asc"
)
data = json.loads(page1)

if data["pagination"]["next"]:
    page2 = list_hex_data_connections(limit=10, after=data["pagination"]["next"])

Obtener Detalles de Conexión de Datos

from hex_mcp.server import get_hex_data_connection
import json

# Get specific connection
connection = get_hex_data_connection(connection_id="conn-123")
data = json.loads(connection)

print(f"Connection: {data['name']}")
print(f"Type: {data['type']}")
print(f"Description: {data.get('description', 'N/A')}")
print(f"Include Magic: {data.get('includeMagic', False)}")
print(f"Allow Writeback: {data.get('allowWritebackCells', False)}")

# Check sharing settings
if 'sharing' in data:
    workspace = data['sharing'].get('workspace', {})
    print(f"Workspace Access: {workspace.get('members', 'None')}")

Crear Conexiones de Datos

from hex_mcp.server import create_hex_data_connection
import json

# Create BigQuery connection
bigquery_conn = create_hex_data_connection(
    name="Production BigQuery",
    connection_type="bigquery",
    connection_details={
        "bigquery": {
            "serviceAccountJsonConfig": json.dumps(service_account_config),
            "projectId": "my-gcp-project",
            "enableStorageApi": True,
            "enableDriveAccess": False
        }
    },
    description="Production data warehouse for analytics",
    include_magic=True,
    allow_writeback_cells=False,
    sharing={
        "workspace": {
            "members": "CAN_USE"
        }
    }
)
data = json.loads(bigquery_conn)
print(f"Created BigQuery connection: {data['id']}")

# Create Snowflake connection
snowflake_conn = create_hex_data_connection(
    name="Snowflake Analytics",
    connection_type="snowflake",
    connection_details={
        "snowflake": {
            "account": "my-account",
            "warehouse": "ANALYTICS_WH",
            "database": "ANALYTICS_DB",
            "schema": "PUBLIC",
            "username": "hex_service",
            "password": "secure_password"
        }
    },
    description="Snowflake warehouse for analytics",
    include_magic=True
)
data = json.loads(snowflake_conn)
print(f"Created Snowflake connection: {data['id']}")

# Create Postgres connection
postgres_conn = create_hex_data_connection(
    name="Application Database",
    connection_type="postgres",
    connection_details={
        "postgres": {
            "hostname": "db.example.com",
            "port": 5432,
            "database": "app_db",
            "username": "readonly_user",
            "password": "secure_password",
            "ssl": True
        }
    },
    description="Production application database (read-only)",
    connect_via_ssh=False,
    include_magic=True,
    allow_writeback_cells=False
)
data = json.loads(postgres_conn)
print(f"Created Postgres connection: {data['id']}")

Actualizar Conexiones de Datos

from hex_mcp.server import update_hex_data_connection
import json

# Update connection name and description
result = update_hex_data_connection(
    connection_id="conn-123",
    name="Updated Production BigQuery",
    description="Updated production data warehouse for analytics and reporting"
)
data = json.loads(result)
print(f"Updated connection: {data['name']}")

# Update connection settings
result = update_hex_data_connection(
    connection_id="conn-123",
    include_magic=False,
    allow_writeback_cells=True
)
print("Updated connection settings")

# Update connection sharing
result = update_hex_data_connection(
    connection_id="conn-123",
    sharing={
        "workspace": {
            "members": "CAN_USE",
            "guests": "NONE"
        },
        "groups": {
            "upsert": [
                {"group": {"id": "analytics-team-group-id"}, "access": "CAN_USE"},
                {"group": {"id": "data-eng-group-id"}, "access": "CAN_ADMIN"}
            ]
        }
    }
)
print("Updated connection sharing")

# Rotate credentials by updating connection details
result = update_hex_data_connection(
    connection_id="conn-123",
    connection_details={
        "bigquery": {
            "serviceAccountJsonConfig": json.dumps(new_service_account),
            "projectId": "my-gcp-project",
            "enableStorageApi": True,
            "enableDriveAccess": False
        }
    }
)
print("Rotated connection credentials")

Configuración de Conexiones en Lote

Automatice la configuración de conexiones para nuevos espacios de trabajo o entornos:

from hex_mcp.server import create_hex_data_connection
import json

# Define standard connections for a workspace
connection_configs = {
    "Production BigQuery": {
        "type": "bigquery",
        "details": {
            "bigquery": {
                "serviceAccountJsonConfig": json.dumps(prod_bq_creds),
                "projectId": "prod-project",
                "enableStorageApi": True
            }
        },
        "description": "Production BigQuery warehouse"
    },
    "Staging BigQuery": {
        "type": "bigquery",
        "details": {
            "bigquery": {
                "serviceAccountJsonConfig": json.dumps(staging_bq_creds),
                "projectId": "staging-project",
                "enableStorageApi": True
            }
        },
        "description": "Staging BigQuery warehouse"
    },
    "Production Snowflake": {
        "type": "snowflake",
        "details": {
            "snowflake": {
                "account": "prod-account",
                "warehouse": "PROD_WH",
                "database": "PROD_DB",
                "username": "hex_prod",
                "password": prod_sf_password
            }
        },
        "description": "Production Snowflake warehouse"
    },
    "Application DB": {
        "type": "postgres",
        "details": {
            "postgres": {
                "hostname": "prod-db.example.com",
                "port": 5432,
                "database": "app_db",
                "username": "readonly",
                "password": postgres_password,
                "ssl": True
            }
        },
        "description": "Application database (read-only)"
    }
}

# Create all connections
created_connections = {}
for name, config in connection_configs.items():
    connection = create_hex_data_connection(
        name=name,
        connection_type=config["type"],
        connection_details=config["details"],
        description=config["description"],
        include_magic=True,
        allow_writeback_cells=False,
        sharing={
            "workspace": {
                "members": "CAN_USE"
            }
        }
    )
    data = json.loads(connection)
    created_connections[name] = data["id"]
    print(f"Created {name}: {data['id']}")

print(f"\nCreated {len(created_connections)} data connections")

Notas de Gestión de Conexiones de Datos:

  • Tipos de conexión compatibles: BigQuery, Snowflake, Postgres, Redshift, Athena, Databricks
  • Cada tipo de conexión tiene requisitos de configuración específicos en connection_details
  • Las credenciales de conexión se almacenan de forma segura en Hex
  • Use configuraciones de uso compartido para controlar quién puede usar cada conexión
  • El acceso CAN_USE permite a los usuarios consultar datos, CAN_ADMIN permite cambios de configuración
  • Túnel SSH compatible mediante el parámetro connect_via_ssh para conexiones seguras
  • Considere usar control de acceso a nivel de conexión para fuentes de datos sensibles

Acerca de Este Fork

Este fork extiende el paquete hex-mcp upstream con correcciones de errores y nueva funcionalidad de operaciones de celdas.

Correcciones de Errores (v0.1.10 upstream)

  • Cinco herramientas declararon tipo de retorno -> str pero devolvían dicts/listas de Python
  • Causaban errores de validación de pydantic en la integración MCP de Claude Code
  • Corregido agregando json.dumps() a las declaraciones de retorno en src/hex_mcp/server.py

Herramientas Corregidas (líneas 74, 172, 187, 206, 229):

  • list_hex_projects()
  • get_hex_project()
  • get_hex_run_status()
  • get_hex_project_runs()
  • run_hex_project()

Nuevas Funcionalidades

Operaciones de Celdas (Fase 1 de la implementación completa de la API de Hex):

  • list_hex_cells() - Leer la estructura del notebook y el código fuente de las celdas (celdas SQL/CODE)
  • update_hex_cell() - Actualizar el código fuente de las celdas SQL/CODE y las conexiones de datos
  • Suite de pruebas integral con 29 pruebas aprobadas (todas simuladas, sin necesidad de credenciales)
  • Documentación completa con ejemplos de uso para migración de consultas y refactorización de código

Gestión de Permisos (Fase 2 de la implementación completa de la API de Hex):

  • update_hex_project_user_sharing() - Otorgar o revocar acceso de usuarios a proyectos
  • update_hex_project_group_sharing() - Otorgar o revocar acceso de grupos a proyectos
  • update_hex_project_collection_sharing() - Agregar o eliminar proyectos de colecciones
  • update_hex_project_workspace_sharing() - Gestionar el acceso público y a nivel de espacio de trabajo
  • 18 pruebas aprobadas adicionales para todos los escenarios de uso compartido
  • Ejemplos completos para la gestión de permisos en masa

Gestión de Colecciones (Fase 3 de la implementación completa de la API de Hex):

  • list_hex_collections() - Listar todas las colecciones en el espacio de trabajo
  • get_hex_collection() - Obtener detalles de la colección con configuraciones de uso compartido
  • create_hex_collection() - Crear colecciones con uso compartido opcional
  • update_hex_collection() - Actualizar metadatos de la colección y uso compartido
  • 18 pruebas aprobadas adicionales para operaciones CRUD de colecciones
  • Ejemplos completos para la organización del espacio de trabajo por departamento

Gestión de Grupos (Fase 4 de la implementación completa de la API de Hex):

  • list_hex_groups() - Listar todos los grupos en el espacio de trabajo
  • get_hex_group() - Obtener detalles del grupo
  • create_hex_group() - Crear grupos con miembros iniciales opcionales
  • update_hex_group() - Actualizar el nombre del grupo y la membresía (agregar/eliminar hasta 100 usuarios)
  • delete_hex_group() - Eliminar grupos del espacio de trabajo
  • 21 pruebas aprobadas adicionales para operaciones CRUD completas de grupos
  • Ejemplos completos para la gestión de grupos por departamento y reorganización de equipos
  • Todas las funciones incluyen docstrings completos estilo Google

Gestión de Conexiones de Datos (Fase 5 de la implementación completa de la API de Hex):

  • list_hex_data_connections() - Listar todas las conexiones de datos con paginación y ordenamiento
  • get_hex_data_connection() - Obtener detalles de la conexión, incluyendo credenciales y uso compartido
  • create_hex_data_connection() - Crear conexiones de BigQuery, Snowflake, Postgres, Redshift, Athena y Databricks
  • update_hex_data_connection() - Actualizar configuración de conexión, credenciales y configuraciones de uso compartido
  • 18 pruebas aprobadas adicionales para operaciones CRUD de conexiones de datos
  • Ejemplos completos para configuración de conexiones, rotación de credenciales e implementación en masa
  • Soporte para los 6 tipos principales de conexiones de bases de datos/almacenes de datos
  • Docstrings completos estilo Google con especificaciones detalladas de tipos de conexión

Infraestructura de Pruebas:

  • Accesorios de prueba integrales con autenticación simulada
  • 105 pruebas aprobadas, 0 omitidas (todas simuladas, sin necesidad de credenciales)
  • Cobertura de pruebas en crecimiento con cada fase
  • Verificaciones de seguridad para prevenir credenciales de producción en pruebas
  • Integración de pytest, pytest-asyncio y pytest-cov
  • Manejador de retroceso fijo para funcionar tanto en entornos de producción como de prueba

Documentación:

  • Análisis completo de la especificación OpenAPI (ver OPENAPI-VALIDATION.md)
  • Plan de implementación detallado (ver IMPLEMENTATION-PLAN.md)
  • Guía de estrategia de pruebas (ver TEST-STRATEGY.md)
  • Ejemplos de uso para todas las funciones nuevas

Upstream: https://github.com/franccesco/hex-mcp

Estado: La rama bugfix/fast-mcp-return-types incluye tanto correcciones de errores como la nueva funcionalidad de operaciones de celdas. Lista para el envío de PR upstream si se desea.