all repos — mcp-todotxt @ main

MCP server to manage todo.txt file

main.go (view raw)

 1package main
 2
 3import (
 4	"flag"
 5	"fmt"
 6	"log"
 7	"net/http"
 8
 9	"github.com/modelcontextprotocol/go-sdk/mcp"
10)
11
12var (
13	host         = flag.String("host", "localhost", "host to connect to/listen on")
14	port         = flag.Int("port", 8080, "port number to connect to/listen on")
15	todoFilePath = flag.String("file", "./todo.txt", "path to todo.txt")
16	authToken    = flag.String("token", "", "Authentication token")
17)
18
19func main() {
20	flag.Parse()
21	url := fmt.Sprintf("%s:%d", *host, *port)
22
23	server := mcp.NewServer(&mcp.Implementation{
24		Name:    "5ika-mpc-todo.txt",
25		Version: "1.0.0",
26	}, nil)
27
28	server.AddReceivingMiddleware(createLoggingMiddleware())
29
30	if *authToken != "" {
31		server.AddReceivingMiddleware(createAuthMiddleware(*authToken))
32	}
33
34	mcp.AddTool(server, &mcp.Tool{
35		Name:        "listTasks",
36		Description: "List tasks in todo.txt file",
37	}, getTasks)
38	mcp.AddTool(server, &mcp.Tool{
39		Name:        "addTask",
40		Description: "Add new task in todo.txt file",
41	}, addTask)
42	mcp.AddTool(server, &mcp.Tool{
43		Name:        "checkTask",
44		Description: "Set task as completed, done or finished in todo.txt file",
45	}, checkTask)
46
47	handler := mcp.NewStreamableHTTPHandler(func(req *http.Request) *mcp.Server {
48		return server
49	}, nil)
50
51	log.Printf("MCP server listening on %s", url)
52
53	if err := http.ListenAndServe(url, handler); err != nil {
54		log.Fatalf("Server failed: %v", err)
55	}
56}