{"openapi":"3.1.0","info":{"title":"Digital Ocean Storage (BYOK) API","version":"0.1.0","description":"Digital Ocean Storage (BYOK) lets an AI assistant read your own Digital Ocean Storage data through the Digital Ocean Storage API with a key you supply (personal access token with block storage, image and snapshot read scope). Read-only: 10 tools (list_volumes, get_volume, list_volume_snapshots, list_snapshots, get_snapshot, list_images, get_image, list_nfs_shares, get_nfs_share,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-digitalocean-storage.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-digitalocean-storage/docs"},"termsOfService":"https://connectorbay.com/byok-digitalocean-storage/terms"},"servers":[{"url":"https://byok-digitalocean-storage.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-digitalocean-storage/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_volumes":{"post":{"operationId":"list_volumes","summary":"List block storage volumes with size, region, attached Droplets, filesystem type and tags. Use for \"Which block storage ","description":"List block storage volumes with size, region, attached Droplets, filesystem type and tags. Use for \"Which block storage volumes do I have and where are they attached\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"volume_name":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"description":"Only the volume with this exact name.","title":"Volume Name"},"region":{"anyOf":[{"maxLength":20,"type":"string"},{"type":"null"}],"default":null,"description":"Only volumes in this region slug.","title":"Region"},"per_page":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results per page (1 to 200).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1; meta.total says how many items exist.","title":"Page"}},"title":"list_volumesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_volume":{"post":{"operationId":"get_volume","summary":"Get one block storage volume. Use for \"How big is volume 506f78a4 and which Droplet uses it\".","description":"Get one block storage volume. Use for \"How big is volume 506f78a4 and which Droplet uses it\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"volume_id":{"description":"Block storage volume id (UUID), as returned by list_volumes.","maxLength":64,"title":"Volume Id","type":"string"}},"required":["volume_id"],"title":"get_volumeArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_volume_snapshots":{"post":{"operationId":"list_volume_snapshots","summary":"List the snapshots of one block storage volume. Use for \"Which snapshots exist for volume 506f78a4\".","description":"List the snapshots of one block storage volume. Use for \"Which snapshots exist for volume 506f78a4\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"volume_id":{"description":"Block storage volume id (UUID), as returned by list_volumes.","maxLength":64,"title":"Volume Id","type":"string"},"per_page":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results per page (1 to 200).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1; meta.total says how many items exist.","title":"Page"}},"required":["volume_id"],"title":"list_volume_snapshotsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_snapshots":{"post":{"operationId":"list_snapshots","summary":"List Droplet and volume snapshots with size, regions and source resource. Use for \"What snapshots do I have and how larg","description":"List Droplet and volume snapshots with size, regions and source resource. Use for \"What snapshots do I have and how large are they\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"resource_type":{"anyOf":[{"enum":["droplet","volume"],"type":"string"},{"type":"null"}],"default":null,"description":"Only snapshots of this kind.","title":"Resource Type"},"per_page":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results per page (1 to 200).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1; meta.total says how many items exist.","title":"Page"}},"title":"list_snapshotsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_snapshot":{"post":{"operationId":"get_snapshot","summary":"Get one snapshot by id. Use for \"What is snapshot fbe805e8 of\".","description":"Get one snapshot by id. Use for \"What is snapshot fbe805e8 of\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"snapshot_id":{"description":"Snapshot id, as returned by list_snapshots.","maxLength":64,"title":"Snapshot Id","type":"string"}},"required":["snapshot_id"],"title":"get_snapshotArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_images":{"post":{"operationId":"list_images","summary":"List images (distributions, applications, your snapshots and backups, custom images) with slug, regions, size and status","description":"List images (distributions, applications, your snapshots and backups, custom images) with slug, regions, size and status. Use for \"Which custom images and snapshots can I create Droplets from\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"type":{"anyOf":[{"enum":["distribution","application"],"type":"string"},{"type":"null"}],"default":null,"description":"Only images of this type.","title":"Type"},"private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True to list only your own private images.","title":"Private"},"tag_name":{"anyOf":[{"maxLength":255,"type":"string"},{"type":"null"}],"default":null,"description":"Only images with this tag.","title":"Tag Name"},"per_page":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many results per page (1 to 200).","title":"Per Page"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1; meta.total says how many items exist.","title":"Page"}},"title":"list_imagesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_image":{"post":{"operationId":"get_image","summary":"Get one image by id or slug. Use for \"What is image 7938269\".","description":"Get one image by id or slug. Use for \"What is image 7938269\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"image_id":{"description":"Image id (number) or slug, as returned by list_images.","maxLength":64,"title":"Image Id","type":"string"}},"required":["image_id"],"title":"get_imageArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_nfs_shares":{"post":{"operationId":"list_nfs_shares","summary":"List NFS shares in a region with size, status, performance tier and VPCs. Use for \"Which NFS shares do I have in nyc1\".","description":"List NFS shares in a region with size, status, performance tier and VPCs. Use for \"Which NFS shares do I have in nyc1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"region":{"description":"Region slug, for example nyc1 (NFS endpoints need a region).","maxLength":20,"title":"Region","type":"string"}},"required":["region"],"title":"list_nfs_sharesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_nfs_share":{"post":{"operationId":"get_nfs_share","summary":"Get one NFS share: size, status, performance tier, mount path and host. Use for \"Where do I mount NFS share 0a1b2c3d\".","description":"Get one NFS share: size, status, performance tier, mount path and host. Use for \"Where do I mount NFS share 0a1b2c3d\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"nfs_id":{"description":"NFS share id, as returned by list_nfs_shares.","maxLength":64,"title":"Nfs Id","type":"string"},"region":{"description":"Region slug, for example nyc1 (NFS endpoints need a region).","maxLength":20,"title":"Region","type":"string"}},"required":["nfs_id","region"],"title":"get_nfs_shareArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_nfs_snapshots":{"post":{"operationId":"list_nfs_snapshots","summary":"List NFS share snapshots in a region, optionally for one share. Use for \"Which snapshots exist for my NFS shares\".","description":"List NFS share snapshots in a region, optionally for one share. Use for \"Which snapshots exist for my NFS shares\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"region":{"description":"Region slug, for example nyc1 (NFS endpoints need a region).","maxLength":20,"title":"Region","type":"string"},"share_id":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"description":"Only snapshots of this share.","title":"Share Id"}},"required":["region"],"title":"list_nfs_snapshotsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}