# 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](https://e2b.dev/docs).

## 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:

   ```plaintext
   --header "Authorization: Bearer ${mcpToken}"
   ```

2. Comprueba que estés esperando la inicialización de MCP.

   ```typescript
   // typescript
   await new Promise((resolve) => setTimeout(resolve, 1000));
   ```

   ```python
   # 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
   // 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
   # 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.

**TypeScript**



```typescript
// 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",
    },
  },
});
```

**Python**



```python
# 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`:

   **TypeScript**



   ```plaintext
   GITHUB_OWNER=your_github_username
   GITHUB_REPO=your_repository_name
   ```

   **Python**



   ```plaintext
   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:

   **TypeScript**



   ```typescript
   await sbx.commands.run(
     `echo '${prompt}' | claude -p --dangerously-skip-permissions`,
     {
       timeoutMs: 0, // Sin límite de tiempo
       onStdout: console.log,
       onStderr: console.log,
     },
   );
   ```

   **Python**



   ```python
   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`:

**TypeScript**



```typescript
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();
    }
  }
}
```

**Python**



```python
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:

**TypeScript**



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

   ```typescript
   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):

   ```typescript
   // 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
   ```

   **Python**



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

   ```python
   from dotenv import load_dotenv
   load_dotenv()
   ```

5. Verifica que el archivo `.env` esté en el mismo directorio que tu script.

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

   ```python
   # 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.

