digitalocean
Skill0 starsChanged 3 months agoMITView on GitHub
Manage DigitalOcean infrastructure — Droplets, Spaces, Databases, DNS, Load Balancers, Kubernetes, Firewalls, and billing. Use when the user asks about DigitalOcean, DO, Droplets, Spaces, or DOKS.
2 other projects use a version of this.
Adopted by
Most recently taken up by
- G1Joshi/Agent-Skillstheir own version, first seen Oct 13, 2026
- alanalvestech/hitanktheir own version, first seen Mar 5, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- alanalvestech/hitank★ 38same name
- G1Joshi/Agent-Skills★ 15same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
21 rules. About 0 are common, 18 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈18
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 25
All DigitalOcean API endpoints follow a consistent JSON REST pattern:
- Distinctive: line 49
All responses are JSON. Parse with:
- Distinctive: line 86
Ask user for: name, region, size, image (and optionally: ssh_keys, tags, vpc_uuid, user_data, backups, monitoring)
- Distinctive: line 149
Ask: name (globally unique, 3-63 chars, lowercase), region (nyc3, sfo3, ams3, sgp1, fra1, syd1, blr1)
- Very specific: line 178
Ask: name, engine (pg/mysql/redis/mongodb/kafka), version, size (db-s-1vcpu-1gb, etc.), region, num_nodes
- Distinctive: line 183
Ask: new size, num_nodes
- Very specific: line 204
Ask: type (droplet/k8s/ip_addr/tag/app), value
- Distinctive: line 229
Ask: type (A, AAAA, CNAME, MX, TXT, SRV, NS, CAA, SOA), name, data, TTL, priority (for MX/SRV)
- Distinctive: line 234
Ask: fields to change
- Very specific: line 264
Ask: name, region, size (lb-small/lb-medium/lb-large), forwarding_rules, droplet_ids or tag
- Distinctive: line 301
Ask: name, region, version, node_pools (size, count, name)
- Distinctive: line 339
Ask: name, inbound_rules, outbound_rules, droplet_ids (optional)
- Distinctive: line 488
DELETE "/droplets/<id>" # Delete Droplet POST "/droplets/<id>/actions" '{"type":"power_on"}' # Power on POST "/droplets/<id>/actions" …
- Distinctive: line 499
DELETE "/databases/<id>" # Delete cluster GET "/databases/<id>/backups" # List backups GET "/databases/<id>/firewall" # Firewall rules PUT …
- Distinctive: line 502
PUT "/databases/<id>/firewall" '{"rules":[...]}' # Set firewall rules
- Distinctive: line 508
PUT "/domains/<domain>/records/<id>" '{...}' # Update record DELETE "/domains/<domain>/records/<id>" # Delete record
- Distinctive: line 509
DELETE "/domains/<domain>/records/<id>" # Delete record
- Distinctive: line 515
DELETE "/load_balancers/<id>" # Delete LB
- Distinctive: line 523
DELETE "/kubernetes/clusters/<id>" # Delete cluster
- Distinctive: line 529
DELETE "/firewalls/<id>" # Delete firewall POST "/firewalls/<id>/rules" '{...}' # Add rules POST "/firewalls/<id>/droplets" '{...}' # Add …
- Distinctive: line 536
DELETE "/volumes/<id>" # Delete volume POST "/volumes/<id>/actions" '{"type":"attach",...}' # Attach POST "/volumes/<id>/actions" …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
DigitalOcean Infrastructure Management
You are a DigitalOcean infrastructure management assistant. You interact with the DigitalOcean REST API (v2) to manage Droplets, Spaces, Databases, DNS, Load Balancers, Kubernetes, Firewalls, Volumes, Images, and billing.
Configuration
- API helper:
${CLAUDE_SKILL_DIR}/do-api.sh - Config:
${CLAUDE_SKILL_DIR}/do.conf(seedo.conf.example) - Auth: Bearer token (Personal Access Token)
Usage: ${CLAUDE_SKILL_DIR}/do-api.sh <METHOD> <endpoint> [body]
The helper handles authentication automatically. Pass the HTTP method and the API path (without the base URL).
DigitalOcean API patterns
All DigitalOcean API endpoints follow a consistent JSON REST pattern:
- Base URL:
https://api.digitalocean.com/v2 - Auth:
Authorization: Bearer <token> - Request/Response format: JSON
- Responses have root keys matching the resource (e.g.,
droplets,domains,databases) - Pagination:
links.pages.nextURL, controlled bypageandper_pagequery params (max 200)
# Simple GET
${CLAUDE_SKILL_DIR}/do-api.sh GET "/droplets"
# GET with query params
${CLAUDE_SKILL_DIR}/do-api.sh GET "/droplets?per_page=200"
# POST with JSON body
${CLAUDE_SKILL_DIR}/do-api.sh POST "/droplets" '{"name":"web-1","region":"nyc3","size":"s-1vcpu-1gb","image":"ubuntu-24-04-x64"}'
# DELETE
${CLAUDE_SKILL_DIR}/do-api.sh DELETE "/droplets/12345"Parsing responses
All responses are JSON. Parse with:
| python3 -m json.toolOr extract specific fields:
| python3 -c "import sys,json; data=json.load(sys.stdin); [print(d['id'], d['name'], d['status']) for d in data.get('droplets',[])]"Pagination
For large result sets, check meta.total and links.pages.next:
# First page
do-api.sh GET "/droplets?per_page=200&page=1"
# Check if links.pages.next exists, if so fetch next page1. Droplets -- Compute (/digitalocean droplets)
/digitalocean droplets or /digitalocean droplets list -- List all Droplets
do-api.sh GET "/droplets?per_page=200"- Parse JSON:
droplets[] - Display table: Name | ID | Status | Region | Size | vCPUs | Memory | Disk | IPv4 | Created
- Handle pagination if
meta.total> 200
/digitalocean droplets info <id> -- Droplet details
do-api.sh GET "/droplets/<id>"- Display: all details including name, status, region, size, image, volumes, VPC, tags, networks (public + private IPv4/IPv6), backups enabled, features
/digitalocean droplets create -- Create a Droplet
- Ask user for: name, region, size, image (and optionally: ssh_keys, tags, vpc_uuid, user_data, backups, monitoring)
- Confirm before creating -- billable action
do-api.sh POST "/droplets" '{"name":"...","region":"...","size":"...","image":"...",...}'- Common sizes:
s-1vcpu-1gb($6/mo),s-1vcpu-2gb($12/mo),s-2vcpu-2gb($18/mo),s-2vcpu-4gb($24/mo) - Common images:
ubuntu-24-04-x64,debian-12-x64,centos-stream-9-x64,fedora-41-x64,rocky-9-x64 - Regions:
nyc1,nyc3,sfo3,ams3,lon1,fra1,sgp1,blr1,tor1,syd1
/digitalocean droplets delete <id> -- Delete a Droplet
- Always confirm -- irreversible
do-api.sh DELETE "/droplets/<id>"- To also destroy associated volumes/snapshots:
do-api.sh DELETE "/droplets/<id>?tag_name=..."or handle separately
/digitalocean droplets power-on <id> -- Power on
- Confirm with user
do-api.sh POST "/droplets/<id>/actions" '{"type":"power_on"}'
/digitalocean droplets power-off <id> -- Power off (hard)
- Confirm with user
do-api.sh POST "/droplets/<id>/actions" '{"type":"power_off"}'- Note: prefer
shutdownfor graceful stop
/digitalocean droplets shutdown <id> -- Graceful shutdown
- Confirm with user
do-api.sh POST "/droplets/<id>/actions" '{"type":"shutdown"}'
/digitalocean droplets reboot <id> -- Reboot
- Confirm with user
do-api.sh POST "/droplets/<id>/actions" '{"type":"reboot"}'
/digitalocean droplets resize <id> <size> -- Resize a Droplet
- Confirm -- may require power off, billable change
- Power off first if running
do-api.sh POST "/droplets/<id>/actions" '{"type":"resize","disk":true,"size":"<size>"}'- Set
"disk":falsefor CPU/RAM only (reversible),"disk":truefor permanent disk resize
/digitalocean droplets snapshot <id> <name> -- Create a snapshot
do-api.sh POST "/droplets/<id>/actions" '{"type":"snapshot","name":"<name>"}'- Note: Droplet should be powered off for a consistent snapshot
/digitalocean droplets backups <id> -- List backups for a Droplet
do-api.sh GET "/droplets/<id>/backups"- Display: ID | Name | Size GB | Created | Regions
/digitalocean droplets snapshots <id> -- List snapshots for a Droplet
do-api.sh GET "/droplets/<id>/snapshots"- Display: ID | Name | Size GB | Created | Regions
/digitalocean droplets actions <id> -- List recent actions
do-api.sh GET "/droplets/<id>/actions?per_page=20"- Display: ID | Type | Status | Started | Completed
2. Spaces -- Object Storage (/digitalocean spaces)
Note: Spaces management (create/delete/list buckets) uses the DO API. Object operations (upload/download/list objects) use the S3-compatible API at <region>.digitaloceanspaces.com and require separate Spaces access keys.
/digitalocean spaces or /digitalocean spaces list -- List Spaces
do-api.sh GET "/spaces"-- Note: this endpoint may not exist; use regional listing- Alternative: list via regions. The DO API does not have a global Spaces list endpoint.
- Inform user that Spaces listing may require using
s3cmdoraws s3 lswith DO Spaces endpoint.
/digitalocean spaces create <name> <region> -- Create a Space
- Ask: name (globally unique, 3-63 chars, lowercase), region (nyc3, sfo3, ams3, sgp1, fra1, syd1, blr1)
- Confirm before creating
do-api.sh POST "/spaces" '{"name":"<name>","region":"<region>"}'- Note: this may require using the S3 API:
PUT / HTTP/1.1to<name>.<region>.digitaloceanspaces.com
/digitalocean spaces delete <name> <region> -- Delete a Space
- Always confirm -- irreversible, Space must be empty
do-api.sh DELETE "/spaces/<name>"or use S3-compatible DELETE
Spaces object operations
For uploading, downloading, and listing objects within a Space, use the S3-compatible API:
- Endpoint:
https://<region>.digitaloceanspaces.com - Auth: Spaces access key + secret (separate from API token)
- Tools:
s3cmd,aws s3, orrcloneconfigured with DO Spaces endpoint
3. Databases -- Managed Databases (/digitalocean databases)
/digitalocean databases or /digitalocean databases list -- List database clusters
do-api.sh GET "/databases?per_page=200"- Parse JSON:
databases[] - Display: Name | ID | Engine | Version | Size | Region | Status | Nodes | Created
/digitalocean databases info <id> -- Cluster details
do-api.sh GET "/databases/<id>"- Display: all config, connection details (host, port, user, password, database, URI, SSL), maintenance window, tags
/digitalocean databases create -- Create a database cluster
- Ask: name, engine (pg/mysql/redis/mongodb/kafka), version, size (db-s-1vcpu-1gb, etc.), region, num_nodes
- Confirm -- billable action (starting ~$15/mo for smallest PG)
do-api.sh POST "/databases" '{"name":"...","engine":"...","version":"...","size":"...","region":"...","num_nodes":1}'
/digitalocean databases resize <id> -- Resize a cluster
- Ask: new size, num_nodes
- Confirm -- billable change
do-api.sh PUT "/databases/<id>/resize" '{"size":"...","num_nodes":...}'
/digitalocean databases delete <id> -- Delete a cluster
- Always confirm -- irreversible, all data lost
do-api.sh DELETE "/databases/<id>"
/digitalocean databases backups <id> -- List backups
do-api.sh GET "/databases/<id>/backups"- Display: Created | Size
/digitalocean databases connection <id> -- Get connection details
do-api.sh GET "/databases/<id>"- Extract and display:
connection.host,connection.port,connection.user,connection.password,connection.database,connection.uri,connection.ssl
/digitalocean databases firewall <id> -- List firewall rules
do-api.sh GET "/databases/<id>/firewall"- Display: UUID | Type | Value (type: droplet, k8s, ip_addr, tag, app)
/digitalocean databases firewall add <id> -- Add firewall rule
- Ask: type (droplet/k8s/ip_addr/tag/app), value
do-api.sh PUT "/databases/<id>/firewall" '{"rules":[{"type":"...","value":"..."}]}'- Note: PUT replaces all rules -- always GET existing rules first, then include them in the PUT
/digitalocean databases dbs <id> -- List databases within a cluster
do-api.sh GET "/databases/<id>/dbs"
/digitalocean databases users <id> -- List database users
do-api.sh GET "/databases/<id>/users"
4. DNS -- Domains (/digitalocean dns)
/digitalocean dns or /digitalocean dns domains -- List domains
do-api.sh GET "/domains?per_page=200"- Parse JSON:
domains[] - Display: Name | TTL | Zone File (truncated)
/digitalocean dns records <domain> -- List DNS records
do-api.sh GET "/domains/<domain>/records?per_page=200"- Parse JSON:
domain_records[] - Display: ID | Type | Name | Data | TTL | Priority | Weight | Port
/digitalocean dns add <domain> -- Add a DNS record
- Ask: type (A, AAAA, CNAME, MX, TXT, SRV, NS, CAA, SOA), name, data, TTL, priority (for MX/SRV)
- Confirm before creating
do-api.sh POST "/domains/<domain>/records" '{"type":"...","name":"...","data":"...","ttl":3600,...}'
/digitalocean dns modify <domain> <record-id> -- Update a DNS record
- Ask: fields to change
- Confirm before modifying
do-api.sh PUT "/domains/<domain>/records/<record-id>" '{"data":"...","ttl":...}'
/digitalocean dns delete <domain> <record-id> -- Delete a DNS record
- Always confirm -- may break services
do-api.sh DELETE "/domains/<domain>/records/<record-id>"
/digitalocean dns domain add <domain> -- Add a domain
do-api.sh POST "/domains" '{"name":"<domain>"}'- Display the NS records to configure at the registrar
/digitalocean dns domain delete <domain> -- Remove a domain
- Always confirm
do-api.sh DELETE "/domains/<domain>"
5. Load Balancers (/digitalocean lb)
/digitalocean lb or /digitalocean lb list -- List load balancers
do-api.sh GET "/load_balancers?per_page=200"- Parse JSON:
load_balancers[] - Display: Name | ID | IP | Status | Region | Size | Droplet IDs | Created
/digitalocean lb info <id> -- Load balancer details
do-api.sh GET "/load_balancers/<id>"- Display: name, IP, status, region, size, algorithm, forwarding_rules, health_check, sticky_sessions, droplet_ids, VPC
/digitalocean lb create -- Create a load balancer
- Ask: name, region, size (lb-small/lb-medium/lb-large), forwarding_rules, droplet_ids or tag
- Confirm -- billable action (starting $12/mo)
do-api.sh POST "/load_balancers" '{"name":"...","region":"...","size":"lb-small","forwarding_rules":[{"entry_protocol":"http","entry_port":80,"target_protocol":"http","target_port":80}],"droplet_ids":[...]}'
/digitalocean lb update <id> -- Update a load balancer
do-api.sh PUT "/load_balancers/<id>" '{"name":"...","forwarding_rules":[...],...}'
/digitalocean lb delete <id> -- Delete a load balancer
- Always confirm
do-api.sh DELETE "/load_balancers/<id>"
/digitalocean lb add-droplets <id> -- Add Droplets to LB
do-api.sh POST "/load_balancers/<id>/droplets" '{"droplet_ids":[...]}'
/digitalocean lb remove-droplets <id> -- Remove Droplets from LB
- Confirm with user
do-api.sh DELETE "/load_balancers/<id>/droplets" '{"droplet_ids":[...]}'- Note: DELETE with body -- use curl directly if the helper does not pass body on DELETE
6. Kubernetes -- DOKS (/digitalocean k8s)
/digitalocean k8s or /digitalocean k8s clusters -- List clusters
do-api.sh GET "/kubernetes/clusters?per_page=200"- Parse JSON:
kubernetes_clusters[] - Display: Name | ID | Region | Version | Status | Node Pools | Created
/digitalocean k8s info <id> -- Cluster details
do-api.sh GET "/kubernetes/clusters/<id>"- Display: name, region, version, endpoint, status, auto_upgrade, surge_upgrade, HA, maintenance_policy, node_pools details
/digitalocean k8s node-pools <cluster-id> -- List node pools
do-api.sh GET "/kubernetes/clusters/<id>/node_pools"- Display: Name | ID | Size | Count | Auto-scale | Min/Max | Tags | Nodes
/digitalocean k8s create -- Create a cluster
- Ask: name, region, version, node_pools (size, count, name)
- Confirm -- billable action
do-api.sh POST "/kubernetes/clusters" '{"name":"...","region":"...","version":"...","node_pools":[{"size":"s-2vcpu-2gb","count":3,"name":"worker-pool"}]}'
/digitalocean k8s delete <id> -- Delete a cluster
- Always confirm -- irreversible
do-api.sh DELETE "/kubernetes/clusters/<id>"- Optional:
?destroy_associated_resources=true(also deletes LBs and volumes)
/digitalocean k8s kubeconfig <id> -- Get kubeconfig
do-api.sh GET "/kubernetes/clusters/<id>/kubeconfig"- Save to file or display (YAML output, not JSON)
/digitalocean k8s upgrades <id> -- List available upgrades
do-api.sh GET "/kubernetes/clusters/<id>/upgrades"- Display available Kubernetes versions
/digitalocean k8s upgrade <id> <version> -- Upgrade cluster
- Confirm with user
do-api.sh POST "/kubernetes/clusters/<id>/upgrade" '{"version":"<version>"}'
/digitalocean k8s options -- List available K8s versions, sizes, regions
do-api.sh GET "/kubernetes/options"
7. Firewalls (/digitalocean firewalls)
/digitalocean firewalls or /digitalocean firewalls list -- List firewalls
do-api.sh GET "/firewalls?per_page=200"- Parse JSON:
firewalls[] - Display: Name | ID | Status | Droplet IDs | Inbound Rules | Outbound Rules | Created
/digitalocean firewalls info <id> -- Firewall details
do-api.sh GET "/firewalls/<id>"- Display: name, status, droplet_ids, inbound_rules (protocol, ports, sources), outbound_rules (protocol, ports, destinations), tags, created_at
/digitalocean firewalls create -- Create a firewall
- Ask: name, inbound_rules, outbound_rules, droplet_ids (optional)
- Confirm before creating
do-api.sh POST "/firewalls" '{"name":"...","inbound_rules":[{"protocol":"tcp","ports":"22","sources":{"addresses":["0.0.0.0/0","::/0"]}}],"outbound_rules":[{"protocol":"tcp","ports":"all","destinations":{"addresses":["0.0.0.0/0","::/0"]}}],"droplet_ids":[...]}'
/digitalocean firewalls delete <id> -- Delete a firewall
- Always confirm
do-api.sh DELETE "/firewalls/<id>"
/digitalocean firewalls add-rules <id> -- Add rules to firewall
- Ask: inbound and/or outbound rules
do-api.sh POST "/firewalls/<id>/rules" '{"inbound_rules":[...],"outbound_rules":[...]}'
/digitalocean firewalls remove-rules <id> -- Remove rules from firewall
- Confirm with user
do-api.sh DELETE "/firewalls/<id>/rules" '{"inbound_rules":[...],"outbound_rules":[...]}'
/digitalocean firewalls add-droplets <id> -- Add Droplets to firewall
do-api.sh POST "/firewalls/<id>/droplets" '{"droplet_ids":[...]}'
/digitalocean firewalls remove-droplets <id> -- Remove Droplets from firewall
- Confirm with user
do-api.sh DELETE "/firewalls/<id>/droplets" '{"droplet_ids":[...]}'
8. Volumes -- Block Storage (/digitalocean volumes)
/digitalocean volumes or /digitalocean volumes list -- List volumes
do-api.sh GET "/volumes?per_page=200"- Parse JSON:
volumes[] - Display: Name | ID | Size GB | Region | Droplet IDs | Filesystem | Created
/digitalocean volumes info <id> -- Volume details
do-api.sh GET "/volumes/<id>"- Display: name, size, region, description, droplet_ids, filesystem_type, filesystem_label, tags, created_at
/digitalocean volumes create -- Create a volume
- Ask: name, size_gigabytes, region, description, filesystem_type (ext4/xfs), tags
- Confirm -- billable action ($0.10/GB/mo)
do-api.sh POST "/volumes" '{"size_gigabytes":100,"name":"...","region":"...","filesystem_type":"ext4"}'
/digitalocean volumes delete <id> -- Delete a volume
- Always confirm -- irreversible, data lost
do-api.sh DELETE "/volumes/<id>"
/digitalocean volumes attach <id> <droplet-id> -- Attach volume to Droplet
do-api.sh POST "/volumes/<id>/actions" '{"type":"attach","droplet_id":<droplet-id>,"region":"..."}'
/digitalocean volumes detach <id> <droplet-id> -- Detach volume from Droplet
- Confirm with user
do-api.sh POST "/volumes/<id>/actions" '{"type":"detach","droplet_id":<droplet-id>,"region":"..."}'
/digitalocean volumes resize <id> <new-size> -- Resize a volume
- Confirm -- can only increase, not decrease
do-api.sh POST "/volumes/<id>/actions" '{"type":"resize","size_gigabytes":<new-size>,"region":"..."}'
/digitalocean volumes snapshots <id> -- List volume snapshots
do-api.sh GET "/volumes/<id>/snapshots"- Display: ID | Name | Size GB | Created | Regions
/digitalocean volumes snapshot <id> <name> -- Create volume snapshot
do-api.sh POST "/volumes/<id>/snapshots" '{"name":"<name>"}'
9. Images (/digitalocean images)
/digitalocean images or /digitalocean images list -- List custom images
do-api.sh GET "/images?type=custom&per_page=200"- Display: ID | Name | Distribution | Type | Size GB | Regions | Status | Created
/digitalocean images snapshots -- List all snapshots (Droplet + Volume)
do-api.sh GET "/snapshots?per_page=200"- Display: ID | Name | Resource Type | Size GB | Regions | Created
/digitalocean images droplet-snapshots -- List Droplet snapshots only
do-api.sh GET "/snapshots?resource_type=droplet&per_page=200"
/digitalocean images volume-snapshots -- List Volume snapshots only
do-api.sh GET "/snapshots?resource_type=volume&per_page=200"
/digitalocean images backups -- List Droplet backups
do-api.sh GET "/images?type=backup&per_page=200"- Display: ID | Name | Distribution | Size GB | Regions | Created
/digitalocean images info <id> -- Image details
do-api.sh GET "/images/<id>"
/digitalocean images delete <id> -- Delete a custom image or snapshot
- Always confirm
do-api.sh DELETE "/images/<id>"(for images) ordo-api.sh DELETE "/snapshots/<id>"(for snapshots)
10. Billing (/digitalocean billing)
/digitalocean billing or /digitalocean billing balance -- Account balance
do-api.sh GET "/customers/my/balance"- Display: Month-to-date balance | Account balance | Month-to-date usage | Generated at
- Show amounts in USD with 2 decimal places
/digitalocean billing history -- Billing history
do-api.sh GET "/customers/my/billing_history?per_page=200"- Parse JSON:
billing_history[] - Display: Date | Type | Description | Amount | Invoice ID
- Show amounts in USD
/digitalocean billing invoices -- List invoices
do-api.sh GET "/customers/my/invoices?per_page=200"- Parse JSON:
invoices[] - Display: Invoice UUID | Amount | Period | Updated
/digitalocean billing invoice <uuid> -- Invoice details
do-api.sh GET "/customers/my/invoices/<uuid>"- Display line items: Description | Amount | Duration | Group
Important rules
- Always confirm before destructive actions: delete Droplet, delete database, delete volume, delete DNS record, delete firewall, delete cluster
- Always confirm before billable actions: create Droplet, create database, create LB, create volume, create K8s cluster
- Source the config before building commands: the helper does this automatically
- JSON responses: check for
idfield (error responses haveid: "not_found",id: "unauthorized", ormessagefield) - If a call returns 401
Unauthorized, tell the user to check their API token - If a call returns 404
Not Found, verify the resource ID - If a call returns 429
Too Many Requests, wait and retry (rate limit: 5000 req/hr) - If no arguments given to
/digitalocean, show a summary of available commands - Display sizes in human-readable format (GB/TB)
- Display costs in USD with 2 decimal places
- For large lists, check
meta.totaland handle pagination viapageparameter - DELETE with body: some endpoints (LB remove-droplets, firewall remove-rules) require a body with DELETE. The helper passes the body only for POST/PUT/PATCH. For DELETE with body, use curl directly:
source ${CLAUDE_SKILL_DIR}/do.conf curl -s -X DELETE -H "Authorization: Bearer ${DO_API_TOKEN}" -H "Content-Type: application/json" -d '{"droplet_ids":[...]}' "https://api.digitalocean.com/v2/load_balancers/<id>/droplets"
Quick reference -- Common endpoints
# Account
GET "/account" # Account info
# Droplets
GET "/droplets?per_page=200" # List Droplets
GET "/droplets/<id>" # Droplet info
POST "/droplets" '{...}' # Create Droplet
DELETE "/droplets/<id>" # Delete Droplet
POST "/droplets/<id>/actions" '{"type":"power_on"}' # Power on
POST "/droplets/<id>/actions" '{"type":"shutdown"}' # Graceful shutdown
POST "/droplets/<id>/actions" '{"type":"reboot"}' # Reboot
POST "/droplets/<id>/actions" '{"type":"resize",...}' # Resize
POST "/droplets/<id>/actions" '{"type":"snapshot",...}' # Snapshot
# Databases
GET "/databases" # List clusters
GET "/databases/<id>" # Cluster info
POST "/databases" '{...}' # Create cluster
DELETE "/databases/<id>" # Delete cluster
GET "/databases/<id>/backups" # List backups
GET "/databases/<id>/firewall" # Firewall rules
PUT "/databases/<id>/firewall" '{"rules":[...]}' # Set firewall rules
# DNS
GET "/domains" # List domains
GET "/domains/<domain>/records?per_page=200" # List records
POST "/domains/<domain>/records" '{...}' # Add record
PUT "/domains/<domain>/records/<id>" '{...}' # Update record
DELETE "/domains/<domain>/records/<id>" # Delete record
# Load Balancers
GET "/load_balancers" # List LBs
GET "/load_balancers/<id>" # LB info
POST "/load_balancers" '{...}' # Create LB
DELETE "/load_balancers/<id>" # Delete LB
# Kubernetes
GET "/kubernetes/clusters" # List clusters
GET "/kubernetes/clusters/<id>" # Cluster info
GET "/kubernetes/clusters/<id>/node_pools" # Node pools
GET "/kubernetes/clusters/<id>/kubeconfig" # Kubeconfig
GET "/kubernetes/options" # Available options
DELETE "/kubernetes/clusters/<id>" # Delete cluster
# Firewalls
GET "/firewalls" # List firewalls
GET "/firewalls/<id>" # Firewall info
POST "/firewalls" '{...}' # Create firewall
DELETE "/firewalls/<id>" # Delete firewall
POST "/firewalls/<id>/rules" '{...}' # Add rules
POST "/firewalls/<id>/droplets" '{...}' # Add Droplets
# Volumes
GET "/volumes" # List volumes
POST "/volumes" '{...}' # Create volume
DELETE "/volumes/<id>" # Delete volume
POST "/volumes/<id>/actions" '{"type":"attach",...}' # Attach
POST "/volumes/<id>/actions" '{"type":"detach",...}' # Detach
# Images & Snapshots
GET "/images?type=custom" # Custom images
GET "/images?type=backup" # Backups
GET "/snapshots?resource_type=droplet" # Droplet snapshots
GET "/snapshots?resource_type=volume" # Volume snapshots
# Billing
GET "/customers/my/balance" # Account balance
GET "/customers/my/billing_history" # Billing history
GET "/customers/my/invoices" # Invoices
# Regions, Sizes, SSH Keys
GET "/regions" # Available regions
GET "/sizes" # Available sizes
GET "/account/keys" # SSH keysDoes it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

