del.go•1.66 kB
package tools
import (
	"context"
	"fmt"
	"strconv"
	"github.com/dicedb/dicedb-go/wire"
	"github.com/mark3labs/mcp-go/mcp"
	"github.com/pottekkat/dicedb-mcp/internal/utils"
)
// NewDelTool creates a new DEL tool for DiceDB
func NewDelTool() mcp.Tool {
	return mcp.NewTool("del",
		mcp.WithDescription("Delete one or more keys from DiceDB"),
		utils.CommonURLParam(),
		mcp.WithArray("keys",
			mcp.Items(map[string]any{"type": "string"}),
			mcp.Required(),
			mcp.Description("The keys to delete from DiceDB"),
		),
	)
}
// HandleDelTool handles the DEL tool request
func HandleDelTool(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
	keys, ok := request.Params.Arguments["keys"].([]any)
	if !ok || len(keys) == 0 {
		return nil, fmt.Errorf("missing or empty keys parameter")
	}
	// Convert the keys to strings
	stringKeys := make([]string, len(keys))
	for i, key := range keys {
		stringKeys[i] = fmt.Sprintf("%v", key)
	}
	client, err := utils.GetClientFromRequest(request)
	if err != nil {
		return nil, err
	}
	resp := client.Fire(&wire.Command{
		Cmd:  "DEL",
		Args: stringKeys,
	})
	if resp.Err != "" {
		return nil, fmt.Errorf("DiceDB error: %s", resp.Err)
	}
	value := utils.FormatDiceDBResponse(resp)
	// The response is the number of keys deleted
	count, err := strconv.Atoi(value)
	if err != nil {
		return nil, fmt.Errorf("unexpected response format: %s", value)
	}
	if count == 0 {
		return mcp.NewToolResultText("No keys were deleted"), nil
	} else if count == 1 {
		return mcp.NewToolResultText("Deleted 1 key"), nil
	}
	return mcp.NewToolResultText(fmt.Sprintf("Deleted %d keys", count)), nil
}