Skip to content

Commit e137ec5

Browse files
feat: add sandbox disk and network tools
1 parent 490f7ac commit e137ec5

30 files changed

Lines changed: 825 additions & 2 deletions

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ The server exposes **85+ tools** organized into the following categories:
221221
| **GitHub** | `InstallGithubApp`, `ListConnectedGithubAccounts`, `ListGithubRepositories`, `ListGithubRepositoryBranches`, `GetGithubRepositoryContent` | GitHub integration for repo-based deployments |
222222
| **Account** | `GetCurrentUser`, `GetQuotas`, `GetSupportedProjectTypes` | User info, quotas, and platform capabilities |
223223
| **Transfers** | `TransferProject`, `GetProjectTransferUri`, `ListProjectTransferHistory` | Transfer project ownership between accounts |
224+
| **Sandboxes** | `CreateSandbox`, `UpdateSandbox`, `ExecSandbox`, `DeleteSandbox` | Create, update, execute commands in, and destroy sandbox VMs |
225+
| **Sandbox Disks** | `CreateDisk`, `ListDisks`, `GetDisk`, `DeleteDisk`, `AttachSandboxDisk`, `DetachSandboxDisk`, `ListSandboxDisks` | Register S3 disks and attach them to sandboxes |
226+
| **Sandbox Networks** | `CreateNetwork`, `ListNetworks`, `GetNetwork`, `DeleteNetwork`, `AttachSandboxNetwork`, `DetachSandboxNetwork` | Create private sandbox networks and manage membership |
224227

225228
---
226229

handlers/AttachSandboxDisk.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
mcputils "github.com/NodeOps-app/createos-mcp/helpers"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
type AttachSandboxDiskParams struct {
12+
ID string `json:"id"`
13+
Body map[string]interface{} `json:"body"`
14+
}
15+
16+
func AttachSandboxDiskHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
17+
authInfo, args, err := handleRequest(ctx, request)
18+
if err != nil {
19+
return nil, err
20+
}
21+
22+
params, err := mcputils.ParamsParser[AttachSandboxDiskParams](args)
23+
if err != nil {
24+
return nil, fmt.Errorf("failed to parse parameters: %w", err)
25+
}
26+
27+
return makeSandboxPostRequest(fmt.Sprintf("/v1/sandboxes/%s/disks", params.ID), params.Body, authInfo)
28+
}

handlers/AttachSandboxNetwork.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
mcputils "github.com/NodeOps-app/createos-mcp/helpers"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
type AttachSandboxNetworkParams struct {
12+
ID string `json:"id"`
13+
Body map[string]interface{} `json:"body"`
14+
}
15+
16+
func AttachSandboxNetworkHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
17+
authInfo, args, err := handleRequest(ctx, request)
18+
if err != nil {
19+
return nil, err
20+
}
21+
22+
params, err := mcputils.ParamsParser[AttachSandboxNetworkParams](args)
23+
if err != nil {
24+
return nil, fmt.Errorf("failed to parse parameters: %w", err)
25+
}
26+
27+
return makeSandboxPostRequest(fmt.Sprintf("/v1/sandboxes/%s/networks", params.ID), params.Body, authInfo)
28+
}

handlers/CreateDisk.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
mcputils "github.com/NodeOps-app/createos-mcp/helpers"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
type CreateDiskParams struct {
12+
Body map[string]interface{} `json:"body"`
13+
}
14+
15+
func CreateDiskHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
16+
authInfo, args, err := handleRequest(ctx, request)
17+
if err != nil {
18+
return nil, err
19+
}
20+
21+
params, err := mcputils.ParamsParser[CreateDiskParams](args)
22+
if err != nil {
23+
return nil, fmt.Errorf("failed to parse parameters: %w", err)
24+
}
25+
26+
return makeSandboxPostRequest("/v1/disks", params.Body, authInfo)
27+
}

handlers/CreateNetwork.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
mcputils "github.com/NodeOps-app/createos-mcp/helpers"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
type CreateNetworkParams struct {
12+
Body map[string]interface{} `json:"body"`
13+
}
14+
15+
func CreateNetworkHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
16+
authInfo, args, err := handleRequest(ctx, request)
17+
if err != nil {
18+
return nil, err
19+
}
20+
21+
params, err := mcputils.ParamsParser[CreateNetworkParams](args)
22+
if err != nil {
23+
return nil, fmt.Errorf("failed to parse parameters: %w", err)
24+
}
25+
26+
return makeSandboxPostRequest("/v1/networks", params.Body, authInfo)
27+
}

handlers/DeleteDisk.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
mcputils "github.com/NodeOps-app/createos-mcp/helpers"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
type DeleteDiskParams struct {
12+
IDOrName string `json:"id_or_name"`
13+
}
14+
15+
func DeleteDiskHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
16+
authInfo, args, err := handleRequest(ctx, request)
17+
if err != nil {
18+
return nil, err
19+
}
20+
21+
params, err := mcputils.ParamsParser[DeleteDiskParams](args)
22+
if err != nil {
23+
return nil, fmt.Errorf("failed to parse parameters: %w", err)
24+
}
25+
26+
return makeSandboxDeleteRequest(fmt.Sprintf("/v1/disks/%s", params.IDOrName), authInfo)
27+
}

handlers/DeleteNetwork.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
mcputils "github.com/NodeOps-app/createos-mcp/helpers"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
type DeleteNetworkParams struct {
12+
ID string `json:"id"`
13+
}
14+
15+
func DeleteNetworkHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
16+
authInfo, args, err := handleRequest(ctx, request)
17+
if err != nil {
18+
return nil, err
19+
}
20+
21+
params, err := mcputils.ParamsParser[DeleteNetworkParams](args)
22+
if err != nil {
23+
return nil, fmt.Errorf("failed to parse parameters: %w", err)
24+
}
25+
26+
return makeSandboxDeleteRequest(fmt.Sprintf("/v1/networks/%s", params.ID), authInfo)
27+
}

handlers/DetachSandboxDisk.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
mcputils "github.com/NodeOps-app/createos-mcp/helpers"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
type DetachSandboxDiskParams struct {
12+
ID string `json:"id"`
13+
DiskID string `json:"disk_id"`
14+
MountPath string `json:"mount_path"`
15+
}
16+
17+
func DetachSandboxDiskHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
18+
authInfo, args, err := handleRequest(ctx, request)
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
params, err := mcputils.ParamsParser[DetachSandboxDiskParams](args)
24+
if err != nil {
25+
return nil, fmt.Errorf("failed to parse parameters: %w", err)
26+
}
27+
28+
queryParams := map[string]string{
29+
"mount_path": params.MountPath,
30+
}
31+
32+
return makeSandboxDeleteRequestWithQuery(
33+
fmt.Sprintf("/v1/sandboxes/%s/disks/%s", params.ID, params.DiskID),
34+
queryParams,
35+
authInfo,
36+
)
37+
}

handlers/DetachSandboxNetwork.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
mcputils "github.com/NodeOps-app/createos-mcp/helpers"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
type DetachSandboxNetworkParams struct {
12+
ID string `json:"id"`
13+
Network string `json:"network"`
14+
}
15+
16+
func DetachSandboxNetworkHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
17+
authInfo, args, err := handleRequest(ctx, request)
18+
if err != nil {
19+
return nil, err
20+
}
21+
22+
params, err := mcputils.ParamsParser[DetachSandboxNetworkParams](args)
23+
if err != nil {
24+
return nil, fmt.Errorf("failed to parse parameters: %w", err)
25+
}
26+
27+
return makeSandboxDeleteRequest(fmt.Sprintf("/v1/sandboxes/%s/networks/%s", params.ID, params.Network), authInfo)
28+
}

handlers/GetDisk.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
mcputils "github.com/NodeOps-app/createos-mcp/helpers"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
)
10+
11+
type GetDiskParams struct {
12+
IDOrName string `json:"id_or_name"`
13+
}
14+
15+
func GetDiskHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
16+
authInfo, args, err := handleRequest(ctx, request)
17+
if err != nil {
18+
return nil, err
19+
}
20+
21+
params, err := mcputils.ParamsParser[GetDiskParams](args)
22+
if err != nil {
23+
return nil, fmt.Errorf("failed to parse parameters: %w", err)
24+
}
25+
26+
return makeSandboxGetRequest(fmt.Sprintf("/v1/disks/%s", params.IDOrName), nil, authInfo)
27+
}

0 commit comments

Comments
 (0)