habits.go

 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// TrackHabitActivityArgs defines the arguments for track_habit_activity tool call.
33type TrackHabitActivityArgs struct {
34	HabitID     string `json:"habit_id"`
35	PerformedOn string `json:"performed_on"`
36}
37
38// HandleTrackHabitActivity handles the track_habit_activity tool call.
39func (h *Handlers) HandleTrackHabitActivity(ctx context.Context, request mcp.CallToolRequest, args TrackHabitActivityArgs) (*mcp.CallToolResult, error) {
40	if args.HabitID == "" {
41		return reportMCPError("Missing or invalid required argument: habit_id")
42	}
43
44	if args.PerformedOn == "" {
45		return reportMCPError("Missing or invalid required argument: performed_on")
46	}
47
48	client := lunatask.NewClient(h.config.AccessToken)
49	habitRequest := &lunatask.TrackHabitActivityRequest{
50		PerformedOn: args.PerformedOn,
51	}
52
53	resp, err := client.TrackHabitActivity(ctx, args.HabitID, habitRequest)
54	if err != nil {
55		return reportMCPError(fmt.Sprintf("Failed to track habit activity: %v", err))
56	}
57
58	return &mcp.CallToolResult{
59		Content: []mcp.Content{
60			mcp.TextContent{
61				Type: "text",
62				Text: fmt.Sprintf("Habit activity tracked successfully. Status: %s, Message: %s", resp.Status, resp.Message),
63			},
64		},
65	}, nil
66}