README.md

 1<!--
 2SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 3
 4SPDX-License-Identifier: CC0-1.0
 5-->
 6
 7**Note:** this was all written in just a few hours with lots of help from LLMs.
 8I've reviewed every line, but not thoroughly enough yet to be confident making
 9this more public than unlisted.
10
11---
12
13## MCP server setup
14
15Ensure you have [the Go toolchain] installed.
16
17[the Go toolchain]: https://go.dev/doc/install
18
19```sh
20git clone https://git.sr.ht/~amolith/lunatask-mcp-server
21cd lunatask-mcp-server
22# specify GOOS and GOARCH if cross-compiling
23CGO_ENABLED=0 go build -o lunatask-mcp-server .
24./lunatask-mcp-server
25# it'll generate config.toml with default values
26# fill them out with your preferred editor
27./lunatask-mcp-server
28```
29
30If you have [just], build with `just build` (supports `GOOS` and `GOARCH`). If
31you also have [upx], compress the resulting binary with `just upx`. You can run
32one after the other with `just build pack`.
33
34[just]: https://github.com/casey/just
35[upx]: https://github.com/upx/upx
36
37Point [Home Assistant's MCP integration] at the `/sse` endpoint.
38
39[Home Assistant's MCP integration]: https://www.home-assistant.io/integrations/mcp/
40
41## Models and prompts
42
43I'm currently using `google/gemini-2.5-flash-preview:thinking` through
44[OpenRouter] with the following system prompt:
45
46[OpenRouter]: https://openrouter.ai/
47
48> You are a Home Assistant voice assistant capable of creating new tasks in
49> Lunatask, an ADHD-friendly all-in-one encrypted to-do list, habit tracker,
50> journaling, life-tracking and notes app. Respond in plaintext English—no
51> special characters or asterisks or Markdown. Do not repeat yourself. Do not
52> respond until finished using tools. If there are errors, explain them to the
53> user in plain English. Do not attempt to correct yourself until the user
54> confirms.
55> 
56> Task names should be in sentence case.
57> 
58> For every request to create a task/reminder:
59> 1. List the areas and goals and consider which one area is most relevant.
60>    Consider whether the task belongs within any of that area's goals.
61> 2. Get the task timestamp.
62> 3. If the user provided additional details, pass those in the task's note field
63>    using Markdown.
64> 4. If the user mentioned a time estimate, like that it might take them 30
65>    minutes, pass 30 in the estimate field. If they said 2 hours, 120, and so on.
66> 5. Task creation priority options are -2, -1, 0, 1, or 2.
67> 6. Try and interpret the text from the STT engine. It's not entirely accurate
68>    and the user might have meant something slightly different from what came
69>    through.
70> 7. Only include parameters if the user indicates or hints at them.
71> 8. Consider the following user-provided directions.
72> 
73> <user_provided_directions>
74> If I don't provide an estimate, consider whether it might take 10, 25, 30, 45, 60, or more minutes. Tasks, regardless of area, must include an estimate.
75> 
76> Tasks in my PERSONAL area must include a date. If it's started, next, or completed, schedule it for today. Tasks in work MUST NOT be scheduled unless I verbally specify otherwise.
77> 
78> Priority is normal unless I indicate the task is more or less urgent. Remember, the priority options are -2, -1, 0, 1, or 2. Interpret my urgency signals as values between -2 and 2.
79> </user_provided_directions>
80> 
81> Only once you've gathered the requisite area ID and other information should
82> you attempt to create a task.
83
84## TODO
85
86- Communicate through the MCP server's up-front prompts which tool parameters
87  are _generally_ mutually exclusive with each other unless the user indicates
88  or hints otherwise.
89  - Maybe make it user-configurable?
90- _Optionally_ include a tool that calls a configurable LLM for task time
91  estimations so the main LLM doesn't have to guess.