Skip to content

Commit 0e924f4

Browse files
wesleyjellisclaude
andauthored
Improve error handling to use MCP tool-level errors for better LLM integration (#55)
🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <[email protected]>
1 parent c36d550 commit 0e924f4

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

src/cmd/root.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,11 @@ type serializedCheckResults struct {
9494
// newToolResult creates a CallToolResult for the passed object handling any json marshaling errors
9595
func newToolResult(obj any, err error) (*mcp.CallToolResult, error) {
9696
if err != nil {
97-
return nil, err
97+
return mcp.NewToolResultErrorFromErr("operation failed", err), nil
9898
}
9999
data, err := json.Marshal(obj)
100100
if err != nil {
101-
return nil, err
101+
return mcp.NewToolResultErrorFromErr("failed to marshal response", err), nil
102102
}
103103
return mcp.NewToolResultText(string(data)), nil
104104
}
@@ -215,7 +215,7 @@ var rootCmd = &cobra.Command{
215215
func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
216216
resp, err := client.ListServices(nil)
217217
if err != nil {
218-
return nil, err
218+
return mcp.NewToolResultErrorFromErr("failed to list components", err), nil
219219
}
220220
var components []serializedComponent
221221
for _, node := range resp.Nodes {
@@ -250,7 +250,7 @@ var rootCmd = &cobra.Command{
250250
func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
251251
resp, err := client.ListInfrastructure(nil)
252252
if err != nil {
253-
return nil, err
253+
return mcp.NewToolResultErrorFromErr("failed to list infrastructure", err), nil
254254
}
255255
var infrastructureResources []serializedInfrastructureResource
256256
for _, node := range resp.Nodes {
@@ -320,11 +320,11 @@ var rootCmd = &cobra.Command{
320320
func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
321321
resourceTypeString, err := req.RequireString("resourceType")
322322
if err != nil {
323-
return nil, err
323+
return mcp.NewToolResultError("resourceType parameter is required"), nil
324324
}
325325
identifier, err := req.RequireString("identifier")
326326
if err != nil {
327-
return nil, err
327+
return mcp.NewToolResultError("identifier parameter is required"), nil
328328
}
329329
resourceType := opslevel.AliasOwnerTypeEnum(resourceTypeString)
330330
resp, err := client.GetAliasableResource(resourceType, identifier)
@@ -376,7 +376,7 @@ var rootCmd = &cobra.Command{
376376
func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
377377
id, err := req.RequireString("id")
378378
if err != nil {
379-
return nil, err
379+
return mcp.NewToolResultError("id parameter is required"), nil
380380
}
381381
resp, err := client.GetDocument(opslevel.ID(id))
382382
return newToolResult(resp, err)
@@ -399,7 +399,7 @@ var rootCmd = &cobra.Command{
399399
func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
400400
serviceId, err := req.RequireString("serviceId")
401401
if err != nil {
402-
return nil, err
402+
return mcp.NewToolResultError("serviceId parameter is required"), nil
403403
}
404404
service := opslevel.Service{
405405
ServiceId: opslevel.ServiceId{
@@ -428,7 +428,7 @@ var rootCmd = &cobra.Command{
428428
func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
429429
resp, err := client.ListChecks(nil)
430430
if err != nil {
431-
return nil, err
431+
return mcp.NewToolResultErrorFromErr("failed to list checks", err), nil
432432
}
433433
var checks []serializedCheck
434434
for _, node := range resp.Nodes {
@@ -463,19 +463,19 @@ var rootCmd = &cobra.Command{
463463
func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
464464
serviceId, err := req.RequireString("serviceId")
465465
if err != nil {
466-
return nil, err
466+
return mcp.NewToolResultError("serviceId parameter is required"), nil
467467
}
468468
service, err := client.GetService(serviceId)
469469
if err != nil {
470-
return nil, err
470+
return mcp.NewToolResultErrorFromErr("failed to get service", err), nil
471471
}
472472
if service.Id == "" {
473-
return nil, fmt.Errorf("service with id %s not found", serviceId)
473+
return mcp.NewToolResultError(fmt.Sprintf("service with id %s not found", serviceId)), nil
474474
}
475475

476476
stats, err := service.GetServiceStats(client)
477477
if err != nil {
478-
return nil, err
478+
return mcp.NewToolResultErrorFromErr("failed to get service stats", err), nil
479479
}
480480

481481
result := serializedCheckResults{

0 commit comments

Comments
 (0)