Hex MCP
Um servidor para listar, pesquisar, executar e gerenciar projetos Hex.
Documentação
Servidor MCP hex-mcp
Um servidor MCP para Hex que implementa ferramentas de orquestração, monitoramento, acesso a conteúdo de células, gerenciamento de permissões, organização de coleções e gerenciamento de grupos.
O Que Isso Faz (E O Que Não Faz)
Casos de Uso Práticos
Orquestração e Automação:
- Disparar execuções de projetos Hex a partir de sistemas externos (DAGs do Airflow, pipelines de CI/CD)
- Monitorar o status das execuções programaticamente
- Cancelar execuções longas ou travadas
- Descobrir e pesquisar projetos em todos os workspaces
Monitoramento Operacional:
- Verificar se execuções agendadas foram concluídas com sucesso
- Obter histórico de execuções para auditoria
- Acesso programático a metadados de projetos (proprietário, última edição, descrição)
Acesso a Conteúdo de Células (NOVO):
- Ler a estrutura do notebook e metadados das células
- Ler o código-fonte de consultas SQL de células SQL
- Ler código Python/R de células CODE
- Útil para migração de consultas, análise de código e auditoria de conteúdo
Gerenciamento de Permissões (NOVO):
- Gerenciar programaticamente o acesso de usuários e grupos a projetos
- Atualizar permissões em massa em vários projetos
- Gerenciar configurações de acesso público e do workspace
- Adicionar ou remover projetos de coleções
Organização de Coleções (NOVO):
- Criar e gerenciar coleções para organizar projetos
- Organizar projetos por departamento, equipe ou tópico
- Controlar a visibilidade e o acesso das coleções
- Organizar projetos em massa em coleções
Gerenciamento de Grupos (NOVO):
- Criar e gerenciar grupos de usuários para gerenciamento de permissões
- Adicionar e remover usuários de grupos em massa
- Usar grupos para simplificar o gerenciamento de permissões em projetos
- Manter estruturas de equipe organizadas
Gerenciamento de Conexões de Dados (NOVO):
- Listar e gerenciar conexões de bancos de dados e data warehouses
- Criar conexões para BigQuery, Snowflake, Postgres, Redshift, Athena, Databricks
- Atualizar configurações e credenciais de conexão
- Controlar o compartilhamento de conexões de dados no workspace
Limitações Críticas
Acesso limitado ao conteúdo do notebook:
- ✅ Pode ler o conteúdo de células SQL e CODE
- ❌ Não pode ler células MARKDOWN, INPUT ou de visualização
- ❌ Não pode criar ou excluir células
- ❌ Não pode modificar a estrutura do notebook
- ❌ Não pode visualizar resultados de consultas ou gráficos
- ❌ Não pode gerenciar dependências ou parâmetros do notebook
Não é adequado para:
- Criar ou desenvolver notebooks do zero
- Desenvolvimento colaborativo de notebooks
- Depuração de consultas ou execução de código
- Backup completo de notebooks (apenas células SQL/CODE acessíveis)
- Leitura de documentação em markdown ou parâmetros de entrada
Quando Usar Isso
Use o hex-mcp quando precisar:
- Orquestrar execuções do Hex a partir de sistemas externos
- Monitorar status e histórico de execuções
- Ler consultas SQL e código de notebooks existentes
- Auditar ou migrar conteúdo SQL/CODE entre projetos
- Gerenciar permissões e controle de acesso em projetos
- Automatizar atualizações de permissões em massa para usuários, grupos e coleções
- Organizar projetos em coleções por departamento, equipe ou tópico
- Manter grupos de usuários para simplificar o gerenciamento de permissões
- Padronizar a organização do workspace na sua instância do Hex
- Gerenciar conexões de dados e integrações de banco de dados programaticamente
- Automatizar a configuração de conexões para novos workspaces ou ambientes
Para desenvolvimento e edição completos de notebooks, use a interface web do Hex diretamente.
Ferramentas Disponíveis
Operações de Projeto
list_hex_projects: Lista os projetos Hex disponíveissearch_hex_projects: Pesquisa projetos Hex por padrãoget_hex_project: Obtém informações detalhadas sobre um projeto específico
Execução de Projetos
run_hex_project: Executa um projeto Hexget_hex_run_status: Verifica o status de uma execução de projetoget_hex_project_runs: Obtém o histórico de execuções de projetoscancel_hex_run: Cancela um projeto em execução
Operações de Células (NOVO)
list_hex_cells: Lista todas as células de um projeto com código-fonte para células SQL/CODEupdate_hex_cell: Atualiza o código-fonte de células SQL ou CODE e/ou a conexão de dados
Gerenciamento de Permissões (NOVO)
update_hex_project_user_sharing: Concede ou revoga acesso de usuários a projetosupdate_hex_project_group_sharing: Concede ou revoga acesso de grupos a projetosupdate_hex_project_collection_sharing: Adiciona ou remove projetos de coleçõesupdate_hex_project_workspace_sharing: Atualiza o acesso público e do workspace
Gerenciamento de Coleções (NOVO)
list_hex_collections: Lista todas as coleções do workspaceget_hex_collection: Obtém informações detalhadas sobre uma coleção específicacreate_hex_collection: Cria uma nova coleção com configurações de compartilhamento opcionaisupdate_hex_collection: Atualiza nome, descrição ou configurações de compartilhamento da coleção
Gerenciamento de Grupos (NOVO)
list_hex_groups: Lista todos os grupos do workspaceget_hex_group: Obtém informações detalhadas sobre um grupo específicocreate_hex_group: Cria um novo grupo com membros iniciais opcionaisupdate_hex_group: Atualiza o nome do grupo e/ou a associação (adicionar/remover usuários)delete_hex_group: Exclui um grupo do workspace
Gerenciamento de Conexões de Dados (NOVO)
list_hex_data_connections: Lista todas as conexões de dados do workspaceget_hex_data_connection: Obtém informações detalhadas sobre uma conexão de dados específicacreate_hex_data_connection: Cria uma nova conexão de banco de dados/data warehouseupdate_hex_data_connection: Atualiza configuração, credenciais ou compartilhamento da conexão
Instalação
Usar uv é a forma recomendada de instalar o hex-mcp:
uv add hex-mcp
Ou usando pip:
pip install hex-mcp
Para confirmar que está funcionando, você pode executar:
hex-mcp --version
Configuração
Usando o comando de configuração (recomendado)
A maneira mais fácil de configurar o hex-mcp é usando o comando config e passando sua chave de API e URL da API (opcional, com padrão https://app.hex.tech/api/v1):
hex-mcp config --api-key "your_hex_api_key" --api-url "https://app.hex.tech/api/v1"
[!NOTE] Isso salva sua configuração em um arquivo no seu diretório pessoal (ex.:
~/.hex-mcp/config.yml), disponibilizando-a para todas as invocações do hex-mcp.
Usando variáveis de ambiente
Alternativamente, o servidor MCP do Hex pode ser configurado com variáveis de ambiente:
HEX_API_KEY: Sua chave de API do HexHEX_API_URL: A URL base da API do Hex
Ao configurar variáveis de ambiente para servidores MCP, elas precisam ser globais para o Cursor reconhecê-las ou usar o flag --env-file do uv ao invocar o servidor.
Usando com o Cursor
O Cursor permite que agentes de IA interajam com o Hex via protocolo MCP. Siga estes passos para configurar e usar o hex-mcp com o Cursor. Você pode criar um arquivo .cursor/mcp.json na raiz do seu projeto com o seguinte conteúdo:
{
"mcpServers": {
"hex-mcp": {
"command": "uv",
"args": ["run", "hex-mcp", "run"]
}
}
}
Alternativamente, você pode usar o comando hex-mcp diretamente se ele estiver no seu PATH:
{
"mcpServers": {
"hex-mcp": {
"command": "hex-mcp",
"args": ["run"]
}
}
}
Depois de configurado, você pode usá-lo no Cursor iniciando uma nova conversa de IA (Agente) e pedindo para listar ou executar um projeto Hex.
[!IMPORTANT] O servidor MCP e a CLI ainda estão em desenvolvimento e sujeitos a mudanças que podem quebrar a compatibilidade.
Exemplos de Uso
Lendo Conteúdo de Células
Use list_hex_cells para ler a estrutura e o código-fonte de um notebook 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: Apenas células SQL e CODE incluem conteúdo de código-fonte. Células MARKDOWN, INPUT e de visualização retornam null para sqlCell e codeCell.
Paginação
Para projetos com muitas células, use paginação:
# 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"]
)
Atualizando Conteúdo de Células
Atualize células SQL ou CODE programaticamente:
# 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:
- Só é possível atualizar células dos tipos SQL e CODE
- Não é possível atualizar células MARKDOWN, INPUT ou de visualização
- Requer permissão
EDIT_PROJECT_CONTENTS - Não é possível atualizar
sql_sourceecode_sourcena mesma chamada (células são SQL ou CODE)
Exemplo de Migração de Consultas
Extraia e atualize consultas SQL entre projetos:
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")
Exemplo de Refatoração de Código
Atualize código Python em massa em várias células:
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']}")
Gerenciando Permissões de Projetos
Controle o acesso a projetos Hex programaticamente usando os endpoints de compartilhamento.
Conceder Acesso a Usuários
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"}
]
)
Níveis de Acesso:
NONE: Revoga todo o acessoAPP_ONLY: Acesso apenas em apps (versões publicadas)CAN_VIEW: Visualizar projeto na visão lógica (somente leitura)CAN_EDIT: Editar conteúdo do projetoFULL_ACCESS: Editar conteúdo e gerenciar configurações/permissões do projeto
Conceder Acesso 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"}
]
)
Adicionar Projetos a Coleções
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"}
]
)
Gerenciar Acesso do Workspace e Público
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"
)
Exemplo de Gerenciamento de Permissões em Massa
Padronize permissões em vários projetos:
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 as operações de compartilhamento exigem permissões apropriadas do workspace
- IDs de usuários/grupos devem existir no seu workspace Hex
- IDs de coleções devem ser coleções válidas às quais você tem acesso
- O acesso do workspace se aplica a todos os membros do workspace
- Acesso público (
publicWeb) permite que qualquer pessoa com o link acesse
Gerenciando Coleções
Organize projetos em coleções para melhor organização do workspace.
Listar Coleções
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"])
Obter Detalhes da Coleção
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")
Criar Coleções
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"
)
Atualizar Coleções
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"
)
Exemplo de Organização de Coleções
Organize todos os projetos 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 sobre Gerenciamento de Coleções:
- Coleções ajudam a organizar projetos por equipe, departamento ou tópico
- Coleções podem ter suas próprias configurações de compartilhamento, independentes dos projetos
- Um projeto pode pertencer a várias coleções
- O acesso do workspace nas coleções controla quem pode ver que a coleção existe
- Criar coleções requer permissões apropriadas do workspace
Gerenciando Grupos
Organize usuários em grupos para simplificar o gerenciamento de permissões.
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"])
Obter Detalhes do 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']}")
Criar 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']}")
Atualizar 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"]
)
Excluir 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"
Exemplo de Gerenciamento de Grupos em Massa
Crie grupos baseados em departamentos e atribua usuários:
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!")
Exemplo de Reorganização de Equipe
Lide com mudanças de equipe atualizando associações 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 sobre Gerenciamento de Grupos:
- Grupos simplificam o gerenciamento de permissões permitindo conceder acesso a vários usuários de uma vez
- Um usuário pode pertencer a vários grupos
- Máximo de 100 usuários podem ser adicionados ou removidos em uma única operação de atualização
- Excluir um grupo não exclui os usuários, apenas o grupo em si
- As permissões do grupo são herdadas por todos os membros do grupo
- Use grupos com endpoints de compartilhamento de projetos para conceder acesso a toda a equipe
Gerenciando Conexões de Dados
Gerencie conexões de bancos de dados e data warehouses para projetos Hex.
Listar Conexões de Dados
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"])
Obter Detalhes da Conexão de Dados
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')}")
Criar Conexões de Dados
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']}")
Atualizar Conexões de Dados
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")
Configuração de Conexões em Massa
Automatize a configuração de conexões para novos workspaces ou ambientes:
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 sobre Gerenciamento de Conexões de Dados:
- Tipos de conexão suportados: BigQuery, Snowflake, Postgres, Redshift, Athena, Databricks
- Cada tipo de conexão tem requisitos de configuração específicos em
connection_details - As credenciais de conexão são armazenadas com segurança pelo Hex
- Use configurações de compartilhamento para controlar quem pode usar cada conexão
- Acesso
CAN_USEpermite que usuários consultem dados;CAN_ADMINpermite alterações de configuração - Túnel SSH suportado via parâmetro
connect_via_sshpara conexões seguras - Considere usar controle de acesso no nível da conexão para fontes de dados sensíveis
Sobre Este Fork
Este fork estende o pacote hex-mcp upstream com correções de bugs e novas funcionalidades de operações de células.
Correções de Bugs (v0.1.10 upstream)
- Cinco ferramentas declaravam tipo de retorno
-> strmas retornavam dicts/listas Python - Causavam erros de validação pydantic na integração MCP do Claude Code
- Corrigido adicionando
json.dumps()às declarações de retorno emsrc/hex_mcp/server.py
Ferramentas Corrigidas (linhas 74, 172, 187, 206, 229):
list_hex_projects()get_hex_project()get_hex_run_status()get_hex_project_runs()run_hex_project()
Novas Funcionalidades
Operações de Célula (Fase 1 da implementação completa da API Hex):
list_hex_cells()- Ler estrutura do notebook e código-fonte das células (células SQL/CODE)update_hex_cell()- Atualizar código-fonte das células SQL/CODE e conexões de dados- Suíte de testes abrangente com 29 testes aprovados (todos simulados, sem necessidade de credenciais)
- Documentação completa com exemplos de uso para migração de consultas e refatoração de código
Gerenciamento de Permissões (Fase 2 da implementação completa da API Hex):
update_hex_project_user_sharing()- Conceder ou revogar acesso de usuários a projetosupdate_hex_project_group_sharing()- Conceder ou revogar acesso de grupos a projetosupdate_hex_project_collection_sharing()- Adicionar ou remover projetos de coleçõesupdate_hex_project_workspace_sharing()- Gerenciar acesso público e em todo o workspace- 18 testes adicionais aprovados para todos os cenários de compartilhamento
- Exemplos completos para gerenciamento de permissões em massa
Gerenciamento de Coleções (Fase 3 da implementação completa da API Hex):
list_hex_collections()- Listar todas as coleções no workspaceget_hex_collection()- Obter detalhes da coleção com configurações de compartilhamentocreate_hex_collection()- Criar coleções com compartilhamento opcionalupdate_hex_collection()- Atualizar metadados e compartilhamento da coleção- 18 testes adicionais aprovados para operações CRUD de coleções
- Exemplos completos para organização do workspace por departamento
Gerenciamento de Grupos (Fase 4 da implementação completa da API Hex):
list_hex_groups()- Listar todos os grupos no workspaceget_hex_group()- Obter detalhes do grupocreate_hex_group()- Criar grupos com membros iniciais opcionaisupdate_hex_group()- Atualizar nome do grupo e associação (adicionar/remover até 100 usuários)delete_hex_group()- Excluir grupos do workspace- 21 testes adicionais aprovados para operações CRUD completas de grupos
- Exemplos completos para gerenciamento de grupos por departamento e reorganização de equipes
- Todas as funções incluem docstrings abrangentes no estilo Google
Gerenciamento de Conexões de Dados (Fase 5 da implementação completa da API Hex):
list_hex_data_connections()- Listar todas as conexões de dados com paginação e ordenaçãoget_hex_data_connection()- Obter detalhes da conexão, incluindo credenciais e compartilhamentocreate_hex_data_connection()- Criar conexões BigQuery, Snowflake, Postgres, Redshift, Athena, Databricksupdate_hex_data_connection()- Atualizar configuração da conexão, credenciais e configurações de compartilhamento- 18 testes adicionais aprovados para operações CRUD de conexões de dados
- Exemplos completos para configuração de conexão, rotação de credenciais e implantação em massa
- Suporte para todos os 6 principais tipos de conexão de banco de dados/warehouse
- Docstrings completas no estilo Google com especificações detalhadas de tipos de conexão
Infraestrutura de Testes:
- Fixtures de teste abrangentes com autenticação simulada
- 105 testes aprovados, 0 ignorados (todos simulados, sem necessidade de credenciais)
- Cobertura de testes crescendo a cada fase
- Verificações de segurança para evitar credenciais de produção em testes
- Integração com pytest, pytest-asyncio, pytest-cov
- Handler de backoff corrigido para funcionar em ambientes de produção e teste
Documentação:
- Análise completa da especificação OpenAPI (veja
OPENAPI-VALIDATION.md) - Plano de implementação detalhado (veja
IMPLEMENTATION-PLAN.md) - Guia de estratégia de testes (veja
TEST-STRATEGY.md) - Exemplos de uso para todos os novos recursos
Upstream: https://github.com/franccesco/hex-mcp
Status: A branch bugfix/fast-mcp-return-types inclui correções de bugs e a nova funcionalidade de operações de célula. Pronta para envio de PR upstream, se desejado.