1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package tools
6
7import (
8 "context"
9 "fmt"
10 "strings"
11
12 "git.sr.ht/~amolith/lunatask-mcp-server/lunatask"
13 "github.com/mark3labs/mcp-go/mcp"
14)
15
16// HandleListHabitsAndActivities handles the list_habits_and_activities tool call.
17func (h *Handlers) HandleListHabitsAndActivities(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
18 var b strings.Builder
19 for _, habit := range h.config.Habits {
20 fmt.Fprintf(&b, "- %s: %s\n", habit.GetName(), habit.GetID())
21 }
22 return &mcp.CallToolResult{
23 Content: []mcp.Content{
24 mcp.TextContent{
25 Type: "text",
26 Text: b.String(),
27 },
28 },
29 }, nil
30}
31
32// HandleTrackHabitActivity handles the track_habit_activity tool call.
33func (h *Handlers) HandleTrackHabitActivity(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
34 habitID, ok := request.Params.Arguments["habit_id"].(string)
35 if !ok || habitID == "" {
36 return reportMCPError("Missing or invalid required argument: habit_id")
37 }
38
39 performedOnStr, ok := request.Params.Arguments["performed_on"].(string)
40 if !ok || performedOnStr == "" {
41 return reportMCPError("Missing or invalid required argument: performed_on")
42 }
43
44 performedOn, err := lunatask.ParseDate(performedOnStr)
45 if err != nil {
46 return reportMCPError(fmt.Sprintf("Invalid format for performed_on: '%s'. Must be YYYY-MM-DD.", performedOnStr))
47 }
48
49 client := lunatask.NewClient(h.config.AccessToken)
50 habitRequest := &lunatask.TrackHabitActivityRequest{
51 PerformedOn: performedOn,
52 }
53
54 resp, err := client.TrackHabitActivity(ctx, habitID, habitRequest)
55 if err != nil {
56 return reportMCPError(fmt.Sprintf("Failed to track habit activity: %v", err))
57 }
58
59 return &mcp.CallToolResult{
60 Content: []mcp.Content{
61 mcp.TextContent{
62 Type: "text",
63 Text: fmt.Sprintf("Habit activity tracked successfully. Status: %s, Message: %s", resp.Status, resp.Message),
64 },
65 },
66 }, nil
67}