Skip to content

Commit b77d472

Browse files
authored
Merge pull request #5 from fabiante/fix/error-results
Change tool errors from protocol errors to actual tool result errors
2 parents 1f85ba4 + 65b9cbd commit b77d472

File tree

5 files changed

+19
-9
lines changed

5 files changed

+19
-9
lines changed

resources/get_storage_templates.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ func GetStorageTemplate(gs *gsclient.Client) HandlerFactory {
2121
handler := Handler(func(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) {
2222
templates, err := gs.GetTemplateList(ctx)
2323
if err != nil {
24-
return nil, fmt.Errorf("failed to get storage templates: %w", err)
24+
return nil, fmt.Errorf("failed to get storage templates: %w", err) // TODO: Return mcp result/tool/resource error instead of mcp protocol error
2525
}
2626
if len(templates) == 0 {
27-
return nil, fmt.Errorf("no storage templates found")
27+
return nil, fmt.Errorf("no storage templates found") // TODO: Return mcp result/tool/resource error instead of mcp protocol error
2828
}
2929

3030
templatesJSON, err := json.Marshal(templates)
3131
if err != nil {
32-
return nil, fmt.Errorf("failed to marshal templates to JSON: %w", err)
32+
return nil, fmt.Errorf("failed to marshal templates to JSON: %w", err) // TODO: Return mcp result/tool/resource error instead of mcp protocol error
3333
}
3434

3535
return []mcp.ResourceContents{

tools/create_ip.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func CreateIP(gs *gsclient.Client) HandlerFactory {
2525
if ip, err := util.GetIntParam(request.Params.Arguments, "family"); err == nil {
2626
gsRequest.Family = gsclient.IPAddressType(ip)
2727
} else {
28-
return nil, fmt.Errorf("failed to get ip: %w", err)
28+
return newUnparsableIntErrorResult("family", err)
2929
}
3030

3131
if name, ok := request.Params.Arguments["name"]; ok {
@@ -34,7 +34,7 @@ func CreateIP(gs *gsclient.Client) HandlerFactory {
3434

3535
gsResponse, err := gs.CreateIP(ctx, gsRequest)
3636
if err != nil {
37-
return nil, fmt.Errorf("failed to create ip: %w", err)
37+
return mcp.NewToolResultErrorFromErr("failed to create ip", err), nil
3838
}
3939

4040
return mcp.NewToolResultText(fmt.Sprintf("IP %s created with ID: %s", gsResponse.IP, gsResponse.ObjectUUID)), nil

tools/create_storage.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ func CreateStorage(gs *gsclient.Client) HandlerFactory {
3737

3838
capacity, err := util.GetIntParam(request.Params.Arguments, "capacity")
3939
if err != nil {
40-
return nil, fmt.Errorf("capacity parameteris not valid: %w", err)
40+
return newUnparsableIntErrorResult("capacity", err)
4141
}
4242
gsRequest.Capacity = capacity
4343

4444
// TODO: Check if we can somehow report progress back to the client. The mcp doc says: Use progress reporting for long operations https://modelcontextprotocol.io/docs/concepts/tools
4545
gsResponse, err := gs.CreateStorage(ctx, gsRequest)
4646
if err != nil {
47-
return nil, fmt.Errorf("failed to get create storage: %w", err)
47+
return mcp.NewToolResultErrorFromErr("failed to create storage", err), nil
4848
}
4949

5050
return mcp.NewToolResultText(fmt.Sprintf("Storage created with ID: %s", gsResponse.ObjectUUID)), nil

tools/delete_ip.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package tools
22

33
import (
44
"context"
5-
"fmt"
65

76
"github.com/gridscale/gsclient-go/v3"
87
"github.com/mark3labs/mcp-go/mcp"
@@ -20,7 +19,7 @@ func DeleteIP(gs *gsclient.Client) HandlerFactory {
2019
handler := Handler(func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
2120
err := gs.DeleteIP(ctx, request.Params.Arguments["uuid"].(string))
2221
if err != nil {
23-
return nil, fmt.Errorf("failed to delete ip: %w", err)
22+
return mcp.NewToolResultErrorFromErr("failed to delete IP", err), nil
2423
}
2524

2625
return mcp.NewToolResultText("IP has been deleted"), nil

tools/err.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package tools
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/mark3labs/mcp-go/mcp"
7+
)
8+
9+
func newUnparsableIntErrorResult(param string, err error) (*mcp.CallToolResult, error) {
10+
return mcp.NewToolResultErrorFromErr(fmt.Sprintf("invalid %q given, it must be parsable as integer", param), err), nil
11+
}

0 commit comments

Comments
 (0)