Skip to content

Commit 2fce383

Browse files
hyperpolymathclaude
andcommitted
feat: add render, digitalocean, linode cartridges
Completes Tier 3 cloud infrastructure cartridges: - render-mcp: 16 MCP tools, service/deploy/domain management - digitalocean-mcp: 18 MCP tools, droplets/volumes/domains/firewalls - linode-mcp: 18 MCP tools, instances/volumes/NodeBalancers All with Zig FFI, V-lang adapter, Idris2 ABI, PanLL panels, tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent f28cb5b commit 2fce383

6 files changed

Lines changed: 1610 additions & 0 deletions

File tree

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
{
2+
"$schema": "https://boj.dev/schemas/cartridge/v1.json",
3+
"spdx": "PMPL-1.0-or-later",
4+
"copyright": "Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath)",
5+
"name": "digitalocean-mcp",
6+
"version": "0.2.0",
7+
"description": "DigitalOcean cloud infrastructure cartridge -- droplets, volumes, domains, SSH keys, snapshots, databases, Kubernetes, firewalls, load balancers, and account management",
8+
"domain": "Cloud",
9+
"tier": "Ayo",
10+
"protocols": ["MCP", "REST"],
11+
"auth": {
12+
"method": "bearer_token",
13+
"env_var": "DIGITALOCEAN_TOKEN",
14+
"credential_source": "vault-mcp"
15+
},
16+
"api": {
17+
"base_url": "https://api.digitalocean.com/v2",
18+
"rate_limit_per_hour": 5000,
19+
"content_type": "application/json"
20+
},
21+
"tools": [
22+
{
23+
"name": "digitalocean_list_droplets",
24+
"description": "List all droplets in the DigitalOcean account",
25+
"inputSchema": {
26+
"type": "object",
27+
"properties": {
28+
"page": { "type": "number", "description": "Page number (default 1)" },
29+
"per_page": { "type": "number", "description": "Results per page (default 20, max 200)" },
30+
"tag_name": { "type": "string", "description": "Filter by tag name" },
31+
"name": { "type": "string", "description": "Filter by exact droplet name" }
32+
}
33+
}
34+
},
35+
{
36+
"name": "digitalocean_get_droplet",
37+
"description": "Get details of a specific DigitalOcean droplet by ID",
38+
"inputSchema": {
39+
"type": "object",
40+
"properties": {
41+
"droplet_id": { "type": "number", "description": "Numeric droplet ID" }
42+
},
43+
"required": ["droplet_id"]
44+
}
45+
},
46+
{
47+
"name": "digitalocean_create_droplet",
48+
"description": "Create a new DigitalOcean droplet",
49+
"inputSchema": {
50+
"type": "object",
51+
"properties": {
52+
"name": { "type": "string", "description": "Droplet hostname" },
53+
"region": { "type": "string", "description": "Region slug (e.g. nyc1, sfo3, ams3, lon1, fra1, sgp1, blr1, syd1)" },
54+
"size": { "type": "string", "description": "Size slug (e.g. s-1vcpu-1gb, s-2vcpu-2gb, s-4vcpu-8gb, g-2vcpu-8gb)" },
55+
"image": { "type": "string", "description": "Image slug or ID (e.g. ubuntu-24-04-x64, debian-12-x64, fedora-41-x64)" },
56+
"ssh_keys": { "type": "array", "items": { "type": "string" }, "description": "SSH key IDs or fingerprints to install" },
57+
"backups": { "type": "boolean", "description": "Enable weekly backups (default false)" },
58+
"ipv6": { "type": "boolean", "description": "Enable IPv6 (default false)" },
59+
"monitoring": { "type": "boolean", "description": "Enable monitoring agent (default false)" },
60+
"user_data": { "type": "string", "description": "Cloud-init user data (cloud-config or script)" },
61+
"tags": { "type": "array", "items": { "type": "string" }, "description": "Tags to apply to the droplet" },
62+
"vpc_uuid": { "type": "string", "description": "VPC UUID to place the droplet in" },
63+
"volumes": { "type": "array", "items": { "type": "string" }, "description": "Volume IDs to attach" }
64+
},
65+
"required": ["name", "region", "size", "image"]
66+
}
67+
},
68+
{
69+
"name": "digitalocean_delete_droplet",
70+
"description": "Delete a DigitalOcean droplet (irreversible)",
71+
"inputSchema": {
72+
"type": "object",
73+
"properties": {
74+
"droplet_id": { "type": "number", "description": "Numeric droplet ID to delete" }
75+
},
76+
"required": ["droplet_id"]
77+
}
78+
},
79+
{
80+
"name": "digitalocean_droplet_action",
81+
"description": "Perform a power action on a DigitalOcean droplet (power_on, power_off, reboot, shutdown, power_cycle, rebuild, resize, rename)",
82+
"inputSchema": {
83+
"type": "object",
84+
"properties": {
85+
"droplet_id": { "type": "number", "description": "Numeric droplet ID" },
86+
"type": { "type": "string", "description": "Action type: power_on, power_off, reboot, shutdown, power_cycle, rebuild, resize, rename" },
87+
"image": { "type": "string", "description": "Image slug or ID (required for rebuild)" },
88+
"size": { "type": "string", "description": "Size slug (required for resize)" },
89+
"name": { "type": "string", "description": "New name (required for rename)" }
90+
},
91+
"required": ["droplet_id", "type"]
92+
}
93+
},
94+
{
95+
"name": "digitalocean_list_volumes",
96+
"description": "List all block storage volumes in the DigitalOcean account",
97+
"inputSchema": {
98+
"type": "object",
99+
"properties": {
100+
"page": { "type": "number", "description": "Page number" },
101+
"per_page": { "type": "number", "description": "Results per page" },
102+
"region": { "type": "string", "description": "Filter by region slug" },
103+
"name": { "type": "string", "description": "Filter by exact volume name" }
104+
}
105+
}
106+
},
107+
{
108+
"name": "digitalocean_create_volume",
109+
"description": "Create a new block storage volume in DigitalOcean",
110+
"inputSchema": {
111+
"type": "object",
112+
"properties": {
113+
"name": { "type": "string", "description": "Volume name" },
114+
"size_gigabytes": { "type": "number", "description": "Size in GB (min 1, max 16384)" },
115+
"region": { "type": "string", "description": "Region slug (e.g. nyc1)" },
116+
"description": { "type": "string", "description": "Volume description" },
117+
"filesystem_type": { "type": "string", "description": "Filesystem type: ext4 or xfs" },
118+
"tags": { "type": "array", "items": { "type": "string" }, "description": "Tags to apply" },
119+
"snapshot_id": { "type": "string", "description": "Snapshot ID to create volume from" }
120+
},
121+
"required": ["name", "size_gigabytes", "region"]
122+
}
123+
},
124+
{
125+
"name": "digitalocean_list_domains",
126+
"description": "List all DNS domains in the DigitalOcean account",
127+
"inputSchema": {
128+
"type": "object",
129+
"properties": {
130+
"page": { "type": "number", "description": "Page number" },
131+
"per_page": { "type": "number", "description": "Results per page" }
132+
}
133+
}
134+
},
135+
{
136+
"name": "digitalocean_create_domain",
137+
"description": "Create a new DNS domain in DigitalOcean",
138+
"inputSchema": {
139+
"type": "object",
140+
"properties": {
141+
"name": { "type": "string", "description": "Domain name (e.g. example.com)" },
142+
"ip_address": { "type": "string", "description": "IP address to create an initial A record" }
143+
},
144+
"required": ["name"]
145+
}
146+
},
147+
{
148+
"name": "digitalocean_list_ssh_keys",
149+
"description": "List all SSH keys in the DigitalOcean account",
150+
"inputSchema": {
151+
"type": "object",
152+
"properties": {
153+
"page": { "type": "number", "description": "Page number" },
154+
"per_page": { "type": "number", "description": "Results per page" }
155+
}
156+
}
157+
},
158+
{
159+
"name": "digitalocean_list_snapshots",
160+
"description": "List all snapshots (droplet snapshots and volume snapshots) in the account",
161+
"inputSchema": {
162+
"type": "object",
163+
"properties": {
164+
"page": { "type": "number", "description": "Page number" },
165+
"per_page": { "type": "number", "description": "Results per page" },
166+
"resource_type": { "type": "string", "description": "Filter by type: droplet or volume" }
167+
}
168+
}
169+
},
170+
{
171+
"name": "digitalocean_create_snapshot",
172+
"description": "Create a snapshot of a DigitalOcean droplet",
173+
"inputSchema": {
174+
"type": "object",
175+
"properties": {
176+
"droplet_id": { "type": "number", "description": "Droplet ID to snapshot" },
177+
"name": { "type": "string", "description": "Snapshot name" }
178+
},
179+
"required": ["droplet_id", "name"]
180+
}
181+
},
182+
{
183+
"name": "digitalocean_list_databases",
184+
"description": "List all managed database clusters in the DigitalOcean account",
185+
"inputSchema": {
186+
"type": "object",
187+
"properties": {
188+
"page": { "type": "number", "description": "Page number" },
189+
"per_page": { "type": "number", "description": "Results per page" },
190+
"tag_name": { "type": "string", "description": "Filter by tag" }
191+
}
192+
}
193+
},
194+
{
195+
"name": "digitalocean_list_firewalls",
196+
"description": "List all firewalls in the DigitalOcean account",
197+
"inputSchema": {
198+
"type": "object",
199+
"properties": {
200+
"page": { "type": "number", "description": "Page number" },
201+
"per_page": { "type": "number", "description": "Results per page" }
202+
}
203+
}
204+
},
205+
{
206+
"name": "digitalocean_create_firewall",
207+
"description": "Create a new firewall with inbound and outbound rules in DigitalOcean",
208+
"inputSchema": {
209+
"type": "object",
210+
"properties": {
211+
"name": { "type": "string", "description": "Firewall name" },
212+
"inbound_rules": { "type": "array", "items": { "type": "object" }, "description": "Inbound rules (protocol, ports, sources)" },
213+
"outbound_rules": { "type": "array", "items": { "type": "object" }, "description": "Outbound rules (protocol, ports, destinations)" },
214+
"droplet_ids": { "type": "array", "items": { "type": "number" }, "description": "Droplet IDs to apply to" },
215+
"tags": { "type": "array", "items": { "type": "string" }, "description": "Tags to apply to" }
216+
},
217+
"required": ["name", "inbound_rules", "outbound_rules"]
218+
}
219+
},
220+
{
221+
"name": "digitalocean_list_load_balancers",
222+
"description": "List all load balancers in the DigitalOcean account",
223+
"inputSchema": {
224+
"type": "object",
225+
"properties": {
226+
"page": { "type": "number", "description": "Page number" },
227+
"per_page": { "type": "number", "description": "Results per page" }
228+
}
229+
}
230+
},
231+
{
232+
"name": "digitalocean_get_account",
233+
"description": "Get DigitalOcean account information (email, UUID, droplet limit, status, team)",
234+
"inputSchema": {
235+
"type": "object",
236+
"properties": {}
237+
}
238+
},
239+
{
240+
"name": "digitalocean_get_balance",
241+
"description": "Get current DigitalOcean account balance and billing information",
242+
"inputSchema": {
243+
"type": "object",
244+
"properties": {}
245+
}
246+
}
247+
]
248+
}

0 commit comments

Comments
 (0)