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 freeWhy build it yourself
AnyList's main job is a shopping list the whole household can add to. Items are sorted by the part of the shop they're in, and ticked off as they go in the basket. The rest is recipes and meal plans, which some people use and many don't.
That's two tables. Invite the people you live with to your databasedmcp account, and each of them connects their own assistant to it. Someone says "we're out of oat milk" and it's on the list, with their name next to it. In the shop, you ask what's left and get it sorted by aisle.
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.
Set up a shared shopping list for me in databasedmcp, in one go. 1. Create a database called shopping, described as "Our household shopping lists: everyone adds items through their own assistant, and we tick them off in the shop". 2. Create two tables: - lists: id, name (required, unique, such as Groceries or Hardware). - items: id, list_id (references lists), name (required), quantity (free text, such as "2 cartons"), category (the part of the shop: Produce, Dairy, Bakery and so on), added_by (the first name of whoever asked), added_at (defaults to now), checked_at (NULL until it's in the basket). 3. Write the database a guide that says what each table is for, that the database is shared by everyone in the household, to always fill in added_by, to check for an unchecked item with the same name before adding one and change its quantity instead, and the queries for "what's left on the list, by category" and "what do we buy most often". From then on: when I say we need something, add it to the right list with a category. When I say I've got things, set checked_at on them. When I ask what's left, show the unchecked items grouped by category. 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 shared shopping list in databasedmcp: lists like Groceries and Hardware, and items with a quantity, the part of the shop they're in and who added them. When I say we need something, add it; when I've got it, tick it off.
Claude creates a database called shopping and its tables:
CREATE TABLE lists ( id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE ); CREATE TABLE items ( id INTEGER PRIMARY KEY, list_id INTEGER NOT NULL REFERENCES lists(id), name TEXT NOT NULL, quantity TEXT, category TEXT, added_by TEXT NOT NULL, added_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, checked_at TEXT );
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.
# shopping: our household lists Shared by everyone in the household. Each person talks to their own assistant. - **lists**: Groceries, Hardware and so on. - **items**: one row per thing to buy. Always set `added_by` to the first name of whoever asked. `category` is the part of the shop (Produce, Dairy, Bakery, Pantry, Household). `checked_at` stays NULL until it's in the basket. Before adding, check for an unchecked item with the same name on that list; if there is one, update its quantity instead. What's left: `SELECT category, name, quantity, added_by FROM items WHERE list_id = 1 AND checked_at IS NULL ORDER BY category, name` Bought most often: `SELECT name, count(*) AS times FROM items WHERE checked_at IS NOT NULL GROUP BY lower(name) ORDER BY times DESC LIMIT 20`
Use it
From here on you talk, and Claude writes the rows. Each request below is one statement:
Make us a Groceries list.
INSERT INTO lists (name) VALUES (?) RETURNING id -- params: ["Groceries"]
We need 2 cartons of oat milk, bananas and coffee beans.
INSERT INTO items (list_id, name, quantity, category, added_by) VALUES (?, ?, ?, ?, ?), (?, ?, ?, ?, ?), (?, ?, ?, ?, ?) -- params: [1,"Oat milk","2 cartons","Dairy","Ana",1,"Bananas","6","Produce","Ana",1,"Coffee beans","1 bag","Pantry","Ana"]
Add a loaf of rye bread to the groceries.
INSERT INTO items (list_id, name, quantity, category, added_by) VALUES (?, ?, ?, ?, ?) -- params: [1,"Rye bread","1 loaf","Bakery","Tomas"]
This one comes from Tomas's assistant. Tomas is a member of the same databasedmcp account, so it writes to the same list.
Make that 3 cartons of oat milk, not 2.
UPDATE items SET quantity = ? WHERE list_id = ? AND checked_at IS NULL AND lower(name) = lower(?) -- params: ["3 cartons",1,"Oat milk"]
Got the milk and the bananas.
UPDATE items SET checked_at = datetime('now') WHERE list_id = ? AND checked_at IS NULL AND name IN (?, ?)
-- params: [1,"Oat milk","Bananas"]
Ask it questions
Once there's data, each report you'd pay for is a single query:
What's left on the groceries list?
SELECT category, name, quantity, added_by FROM items WHERE list_id = ? AND checked_at IS NULL ORDER BY category, name -- params: [1]
What do we buy most often?
SELECT name, count(*) AS times, max(checked_at) AS last_bought FROM items WHERE checked_at IS NOT NULL GROUP BY lower(name) ORDER BY times DESC LIMIT 20
Who added what this week?
SELECT added_by, count(*) AS items, group_concat(name, ', ') AS what FROM items WHERE added_at >= date('now', '-7 days') GROUP BY added_by ORDER BY items DESC
You can also open the database on the website, page through its rows and run read-only SQL yourself.
What you give up
In the shop, it's a chat, not a checklist. AnyList has phone and watch apps where you tap an item to tick it off. It works without a signal and updates everyone's phone as soon as someone adds something. Here you tell your assistant what's in the basket, which needs a connection. The others see the change the next time they ask or open the website.
Sharing means sharing the account. Everyone you invite can see all of the account's databases, not only the shopping list, so keep the account for things the household shares. You also get no recipe import, no meal planner and no list that sorts itself by your local shop's layout. The category column is as close as it gets.
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.