databasedmcp

← Articles

Alternative to Todoist: a to-do list with Claude

Tell Claude what you need to do and by when, and ask it what's next. The tasks are kept in your own database.

6 min read

databasedmcp gives your AI assistant databases it keeps between conversations, so everything in this article works from the day you connect it. Free to start, no card.

Get started free

Why build it yourself

Strip Todoist down and a few things are left: a quick place to drop a task, a due date, a priority, a project to group it under, and the tasks that come back every week. The daily habit is opening it in the morning to see what's due.

That core is two tables. You tell Claude what's on your plate when you plan your week or draft an email. While it's there, it can add the task. Say "I need to renew the car insurance by Friday" and it lands with the right date and project. What's next comes back from a single query.

Connect Claude to databasedmcp

databasedmcp is a remote MCP server that gives AI assistants private SQLite databases, with nothing to install.

In Claude on the web, desktop or mobile, open Settings → Connectors, choose Add custom connector and enter https://databasedmcp.com/mcp. Select Connect, sign in to databasedmcp with your email or Google, and select Allow. Then turn databasedmcp on for a conversation from the tools menu.

Claude asks before it runs anything that changes or deletes data. Reading runs without asking.

Any other MCP client works the same way; the docs have the details.

Copy this prompt to build it

Paste this into Claude to set up the database, its tables and its guide in one go. The rest of this article walks through what it makes and how you use it.

prompt
Set up a to-do list for me in databasedmcp, in one go.

1. Create a database called todos, described as "My to-do list: projects and tasks, kept by Claude from what I tell it".
2. Create two tables:
   - projects: id, name (required, unique), archived_at (NULL while the project is active).
   - tasks: id, project_id (references projects, optional), title (required), notes, due (date, optional), priority (1 is most urgent, 4 is someday; defaults to 4), repeat (daily, weekly, monthly or NULL), done_at (NULL until I say it's done), created_at (defaults to now).
3. Write the database a guide that says what each table is for, to look a project up by name before adding one, that finishing a repeating task means marking it done and adding the next one with the due date moved on, and the queries for "what's due today or overdue" and "what did I finish this week".

From then on: when I mention something I need to do, add a task, with a due date and priority if I give them. When I say I did something, find the open task and set done_at. When I ask what's next, show open tasks by due date and priority. Show me the tables when you're finished.

Ask for the database

You don't write the schema. Describe what you want:

Set up a to-do list in databasedmcp: projects, and tasks with due dates, priorities and repeats. When I mention something I need to do, add it; when I say I did it, tick it off.

Claude creates a database called todos and its tables:

schema
CREATE TABLE projects (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL UNIQUE,
  archived_at TEXT
);

CREATE TABLE tasks (
  id INTEGER PRIMARY KEY,
  project_id INTEGER REFERENCES projects(id),
  title TEXT NOT NULL,
  notes TEXT,
  due TEXT,
  priority INTEGER NOT NULL DEFAULT 4 CHECK (priority BETWEEN 1 AND 4),
  repeat TEXT CHECK (repeat IN ('daily', 'weekly', 'monthly')),
  done_at TEXT,
  created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
);

It also writes the database a guide on how the tables are meant to be used. The guide comes back with the schema whenever an assistant looks the database up. Claude files things the same way next week as today, and so does any other assistant you connect.

guide
# todos: my to-do list

- **projects**: groups of tasks (Home, Work, Garden). Look one up by name before adding. `archived_at` is set when a project is finished.
- **tasks**: one row per thing to do. priority: 1 (urgent) to 4 (someday). `due` is a date or NULL. `repeat` is daily, weekly, monthly or NULL. `done_at` stays NULL until I say it's done.

Finishing a repeating task: set its done_at, then insert a copy with `due` moved on (+1 day, +7 days or +1 month).

Due today or overdue: `SELECT t.id, t.title, p.name AS project, t.due, t.priority FROM tasks t LEFT JOIN projects p ON p.id = t.project_id WHERE t.done_at IS NULL AND t.due <= date('now') ORDER BY t.due, t.priority`

Done this week: `SELECT title, done_at FROM tasks WHERE done_at >= date('now', 'weekday 1', '-7 days') ORDER BY done_at`

Use it

From here on you talk, and Claude writes the rows. Each request below is one statement:

Start a Home project.
execute
INSERT INTO projects (name) VALUES (?) RETURNING id
-- params: ["Home"]
I need to renew the car insurance by Friday. That one's urgent.
execute
INSERT INTO tasks (project_id, title, due, priority) VALUES (?, ?, date('now', 'weekday 5'), ?)
-- params: [1,"Renew the car insurance",1]

weekday 5 is the coming Friday; SQLite's date functions do the calendar.

Recycling goes out every Tuesday. Put it on the list.
execute
INSERT INTO tasks (project_id, title, due, priority, repeat) VALUES (?, ?, date('now', 'weekday 2'), ?, ?)
-- params: [1,"Take out the recycling",3,"weekly"]
Recycling's out.
execute
UPDATE tasks SET done_at = datetime('now') WHERE project_id = ? AND done_at IS NULL AND title LIKE ?
-- params: [1,"%recycling%"]

Claude adds next week's recycling, as the guide says.

execute
INSERT INTO tasks (project_id, title, due, priority, repeat) SELECT project_id, title, date(due, '+7 days'), priority, repeat FROM tasks WHERE id = ?
-- params: [2]

The repeat lives in the guide, not in a scheduler: when you tick off a repeating task, Claude writes the next one.

Ask it questions

Once there's data, each report you'd pay for is a single query:

What's due today, and what have I let slip?
query
SELECT t.id, t.title, p.name AS project, t.due, t.priority FROM tasks t LEFT JOIN projects p ON p.id = t.project_id WHERE t.done_at IS NULL AND t.due <= date('now') ORDER BY t.due, t.priority
What's coming up in the next 7 days, most urgent first?
query
SELECT title, due, priority FROM tasks WHERE done_at IS NULL AND due BETWEEN date('now') AND date('now', '+7 days') ORDER BY priority, due
How many tasks did I finish per project this month?
query
SELECT coalesce(p.name, 'No project') AS project, count(*) AS done FROM tasks t LEFT JOIN projects p ON p.id = t.project_id WHERE t.done_at >= date('now', 'start of month') GROUP BY project ORDER BY done DESC

You can also open the database on the website, page through its rows and run read-only SQL yourself.

What you give up

Nothing reminds you. Todoist sends a notification when a task is due; here, a task waits until you ask. Make "what's due today?" the first thing you ask Claude each morning, or add it to a Claude project's instructions so each new chat starts with it. Repeating tasks work the same way: the next one appears when you tick off this one, not on a timer.

There's no app of its own. Todoist has apps for your phone, desktop and browser, works offline, adds tasks from a widget and can show them in your calendar. Here you add tasks by talking to Claude, and you can browse the rows on the databasedmcp website. If you tick things off on your phone all day without opening a chat, Todoist is the better fit.

Try it

databasedmcp is free to start, with no card. Free has 100 tool calls a week, enough to set this up and try it for a week. Starter has 1,000 for everyday use.

Create an account

More articles · databasedmcp · Docs