databasedmcp

← Articles

Alternative to Untappd: a beer log with Grok

Remember every beer you've tried, who brewed it, where you had it and what you thought, by telling Grok between sips.

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

At the bar, Untappd answers one question: have I had this before, and did I like it? Underneath that is a log of every beer, who brewed it, a rating and where you were.

That log is three tables: breweries, beers and tastings. Tell Grok what's in the glass and it writes the row. Ask about a can on the shelf and it checks your history before you buy. The questions you'd want answered over a year, like which styles you rate highest, take one query each.

Connect Grok to databasedmcp

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

Open grok.com/connectors, add a new connector, choose Custom and enter https://databasedmcp.com/mcp. When Grok opens the databasedmcp page, sign in and select Allow. Then turn the connector on in a chat.

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

Copy this prompt to build it

Paste this into Grok 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 beer log for me in databasedmcp, in one go.

1. Create a database called beers, described as "Beer log: breweries, beers and every one I've tried".
2. Create three tables:
   - breweries: id, name (required), city, country.
   - beers: id, brewery_id (references breweries), name (required), style (like Hazy IPA or Dry stout), abv (a number, like 6.2).
   - tastings: id, beer_id (references beers), tasted_on (date, defaults to today), rating (0.25 to 5, optional), place (the bar, shop or "home"), serving (draft, can or bottle), notes (a line in my words).
3. Write the database a guide that says what each table is for, to look breweries and beers up by name before adding them so there are no duplicates, and the queries for "which styles do I rate highest", "have I had this one before" and "my best breweries".

From then on: when I tell you what I'm drinking, log a tasting (adding the brewery and beer if they're new) with my rating, where I am and how it was served. When I ask whether I've had something, check the tastings first. 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 beer log in databasedmcp: breweries, their beers with style and ABV, and every tasting with my rating, where I had it and how it was served. When I tell you what I'm drinking, log it.

Grok creates a database called beers and its tables:

schema
CREATE TABLE breweries (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  city TEXT,
  country TEXT
);

CREATE TABLE beers (
  id INTEGER PRIMARY KEY,
  brewery_id INTEGER NOT NULL REFERENCES breweries(id),
  name TEXT NOT NULL,
  style TEXT,
  abv REAL
);

CREATE TABLE tastings (
  id INTEGER PRIMARY KEY,
  beer_id INTEGER NOT NULL REFERENCES beers(id),
  tasted_on TEXT NOT NULL DEFAULT (date('now')),
  rating REAL CHECK (rating BETWEEN 0.25 AND 5),
  place TEXT,
  serving TEXT CHECK (serving IN ('draft', 'can', 'bottle')),
  notes 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. Grok files things the same way next week as today, and so does any other assistant you connect.

guide
# beers: a beer log

- **breweries**: one row per brewery. Look it up by name (LIKE) before adding.
- **beers**: one row per beer, with its brewery, style and ABV. Look it up by name before adding.
- **tastings**: one row each time I drink one. `rating` is 0.25 to 5. `serving` is draft, can or bottle.

Best styles: `SELECT b.style, count(*) AS tastings, round(avg(t.rating), 2) AS avg_rating FROM tastings t JOIN beers b ON b.id = t.beer_id GROUP BY b.style ORDER BY avg_rating DESC`

Had it before?: `SELECT t.tasted_on, t.place, t.serving, t.rating, t.notes FROM tastings t JOIN beers b ON b.id = t.beer_id WHERE b.name LIKE ? ORDER BY t.tasted_on DESC`

Best breweries (3 or more beers tried): `SELECT br.name, count(DISTINCT b.id) AS beers, round(avg(t.rating), 2) AS avg_rating FROM tastings t JOIN beers b ON b.id = t.beer_id JOIN breweries br ON br.id = b.brewery_id GROUP BY br.id HAVING beers >= 3 ORDER BY avg_rating DESC`

Use it

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

I'm at the Copper Kettle trying Fog Lamp, a hazy IPA from Harrow Lane Brewing in Leeds. 6.2%.
execute
INSERT INTO breweries (name, city, country) VALUES (?, ?, ?) RETURNING id
-- params: ["Harrow Lane Brewing","Leeds","UK"]

Grok adds the beer.

execute
INSERT INTO beers (brewery_id, name, style, abv) VALUES (?, ?, ?, ?) RETURNING id
-- params: [1,"Fog Lamp","Hazy IPA",6.2]
On draft. Soft, lots of mango, a bit sweet. I'd give it a 4.
execute
INSERT INTO tastings (beer_id, rating, place, serving, notes) VALUES (?, ?, ?, ?, ?)
-- params: [1,4,"The Copper Kettle","draft","Soft, lots of mango, a bit sweet."]
Had a Fog Lamp from a can at home. Not as good, 3.5.
execute
INSERT INTO tastings (beer_id, rating, place, serving, notes) VALUES (?, ?, ?, ?, ?)
-- params: [1,3.5,"home","can","Flatter than on draft."]

Ask it questions

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

Which styles do I rate highest?
query
SELECT b.style, count(*) AS tastings, round(avg(t.rating), 2) AS avg_rating FROM tastings t JOIN beers b ON b.id = t.beer_id GROUP BY b.style ORDER BY avg_rating DESC
There's Fog Lamp on the shelf. Have I had it, and was it any good?
query
SELECT t.tasted_on, t.place, t.serving, t.rating, t.notes FROM tastings t JOIN beers b ON b.id = t.beer_id WHERE b.name LIKE ? ORDER BY t.tasted_on DESC
-- params: ["%Fog Lamp%"]
Which breweries do I like best, where I've tried at least 3 of their beers?
query
SELECT br.name, count(DISTINCT b.id) AS beers, round(avg(t.rating), 2) AS avg_rating FROM tastings t JOIN beers b ON b.id = t.beer_id JOIN breweries br ON br.id = b.brewery_id GROUP BY br.id HAVING beers >= 3 ORDER BY avg_rating DESC

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

What you give up

Untappd is partly a social game: you see what friends are drinking, toast their check-ins and collect badges along the way. This log has no feed, friends or badges. Nobody sees it unless you share your databasedmcp account, and then they browse rows on the website.

Untappd knows most beers, their brewery and ABV, and what's on tap at many bars. There's no shared catalogue or venue menus behind this log. A beer has what you tell Grok, so the first time you log one, you say who brewed it. If finding what's pouring nearby matters to you, keep Untappd for that.

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