opción
HogarHogar Skill Seguridad azure-security-keyvault-secrets-java

azure-security-keyvault-secrets-java

microsoft/skills microsoft/skills

Almacena, recupera y gestiona datos confidenciales, como contraseñas, claves de API y cadenas de conexión, mediante Azure Key Vault con el SDK de Java.

...Expandir todo
2
Tiempo actualizado 18 de septiembre de 2026

Secretos de Azure Key Vault (Java)

Almacena y gestiona de forma segura secretos como contraseñas, claves de API y cadenas de conexión.

Instalación


    com.azure
    azure-security-keyvault-secrets
    4.9.0

Creación del cliente

import com.azure.core.credential.TokenCredential;
import com.azure.identity.AzureIdentityEnvVars;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.identity.ManagedIdentityCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;

// Desarrollo local: DefaultAzureCredential. Producción: establece AZURE_TOKEN_CREDENTIALS=prod o AZURE_TOKEN_CREDENTIALS=
TokenCredential credential = new DefaultAzureCredentialBuilder()
    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
    .build();
// O bien, utiliza una credencial específica directamente en producción:
// Véase https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
// TokenCredential credential = new ManagedIdentityCredentialBuilder().build();

// Cliente de sincronización
SecretClient secretClient = new SecretClientBuilder()
    .vaultUrl("https://.vault.azure.net")
    .credential(credential)
    .buildClient();

// Cliente asíncrono
SecretAsyncClient secretAsyncClient = new SecretClientBuilder()
    .vaultUrl("https://.vault.azure.net")
    .credential(credential)
    .buildAsyncClient();

Crear/establecer un secreto

import com.azure.security.keyvault.secrets.models.KeyVaultSecret;

// Secreto simple
KeyVaultSecret secret = secretClient.setSecret("database-password", "P@ssw0rd123!");
System.out.println("Nombre del secreto: " + secret.getName());
System.out.println("ID del secreto: " + secret.getId());

// Secreto con opciones
KeyVaultSecret secretWithOptions = secretClient.setSecret(
    new KeyVaultSecret("api-key", "sk_live_abc123xyz")
        .setProperties(new SecretProperties()
            .setContentType("application/json")
            .setExpiresOn(OffsetDateTime.now().plusYears(1))
            .setNotBefore(OffsetDateTime.now())
            .setEnabled(true)
            .setTags(Map.of(
                "environment", "production",
                "service", "payment-api"
            ))
        )
);

Obtener secreto

// Obtener la última versión
KeyVaultSecret secret = secretClient.getSecret("database-password");
String value = secret.getValue();
System.out.println("Valor del secreto: " + value);

// Obtener una versión específica
KeyVaultSecret specificVersion = secretClient.getSecret("database-password", "");

// Obtener solo las propiedades (sin valor)
SecretProperties props = secretClient.getSecret("database-password").getProperties();
System.out.println("Habilitado: " + props.isEnabled());
System.out.println("Creado: " + props.getCreatedOn());

Actualizar propiedades secretas

// Obtener el secreto
KeyVaultSecret secret = secretClient.getSecret("api-key");

// Actualizar propiedades (no se puede actualizar el valor; en su lugar, hay que crear una nueva versión)
secret.getProperties()
    .setEnabled(false)
    .setExpiresOn(OffsetDateTime.now().plusMonths(6))
    .setTags(Map.of("status", "rotating"));

SecretProperties updated = secretClient.updateSecretProperties(secret.getProperties());
System.out.println("Actualizado: " + updated.getUpdatedOn());

Listar secretos

import com.azure.core.util.paging.PagedIterable;
import com.azure.security.keyvault.secrets.models.SecretProperties;

// Listar todos los secretos (solo propiedades, sin valores)
for (SecretProperties secretProps : secretClient.listPropertiesOfSecrets()) {
    System.out.println("Secreto: " + secretProps.getName());
    System.out.println("  Habilitado: " + secretProps.isEnabled());
    System.out.println("  Creado: " + secretProps.getCreatedOn());
    System.out.println("  Tipo de contenido: " + secretProps.getContentType());
    
    // Obtener el valor si es necesario
    if (secretProps.isEnabled()) {
        KeyVaultSecret fullSecret = secretClient.getSecret(secretProps.getName());
        System.out.println("  Valor: " + fullSecret.getValue().substring(0, 5) + "...");
    }
}

// Enumerar las versiones de un secreto
for (SecretProperties version : secretClient.listPropertiesOfSecretVersions("database-password")) {
    System.out.println("Versión: " + version.getVersion());
    System.out.println("Creada: " + version.getCreatedOn());
    System.out.println("Habilitada: " + version.isEnabled());
}

Eliminar secreto

import com.azure.core.util.polling.SyncPoller;
import com.azure.security.keyvault.secrets.models.DeletedSecret;

// Iniciar la eliminación (devuelve un poller para almacenes con la eliminación temporal habilitada)
SyncPoller deletePoller = secretClient.beginDeleteSecret("old-secret");

// Esperar a que se complete la eliminación
DeletedSecret deletedSecret = deletePoller.poll().getValue();
System.out.println("Eliminado el: " + deletedSecret.getDeletedOn());
System.out.println("Fecha de purga programada: " + deletedSecret.getScheduledPurgeDate());

deletePoller.waitForCompletion();

Recuperar un secreto eliminado

// Listar secretos eliminados
for (DeletedSecret deleted : secretClient.listDeletedSecrets()) {
    System.out.println("Eliminado: " + deleted.getName());
    System.out.println("Fecha de eliminación: " + deleted.getDeletedOn());
}

// Recuperar el secreto eliminado
SyncPoller recoverPoller = secretClient.beginRecoverDeletedSecret("old-secret");
recoverPoller.waitForCompletion();

KeyVaultSecret recovered = recoverPoller.getFinalResult();
System.out.println("Recuperado: " + recovered.getName());

Eliminar definitivamente un secreto eliminado

// Eliminar de forma permanente (no se puede recuperar)
secretClient.purgeDeletedSecret("old-secret");

// Obtener primero la información del secreto eliminado
DeletedSecret deleted = secretClient.getDeletedSecret("old-secret");
System.out.println("Se va a purgar: " + deleted.getName());
secretClient.purgeDeletedSecret("old-secret");

Copia de seguridad y restauración

// Copia de seguridad del secreto (todas las versiones)
byte[] backup = secretClient.backupSecret("important-secret");

// Guardar en un archivo
Files.write(Paths.get("secret-backup.blob"), backup);

// Restaurar desde la copia de seguridad
byte[] backupData = Files.readAllBytes(Paths.get("secret-backup.blob"));
KeyVaultSecret restored = secretClient.restoreSecretBackup(backupData);
System.out.println("Restaurado: " + restored.getName());

Operaciones asíncronas

SecretAsyncClient asyncClient = new SecretClientBuilder()
    .vaultUrl("https://.vault.azure.net")
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildAsyncClient();

// Establecer el secreto de forma asíncrona
asyncClient.setSecret("async-secret", "async-value")
    .subscribe(
        secret -> System.out.println("Creado: " + secret.getName()),
        error -> System.out.println("Error: " + error.getMessage())
    );

// Obtener un secreto de forma asíncrona
asyncClient.getSecret("async-secret")
    .subscribe(secret -> System.out.println("Valor: " + secret.getValue()));

// Listar secretos de forma asíncrona
asyncClient.listPropertiesOfSecrets()
    .doOnNext(props -> System.out.println("Encontrado: " + props.getName()))
    .subscribe();

Patrones de configuración

Cargar varios secretos

public class ConfigLoader {
    private final SecretClient client;
    
    public ConfigLoader(String vaultUrl) {
        this.client = new SecretClientBuilder()
            .vaultUrl(vaultUrl)
            .credential(new DefaultAzureCredentialBuilder().build())
            .buildClient();
    }
    
    public Map loadSecrets(List secretNames) {
        Map secrets = new HashMap<>();
        for (String name : secretNames) {
            try {
                KeyVaultSecret secret = client.getSecret(name);
                secrets.put(name, secret.getValue());
            } catch (ResourceNotFoundException e) {
                System.out.println("Secreto no encontrado: " + name);
            }
        }
        return secrets;
    }
}

// Uso
ConfigLoader loader = new ConfigLoader("https://my-vault.vault.azure.net");
Map config = loader.loadSecrets(
    Arrays.asList("db-connection-string", "api-key", "jwt-secret")
);

Patrón de rotación de secretos

public void rotateSecret(String secretName, String newValue) {
    // Obtener el secreto actual
    KeyVaultSecret current = secretClient.getSecret(secretName);
    
    // Desactivar la versión anterior
    current.getProperties().setEnabled(false);
    secretClient.updateSecretProperties(current.getProperties());
    
    // Crear una nueva versión con el nuevo valor
    KeyVaultSecret newSecret = secretClient.setSecret(secretName, newValue);
    System.out.println("Rotado a la versión: " + newSecret.getProperties().getVersion());
}

Gestión de errores

import com.azure.core.exception.HttpResponseException;
import com.azure.core.exception.ResourceNotFoundException;

try {
    KeyVaultSecret secret = secretClient.getSecret("my-secret");
    System.out.println("Valor: " + secret.getValue());
} catch (ResourceNotFoundException e) {
    System.out.println("Secreto no encontrado");
} catch (HttpResponseException e) {
    int status = e.getResponse().getStatusCode();
    if (status == 403) {
        System.out.println("Acceso denegado: comprueba los permisos");
    } else if (status == 429) {
        System.out.println("Límite de solicitudes: inténtalo más tarde");
    } else {
        System.out.println("Error HTTP: " + status);
    }
}

Propiedades secretas

Propiedad Descripción
nombre Nombre del secreto
Valor Valor secreto (cadena)
id Identificador completo URL
contentType Indicación del tipo MIME
habilitado Si se puede recuperar el secreto
notBefore Hora de activación
caduca el Hora de caducidad
createdOn Marca de tiempo de creación
updatedOn Marca de tiempo de la última actualización
nivelDeRecuperación Nivel de recuperación de eliminación temporal
etiquetas Metadatos definidos por el usuario

Variables de entorno

AZURE_KEYVAULT_URL=https://.vault.azure.net  # Obligatorio para la URL del almacén
AZURE_TOKEN_CREDENTIALS=prod  # Obligatorio solo si se utiliza DefaultAzureCredential en producción

Prácticas recomendadas

  1. Habilitar la eliminación temporal: protege contra la eliminación accidental
  2. Utiliza etiquetas: etiqueta los secretos con el entorno, el servicio y el propietario
  3. Establecer la caducidad: utiliza setExpiresOn() para las credenciales que deban rotarse
  4. Tipo de contenido: establece contentType para indicar el formato (p. ej., application/json)
  5. Gestión de versiones: no elimines las versiones antiguas inmediatamente durante la rotación
  6. Registro de acceso: habilita el registro de diagnóstico en Key Vault
  7. Privilegio mínimo: utiliza almacenes independientes para los distintos entornos

Tipos de secretos comunes

// Cadena de conexión a la base de datos
secretClient.setSecret(new KeyVaultSecret("db-connection", 
    "Server=myserver.database.windows.net;Database=mydb;...")
    .setProperties(new SecretProperties()
        .setContentType("text/plain")
        .setTags(Map.of("type", "connection-string"))));

// Clave de API
secretClient.setSecret(new KeyVaultSecret("stripe-api-key", "sk_live_...")
    .setProperties(new SecretProperties()
        .setContentType("text/plain")
        .setExpiresOn(OffsetDateTime.now().plusYears(1))));

// Configuración JSON
secretClient.setSecret(new KeyVaultSecret("app-config", 
    "{\"endpoint\":\"https://...\",\"key\":\"...\"}")
    .setProperties(new SecretProperties()
        .setContentType("application/json")));

// Contraseña del certificado
secretClient.setSecret(new KeyVaultSecret("cert-password", "CertP@ss!")
    .setProperties(new SecretProperties()
        .setContentType("text/plain")
        .setTags(Map.of("certificate", "my-cert"))));

Frases de activación

  • "Secretos de Key Vault en Java", "gestión de secretos en Java"
  • «almacenar contraseña», «almacenar clave API», «cadena de conexión»
  • «recuperar secreto», «rotar secreto»
  • «secretos de Azure», «secretos de vault»
Ver en GitHub
---
name: azure-security-keyvault-secrets-java
description: Store, retrieve, and manage secrets like passwords, API keys, and connection strings using Azure Key Vault with the Java SDK.
license: MIT
---

# Azure Key Vault Secrets (Java)

Securely store and manage secrets like passwords, API keys, and connection strings.

## Installation

```xml
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-security-keyvault-secrets</artifactId>
    <version>4.9.0</version>
</dependency>
```

## Client Creation

```java
import com.azure.core.credential.TokenCredential;
import com.azure.identity.AzureIdentityEnvVars;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.identity.ManagedIdentityCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;

// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
TokenCredential credential = new DefaultAzureCredentialBuilder()
    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
    .build();
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
// TokenCredential credential = new ManagedIdentityCredentialBuilder().build();

// Sync client
SecretClient secretClient = new SecretClientBuilder()
    .vaultUrl("https://<vault-name>.vault.azure.net")
    .credential(credential)
    .buildClient();

// Async client
SecretAsyncClient secretAsyncClient = new SecretClientBuilder()
    .vaultUrl("https://<vault-name>.vault.azure.net")
    .credential(credential)
    .buildAsyncClient();
```

## Create/Set Secret

```java
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;

// Simple secret
KeyVaultSecret secret = secretClient.setSecret("database-password", "P@ssw0rd123!");
System.out.println("Secret name: " + secret.getName());
System.out.println("Secret ID: " + secret.getId());

// Secret with options
KeyVaultSecret secretWithOptions = secretClient.setSecret(
    new KeyVaultSecret("api-key", "sk_live_abc123xyz")
        .setProperties(new SecretProperties()
            .setContentType("application/json")
            .setExpiresOn(OffsetDateTime.now().plusYears(1))
            .setNotBefore(OffsetDateTime.now())
            .setEnabled(true)
            .setTags(Map.of(
                "environment", "production",
                "service", "payment-api"
            ))
        )
);
```

## Get Secret

```java
// Get latest version
KeyVaultSecret secret = secretClient.getSecret("database-password");
String value = secret.getValue();
System.out.println("Secret value: " + value);

// Get specific version
KeyVaultSecret specificVersion = secretClient.getSecret("database-password", "<version-id>");

// Get only properties (no value)
SecretProperties props = secretClient.getSecret("database-password").getProperties();
System.out.println("Enabled: " + props.isEnabled());
System.out.println("Created: " + props.getCreatedOn());
```

## Update Secret Properties

```java
// Get secret
KeyVaultSecret secret = secretClient.getSecret("api-key");

// Update properties (cannot update value - create new version instead)
secret.getProperties()
    .setEnabled(false)
    .setExpiresOn(OffsetDateTime.now().plusMonths(6))
    .setTags(Map.of("status", "rotating"));

SecretProperties updated = secretClient.updateSecretProperties(secret.getProperties());
System.out.println("Updated: " + updated.getUpdatedOn());
```

## List Secrets

```java
import com.azure.core.util.paging.PagedIterable;
import com.azure.security.keyvault.secrets.models.SecretProperties;

// List all secrets (properties only, no values)
for (SecretProperties secretProps : secretClient.listPropertiesOfSecrets()) {
    System.out.println("Secret: " + secretProps.getName());
    System.out.println("  Enabled: " + secretProps.isEnabled());
    System.out.println("  Created: " + secretProps.getCreatedOn());
    System.out.println("  Content-Type: " + secretProps.getContentType());
    
    // Get value if needed
    if (secretProps.isEnabled()) {
        KeyVaultSecret fullSecret = secretClient.getSecret(secretProps.getName());
        System.out.println("  Value: " + fullSecret.getValue().substring(0, 5) + "...");
    }
}

// List versions of a secret
for (SecretProperties version : secretClient.listPropertiesOfSecretVersions("database-password")) {
    System.out.println("Version: " + version.getVersion());
    System.out.println("Created: " + version.getCreatedOn());
    System.out.println("Enabled: " + version.isEnabled());
}
```

## Delete Secret

```java
import com.azure.core.util.polling.SyncPoller;
import com.azure.security.keyvault.secrets.models.DeletedSecret;

// Begin delete (returns poller for soft-delete enabled vaults)
SyncPoller<DeletedSecret, Void> deletePoller = secretClient.beginDeleteSecret("old-secret");

// Wait for deletion
DeletedSecret deletedSecret = deletePoller.poll().getValue();
System.out.println("Deleted on: " + deletedSecret.getDeletedOn());
System.out.println("Scheduled purge: " + deletedSecret.getScheduledPurgeDate());

deletePoller.waitForCompletion();
```

## Recover Deleted Secret

```java
// List deleted secrets
for (DeletedSecret deleted : secretClient.listDeletedSecrets()) {
    System.out.println("Deleted: " + deleted.getName());
    System.out.println("Deletion date: " + deleted.getDeletedOn());
}

// Recover deleted secret
SyncPoller<KeyVaultSecret, Void> recoverPoller = secretClient.beginRecoverDeletedSecret("old-secret");
recoverPoller.waitForCompletion();

KeyVaultSecret recovered = recoverPoller.getFinalResult();
System.out.println("Recovered: " + recovered.getName());
```

## Purge Deleted Secret

```java
// Permanently delete (cannot be recovered)
secretClient.purgeDeletedSecret("old-secret");

// Get deleted secret info first
DeletedSecret deleted = secretClient.getDeletedSecret("old-secret");
System.out.println("Will purge: " + deleted.getName());
secretClient.purgeDeletedSecret("old-secret");
```

## Backup and Restore

```java
// Backup secret (all versions)
byte[] backup = secretClient.backupSecret("important-secret");

// Save to file
Files.write(Paths.get("secret-backup.blob"), backup);

// Restore from backup
byte[] backupData = Files.readAllBytes(Paths.get("secret-backup.blob"));
KeyVaultSecret restored = secretClient.restoreSecretBackup(backupData);
System.out.println("Restored: " + restored.getName());
```

## Async Operations

```java
SecretAsyncClient asyncClient = new SecretClientBuilder()
    .vaultUrl("https://<vault>.vault.azure.net")
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildAsyncClient();

// Set secret async
asyncClient.setSecret("async-secret", "async-value")
    .subscribe(
        secret -> System.out.println("Created: " + secret.getName()),
        error -> System.out.println("Error: " + error.getMessage())
    );

// Get secret async
asyncClient.getSecret("async-secret")
    .subscribe(secret -> System.out.println("Value: " + secret.getValue()));

// List secrets async
asyncClient.listPropertiesOfSecrets()
    .doOnNext(props -> System.out.println("Found: " + props.getName()))
    .subscribe();
```

## Configuration Patterns

### Load Multiple Secrets

```java
public class ConfigLoader {
    private final SecretClient client;
    
    public ConfigLoader(String vaultUrl) {
        this.client = new SecretClientBuilder()
            .vaultUrl(vaultUrl)
            .credential(new DefaultAzureCredentialBuilder().build())
            .buildClient();
    }
    
    public Map<String, String> loadSecrets(List<String> secretNames) {
        Map<String, String> secrets = new HashMap<>();
        for (String name : secretNames) {
            try {
                KeyVaultSecret secret = client.getSecret(name);
                secrets.put(name, secret.getValue());
            } catch (ResourceNotFoundException e) {
                System.out.println("Secret not found: " + name);
            }
        }
        return secrets;
    }
}

// Usage
ConfigLoader loader = new ConfigLoader("https://my-vault.vault.azure.net");
Map<String, String> config = loader.loadSecrets(
    Arrays.asList("db-connection-string", "api-key", "jwt-secret")
);
```

### Secret Rotation Pattern

```java
public void rotateSecret(String secretName, String newValue) {
    // Get current secret
    KeyVaultSecret current = secretClient.getSecret(secretName);
    
    // Disable old version
    current.getProperties().setEnabled(false);
    secretClient.updateSecretProperties(current.getProperties());
    
    // Create new version with new value
    KeyVaultSecret newSecret = secretClient.setSecret(secretName, newValue);
    System.out.println("Rotated to version: " + newSecret.getProperties().getVersion());
}
```

## Error Handling

```java
import com.azure.core.exception.HttpResponseException;
import com.azure.core.exception.ResourceNotFoundException;

try {
    KeyVaultSecret secret = secretClient.getSecret("my-secret");
    System.out.println("Value: " + secret.getValue());
} catch (ResourceNotFoundException e) {
    System.out.println("Secret not found");
} catch (HttpResponseException e) {
    int status = e.getResponse().getStatusCode();
    if (status == 403) {
        System.out.println("Access denied - check permissions");
    } else if (status == 429) {
        System.out.println("Rate limited - retry later");
    } else {
        System.out.println("HTTP error: " + status);
    }
}
```

## Secret Properties

| Property | Description |
|----------|-------------|
| `name` | Secret name |
| `value` | Secret value (string) |
| `id` | Full identifier URL |
| `contentType` | MIME type hint |
| `enabled` | Whether secret can be retrieved |
| `notBefore` | Activation time |
| `expiresOn` | Expiration time |
| `createdOn` | Creation timestamp |
| `updatedOn` | Last update timestamp |
| `recoveryLevel` | Soft-delete recovery level |
| `tags` | User-defined metadata |

## Environment Variables

```bash
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net  # Required for vault URL
AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production
```

## Best Practices

1. **Enable Soft Delete** - Protects against accidental deletion
2. **Use Tags** - Tag secrets with environment, service, owner
3. **Set Expiration** - Use `setExpiresOn()` for credentials that should rotate
4. **Content Type** - Set `contentType` to indicate format (e.g., `application/json`)
5. **Version Management** - Don't delete old versions immediately during rotation
6. **Access Logging** - Enable diagnostic logging on Key Vault
7. **Least Privilege** - Use separate vaults for different environments

## Common Secret Types

```java
// Database connection string
secretClient.setSecret(new KeyVaultSecret("db-connection", 
    "Server=myserver.database.windows.net;Database=mydb;...")
    .setProperties(new SecretProperties()
        .setContentType("text/plain")
        .setTags(Map.of("type", "connection-string"))));

// API key
secretClient.setSecret(new KeyVaultSecret("stripe-api-key", "sk_live_...")
    .setProperties(new SecretProperties()
        .setContentType("text/plain")
        .setExpiresOn(OffsetDateTime.now().plusYears(1))));

// JSON configuration
secretClient.setSecret(new KeyVaultSecret("app-config", 
    "{\"endpoint\":\"https://...\",\"key\":\"...\"}")
    .setProperties(new SecretProperties()
        .setContentType("application/json")));

// Certificate password
secretClient.setSecret(new KeyVaultSecret("cert-password", "CertP@ss!")
    .setProperties(new SecretProperties()
        .setContentType("text/plain")
        .setTags(Map.of("certificate", "my-cert"))));
```

## Trigger Phrases

- "Key Vault secrets Java", "secret management Java"
- "store password", "store API key", "connection string"
- "retrieve secret", "rotate secret"
- "Azure secrets", "vault secrets"

Todos los archivos

0 archivos

Instalar azure-security-keyvault-secrets-java

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona el repositorio y copia los archivos de la habilidad a tu proyecto.

git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-java/skills/azure-security-keyvault-secrets-java # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/ Claude detectará y utilizará automáticamente la habilidad
Repositorio microsoft/skills

Habilidades relacionadas

gmgn-portfolio
Tiempo actualizado 1 de julio de 2026
zeroize-audit
Tiempo actualizado 1 de julio de 2026
device-integrity
Tiempo actualizado 29 de junio de 2026
flutter-use-http-package
Tiempo actualizado 30 de junio de 2026
OR