databasedmcp

← Articles

How to build a personal CRM with Claude

Keep track of the people you work with, when you last spoke and what you promised. Tell Claude after each call.

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

If you pay for HubSpot, Pipedrive or Clay on your own, you likely use a fraction of it: a list of people, a note after each conversation and a reminder to follow up. The rest is pipelines, sequences and seats built for a sales team you don't have.

That fraction is three tables. Claude hears about your calls when you ask it to draft the follow-up email, and it can log the conversation at the same time. You never fill in a form. You say what happened.

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 personal CRM for me in databasedmcp, in one go.

1. Create a database called crm, described as "Personal CRM: people, conversations and follow-ups".
2. Create three tables:
   - people: id, name (required), company, role, email, how_we_met, created_at (defaults to now).
   - conversations: id, person_id (references people), happened_on (date, defaults to today), channel (call, meeting, email or chat), summary (required, two or three sentences in my words).
   - followups: id, person_id (references people), what (required), due (date, required), done_at (NULL until I say it's done).
3. Write the database a guide that says what each table is for, to look people up by name before adding them so there are no duplicates, and the queries for "who do I owe something this week" and "who haven't I talked to in 60 days".

From then on: when I mention a call, meeting or email, log a conversation with the person (adding them if they're new). When I promise something, add a follow-up with a due date. When I say it's done, set done_at. 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 personal CRM in databasedmcp: people, the companies they're at, every conversation I tell you about, and follow-ups with due dates. After I mention a call or meeting, log it and any follow-up I promised.

Claude creates a database called crm and its tables:

schema
CREATE TABLE people (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  company TEXT,
  role TEXT,
  email TEXT,
  how_we_met TEXT,
  created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE conversations (
  id INTEGER PRIMARY KEY,
  person_id INTEGER NOT NULL REFERENCES people(id),
  happened_on TEXT NOT NULL DEFAULT (date('now')),
  channel TEXT CHECK (channel IN ('call', 'meeting', 'email', 'chat')),
  summary TEXT NOT NULL
);

CREATE TABLE followups (
  id INTEGER PRIMARY KEY,
  person_id INTEGER NOT NULL REFERENCES people(id),
  what TEXT NOT NULL,
  due TEXT NOT NULL,
  done_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.

guide
# crm: people, conversations, follow-ups

- **people**: one row per person. Look them up by name (LIKE) before adding, to avoid duplicates.
- **conversations**: one row per call, meeting or email thread I tell you about. `summary` is two or three sentences in my words.
- **followups**: what I promised and when. `done_at` stays NULL until I say it's done.

Due this week: `SELECT f.id, p.name, f.what, f.due FROM followups f JOIN people p ON p.id = f.person_id WHERE f.done_at IS NULL AND f.due <= date('now', '+7 days') ORDER BY f.due`

Gone quiet (no conversation in 60 days): `SELECT p.name, p.company, max(c.happened_on) AS last FROM people p LEFT JOIN conversations c ON c.person_id = p.id GROUP BY p.id HAVING last IS NULL OR last < date('now', '-60 days') ORDER BY last`

Use it

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

I met Maria Lindqvist, head of ops at Nordwave, at the logistics meetup. Add her.
execute
INSERT INTO people (name, company, role, how_we_met) VALUES (?, ?, ?, ?) RETURNING id
-- params: ["Maria Lindqvist","Nordwave","Head of operations","Logistics meetup, Helsinki"]
Had a call with Maria. They're moving off spreadsheets for route planning in Q1 and want a proposal.
execute
INSERT INTO conversations (person_id, channel, summary) VALUES (?, ?, ?)
-- params: [1,"call","Nordwave moves route planning off spreadsheets in Q1. Maria wants a proposal."]
I promised her the proposal by Friday.
execute
INSERT INTO followups (person_id, what, due) VALUES (?, ?, date('now', 'weekday 5'))
-- params: [1,"Send Nordwave the route-planning proposal"]

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

Sent Maria the proposal.
execute
UPDATE followups SET done_at = datetime('now') WHERE person_id = ? AND done_at IS NULL AND what LIKE ?
-- params: [1,"%proposal%"]

Ask it questions

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

Who do I owe something this week?
query
SELECT f.id, p.name, f.what, f.due FROM followups f JOIN people p ON p.id = f.person_id WHERE f.done_at IS NULL AND f.due <= date('now', '+7 days') ORDER BY f.due
Who haven't I talked to in two months?
query
SELECT p.name, p.company, max(c.happened_on) AS last FROM people p LEFT JOIN conversations c ON c.person_id = p.id GROUP BY p.id HAVING last IS NULL OR last < date('now', '-60 days') ORDER BY last
What did Maria and I talk about last time?
query
SELECT c.happened_on, c.channel, c.summary FROM conversations c JOIN people p ON p.id = c.person_id WHERE p.name LIKE ? ORDER BY c.happened_on DESC LIMIT 3
-- params: ["%Maria%"]

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

What you give up

There's no email sync. HubSpot and Clay read your inbox and calendar and log conversations without being told. Here, a conversation exists because you mentioned it. For a personal CRM that's often better, since only what mattered gets filed. It does mean telling Claude.

There are no reminders that come to you. Ask "who do I owe something this week?" on Monday morning, or add that question to a Claude project so each new chat opens with it. Pipelines, deal stages and team seats are missing too. Add a deals table when you need one. If a sales team lives in the CRM all day, pay for the real thing.

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