azure-storage-queue-py — Claude Code skill for Azure Queue Storage
A skill that gives the agent working patterns for Azure Queue Storage in Python: sending, receiving and deleting messages. Handy for background jobs.
npx skills add microsoft/skills --skill azure-storage-queue-py -a claude-codeWhat azure-storage-queue-py does
The skill hands the agent ready code for azure-storage-queue: creating a queue, sending strings or JSON, receiving messages with visibility_timeout, extending visibility, peeking without hiding, clearing the queue, and reading properties with metadata. An async path through azure.storage.queue.aio is covered too.
Setup is pip install azure-storage-queue azure-identity. The account address goes into AZURE_STORAGE_ACCOUNT_URL as https://<account>.queue.core.windows.net and is required for every auth method. In production with DefaultAzureCredential, add AZURE_TOKEN_CREDENTIALS=prod.
Two rules run through every sample. Reach for DefaultAzureCredential rather than connection strings or account keys, since keys skip Entra audit and rotation. Wrap each client in a context manager — with in sync code, async with in async code, and the same for the credential from azure.identity.aio. Pick sync or async per module; mixing the two in one call path breaks things.
What it helps with
- run background jobs through a queue
- push a JSON task into Azure Queue Storage
- receive a message and delete it once handled
- extend visibility when processing takes longer
- inspect queue contents without hiding messages
Example prompts for the agent
- Set up task sending to Azure Queue Storage with
QueueClientandDefaultAzureCredential - Show how to receive messages from the queue and delete them after processing
- Write the async version using
azure.storage.queue.aio
How to install azure-storage-queue-py
1Skills CLI (Vercel)
npx skills add microsoft/skills --skill azure-storage-queue-py -a claude-code2Manually: put the files in place
~/.claude/skills/azure-storage-queue-py/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/azure-storage-queue-py/
Manually: put the files in place
.agents/skills/azure-storage-queue-py/SKILL.mdFor all projects use ~/.agents/skills/
Manually: put the files in place
.cursor/skills/azure-storage-queue-py/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install microsoft/skills azure-storage-queue-py2Manually: put the files in place
.github/skills/azure-storage-queue-py/SKILL.mdPlatform CLI
gemini skills install https://github.com/microsoft/skills --path .github/plugins/azure-sdk-python/skills/azure-storage-queue-pyManually: put the files in place
.devin/skills/azure-storage-queue-py/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about azure-storage-queue-py
How do I install azure-storage-queue-py in Claude Code?
Run npx skills add microsoft/skills --skill azure-storage-queue-py -a claude-code. The skill file lands at ~/.claude/skills/azure-storage-queue-py/SKILL.md.
What does azure-storage-queue-py do?
It supplies the agent with Python patterns for Azure Queue Storage: queue creation, sending and receiving messages, deletion, peek, metadata, and an async client.
What do I need before using it?
The azure-storage-queue and azure-identity packages plus an AZURE_STORAGE_ACCOUNT_URL variable holding the account address. Production code using DefaultAzureCredential also sets AZURE_TOKEN_CREDENTIALS=prod.
Source text
SKILL.md · MIT
---
name: azure-storage-queue-py
description: |
Azure Queue Storage SDK for Python. Use for reliable message queuing, task distribution, and asynchronous processing.
Triggers: "queue storage", "QueueServiceClient", "QueueClient", "message queue", "dequeue".
license: MIT
metadata:
author: Microsoft
version: "1.0.0"
package: azure-storage-queue
---
# Azure Queue Storage SDK for Python
Simple, cost-effective message queuing for asynchronous communication.
## Installation
```bash
pip install azure-storage-queue azure-identity
```
## Environment Variables
```bash
AZURE_STORAGE_ACCOUNT_URL=https://<account>.queue.core.windows.net # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```
## Authentication & Lifecycle
> **🔑 Two rules apply to every code sample below:**
>
> 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
> - Local dev: `DefaultAzureCredential` works as-is.
> - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
> 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
> - Sync: `with <Client>(...) as client:`
> - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.
```python
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.storage.queue import QueueServiceClient, QueueClient
# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
account_url = "https://<account>.queue.core.windows.net"
# Service client
with QueueServiceClient(account_url=account_url, credential=credential) as service_client:
# Use service_client here (see following sections for operations)
...
# Queue client
with QueueClient(account_url=account_url, queue_name="myqueue", credential=credential) as queue_client:
# Use queue_client here (see following sections for operations)
...
```
## Queue Operations
```python
# Create queue
service_client.create_queue("myqueue")
# Get queue client
queue_client = service_client.get_queue_client("myqueue")
# Delete queue
service_client.delete_queue("myqueue")
# List queues
for queue in service_client.list_queues():
print(queue.name)
```
## Send Messages
```python
# Send message (string)
queue_client.send_message("Hello, Queue!")
# Send with options
queue_client.send_message(
content="Delayed message",
visibility_timeout=60, # Hidden for 60 seconds
time_to_live=3600 # Expires in 1 hour
)
# Send JSON
import json
data = {"task": "process", "id": 123}
queue_client.send_message(json.dumps(data))
```
## Receive Messages
```python
# Receive messages (makes them invisible temporarily)
messages = queue_client.receive_messages(
messages_per_page=10,
visibility_timeout=30 # 30 seconds to process
)
for message in messages:
print(f"ID: {message.id}")
print(f"Content: {message.content}")
print(f"Dequeue count: {message.dequeue_count}")
# Process message...
# Delete after processing
queue_client.delete_message(message)
```
## Peek Messages
```python
# Peek without hiding (doesn't affect visibility)
messages = queue_client.peek_messages(max_messages=5)
for message in messages:
print(message.content)
```
## Update Message
```python
# Extend visibility or update content
messages = queue_client.receive_messages()
for message in messages:
# Extend timeout (need more time)
queue_client.update_message(
message,
visibility_timeout=60
)
# Update content and timeout
queue_client.update_message(
message,
content="Updated content",
visibility_timeout=60
)
```
## Delete Message
```python
# Delete after successful processing
messages = queue_client.receive_messages()
for message in messages:
try:
# Process...
queue_client.delete_message(message)
except Exception:
# Message becomes visible again after timeout
pass
```
## Clear Queue
```python
# Delete all messages
queue_client.clear_messages()
```
## Queue Properties
```python
# Get queue properties
properties = queue_client.get_queue_properties()
print(f"Approximate message count: {properties.approximate_message_count}")
# Set/get metadata
queue_client.set_queue_metadata(metadata={"environment": "production"})
properties = queue_client.get_queue_properties()
print(properties.metadata)
```
## Async Client
```python
from azure.storage.queue.aio import QueueServiceClient, QueueClient
from azure.identity.aio import DefaultAzureCredential
async def queue_operations():
credential = DefaultAzureCredential()
async with QueueClient(
account_url="https://<account>.queue.core.windows.net",
queue_name="myqueue",
credential=credential
) as client:
# Send
await client.send_message("Async message")
# Receive
async for message in client.receive_messages():
print(message.content)
await client.delete_message(message)
import asyncio
asyncio.run(queue_operations())
```
## Base64 Encoding
```python
from azure.storage.queue import QueueClient, BinaryBase64EncodePolicy, BinaryBase64DecodePolicy
# For binary data
with QueueClient(
account_url=account_url,
queue_name="myqueue",
credential=credential,
message_encode_policy=BinaryBase64EncodePolicy(),
message_decode_policy=BinaryBase64DecodePolicy()
) as queue_client:
# Send bytes
queue_client.send_message(b"Binary content")
```
## Best Practices
1. **Pick sync OR async and stay consistent.** Do not mix `azure.xxx` sync clients with `azure.xxx.aio` async clients in the same call path. Choose one mode per module.
2. **Always use context managers for clients and async credentials.** Wrap every client in `with Client(...) as client:` (sync) or `async with Client(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use `DefaultAzureCredential`** for portable auth across local dev and Azure (avoid connection strings / API keys when possible).
4. **Delete messages after processing** to prevent reprocessing
5. **Set appropriate visibility timeout** based on processing time
6. **Handle `dequeue_count`** for poison message detection
7. **Use async client** for high-throughput scenarios
8. **Use `peek_messages`** for monitoring without affecting queue
9. **Set `time_to_live`** to prevent stale messages
10. **Consider Service Bus** for advanced features (sessions, topics)
## Reference Files
| File | Contents |
|------|----------|
| [references/capabilities.md](references/capabilities.md) | Additional non-hero capabilities, operation-group coverage, and production checklists. |
| [references/non-hero-scenarios.md](references/non-hero-scenarios.md) | Dedicated non-hero examples for secondary/advanced scenarios. |
© Microsoft · MIT · microsoft/skills