Compartir comentarios
Las respuestas se generan en base a la documentación.

Solucionar problemas en flujos de trabajo de calidad de código

Esta página cubre los problemas comunes que podrías encontrar al construir flujos de trabajo de calidad de código con sandboxes de E2B y servidores MCP, junto con sus soluciones.

Si experimentas problemas que no se cubren aquí, consulta la documentación de E2B.

Herramientas MCP no disponibles

Problema: Claude informa I don't have any MCP tools available (No tengo ninguna herramienta MCP disponible).

Solución:

  1. Verifica que estés utilizando la cabecera de autorización:

    --header "Authorization: Bearer ${mcpToken}"
  2. Comprueba que estés esperando la inicialización de MCP.

    // typescript
    await new Promise((resolve) => setTimeout(resolve, 1000));
    # python
    await asyncio.sleep(1)
  3. Asegúrate de que las credenciales estén tanto en la configuración de envs como en la de mcp:

    // typescript
    const sbx = await Sandbox.betaCreate({
      envs: {
        ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY!,
        GITHUB_TOKEN: process.env.GITHUB_TOKEN!,
        SONARQUBE_TOKEN: process.env.SONARQUBE_TOKEN!,
      },
      mcp: {
        githubOfficial: {
          githubPersonalAccessToken: process.env.GITHUB_TOKEN!,
        },
        sonarqube: {
          org: process.env.SONARQUBE_ORG!,
          token: process.env.SONARQUBE_TOKEN!,
          url: "https://sonarcloud.io",
        },
      },
    });
    # python
    sbx = await AsyncSandbox.beta_create(
        envs={
            "ANTHROPIC_API_KEY": os.getenv("ANTHROPIC_API_KEY"),
            "GITHUB_TOKEN": os.getenv("GITHUB_TOKEN"),
            "SONARQUBE_TOKEN": os.getenv("SONARQUBE_TOKEN"),
        },
        mcp={
            "githubOfficial": {
                "githubPersonalAccessToken": os.getenv("GITHUB_TOKEN"),
            },
            "sonarqube": {
                "org": os.getenv("SONARQUBE_ORG"),
                "token": os.getenv("SONARQUBE_TOKEN"),
                "url": "https://sonarcloud.io",
            },
        },
    )
  4. Verifica que tus tokens de API sean válidos y tengan los alcances (scopes) adecuados.

Las herramientas de GitHub funcionan pero las de SonarQube no

Problema: las herramientas MCP de GitHub se cargan pero las de SonarQube no aparecen.

Solución: el servidor MCP de SonarQube requiere que GitHub esté configurado simultáneamente. Incluye siempre ambos servidores en la configuración de tu sandbox, incluso si solo estás probando uno.

// Incluye ambos servidores incluso si solo usas uno
const sbx = await Sandbox.betaCreate({
  envs: {
    ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY!,
    GITHUB_TOKEN: process.env.GITHUB_TOKEN!,
    SONARQUBE_TOKEN: process.env.SONARQUBE_TOKEN!,
  },
  mcp: {
    githubOfficial: {
      githubPersonalAccessToken: process.env.GITHUB_TOKEN!,
    },
    sonarqube: {
      org: process.env.SONARQUBE_ORG!,
      token: process.env.SONARQUBE_TOKEN!,
      url: "https://sonarcloud.io",
    },
  },
});
# Incluye ambos servidores incluso si solo usas uno
sbx = await AsyncSandbox.beta_create(
    envs={
        "ANTHROPIC_API_KEY": os.getenv("ANTHROPIC_API_KEY"),
        "GITHUB_TOKEN": os.getenv("GITHUB_TOKEN"),
        "SONARQUBE_TOKEN": os.getenv("SONARQUBE_TOKEN"),
    },
    mcp={
        "githubOfficial": {
            "githubPersonalAccessToken": os.getenv("GITHUB_TOKEN"),
        },
        "sonarqube": {
            "org": os.getenv("SONARQUBE_ORG"),
            "token": os.getenv("SONARQUBE_TOKEN"),
            "url": "https://sonarcloud.io",
        },
    },
)

Claude no puede acceder a repositorios privados

Problema: "I don't have access to that repository" (No tengo acceso a ese repositorio).

Solución:

  1. Verifica que tu token de GitHub tenga el alcance repo (no solo public_repo).

  2. Realiza primero una prueba con un repositorio público.

  3. Asegúrate de que el propietario y el nombre del repositorio sean correctos en tu archivo .env:

    GITHUB_OWNER=your_github_username
    GITHUB_REPO=your_repository_name
    GITHUB_OWNER=your_github_username
    GITHUB_REPO=your_repository_name

El flujo de trabajo agota el tiempo de espera o se ejecuta durante demasiado tiempo

Problema: el flujo de trabajo no se completa o se agotan los créditos de Claude.

Soluciones:

  1. Utiliza timeoutMs: 0 (TypeScript) o timeout_ms=0 (Python) para flujos de trabajo complejos para permitir tiempo ilimitado:

    await sbx.commands.run(
      `echo '${prompt}' | claude -p --dangerously-skip-permissions`,
      {
        timeoutMs: 0, // Sin límite de tiempo
        onStdout: console.log,
        onStderr: console.log,
      },
    );
    await sbx.commands.run(
        f"echo '{prompt}' | claude -p --dangerously-skip-permissions",
        timeout_ms=0,  # Sin límite de tiempo
        on_stdout=print,
        on_stderr=print,
    )
  2. Divide los flujos de trabajo complejos en tareas más pequeñas y enfocadas.

  3. Monitorea tu uso de créditos de la API de Anthropic.

  4. Agrega puntos de control en los prompts: "Después de cada paso, muestra el progreso antes de continuar".

Errores de limpieza del sandbox

Problema: los sandboxes no se están limpiando correctamente, lo que provoca el agotamiento de los recursos.

Solución: utiliza siempre un manejo de errores adecuado con limpieza en el bloque finally:

async function robustWorkflow() {
  let sbx: Sandbox | undefined;

  try {
    sbx = await Sandbox.betaCreate({
      // ... configuración
    });

    // ... lógica del flujo de trabajo
  } catch (error) {
    console.error("Workflow failed:", error);
    process.exit(1);
  } finally {
    if (sbx) {
      console.log("Cleaning up sandbox...");
      await sbx.kill();
    }
  }
}
async def robust_workflow():
    sbx = None

    try:
        sbx = await AsyncSandbox.beta_create(
            # ... configuración
        )

        # ... lógica del flujo de trabajo

    except Exception as error:
        print(f"Workflow failed: {error}")
        sys.exit(1)
    finally:
        if sbx:
            print("Cleaning up sandbox...")
            await sbx.kill()

La variable de entorno no se carga

Problema: el script falla con "undefined" o "None" para las variables de entorno.

Solución:

  1. Asegúrate de que dotenv se cargue en la parte superior de tu archivo:

    import "dotenv/config";
  2. Verifica que el archivo .env esté en el mismo directorio que tu script.

  3. Comprueba que los nombres de las variables coincidan exactamente (sensible a mayúsculas y minúsculas):

    // archivo .env
    GITHUB_TOKEN = ghp_xxxxx;
    
    // En el código
    process.env.GITHUB_TOKEN; // Correcto
    process.env.github_token; // Incorrecto - las mayúsculas/minúsculas no coinciden
    
  1. Asegúrate de que dotenv se cargue en la parte superior de tu archivo:

    from dotenv import load_dotenv
    load_dotenv()
  2. Verifica que el archivo .env esté en el mismo directorio que tu script.

  3. Comprueba que los nombres de las variables coincidan exactamente (sensible a mayúsculas y minúsculas):

    # archivo .env
    GITHUB_TOKEN=ghp_xxxxx
    
    # En el código
    os.getenv("GITHUB_TOKEN")  # Correcto
    os.getenv("github_token")  # Incorrecto - las mayúsculas/minúsculas no coinciden

SonarQube devuelve resultados vacíos

Problema: el análisis de SonarQube no devuelve proyectos ni problemas.

Solución:

  1. Verifica que la clave de organización de SonarCloud sea correcta.
  2. Asegúrate de tener al menos un proyecto configurado en SonarCloud.
  3. Comprueba que tu token de SonarQube tenga los permisos necesarios.
  4. Confirma que tu proyecto haya sido analizado al menos una vez en SonarCloud.