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
A job search is a pipeline. You save roles, apply to some and hear back from a few. You need to remember who you spoke to and when the next interview is. Huntr and Teal give you a board for that, and plenty of people end up with a spreadsheet instead.
You may be using ChatGPT to rewrite your cover letter or prepare for an interview. While the posting is in the chat, have it save the role too, and log the recruiter's email when it comes. After that, "what's coming up this week?" has an answer.
Connect ChatGPT to databasedmcp
databasedmcp is a remote MCP server that gives AI assistants private SQLite databases, with nothing to install.
ChatGPT connects to remote MCP servers as custom connectors in developer mode. That's on paid plans, on the web. Turn on developer mode in ChatGPT's settings, then create a connector: give it a name, enter https://databasedmcp.com/mcp as the URL and choose OAuth. When ChatGPT opens a databasedmcp page, sign in and select Allow. In a new chat, turn the connector on from the tools menu.
ChatGPT moves these menus between releases. If yours look different, search its settings for developer mode and custom connectors.
Any other MCP client works the same way; the docs have the details.
Copy this prompt to build it
Paste this into ChatGPT 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 job application tracker for me in databasedmcp, in one go. 1. Create a database called job-search, described as "Job search: roles I've saved and applied to, the people involved, and every interview, filed by ChatGPT as things happen". 2. Create three tables: - applications: id, company (required), role (required), url, source (where I found it), status (saved, applied, interviewing, offer, rejected or withdrawn, defaults to saved), applied_on (date, set when I apply), notes, created_at (defaults to now). - contacts: id, application_id (references applications), name (required), role, email. - events: id, application_id (references applications), kind (screen, interview, takehome, offer, rejection or note), happened_on (date, defaults to today, and can be in the future for something scheduled), notes. 3. Write the database a guide that says what each table is for, to find an application by company before adding one so there are no duplicates, and the queries for "what's coming up" (events from today on) and "who should I follow up with" (applied over 14 days ago with nothing since). From then on: when I paste or describe a posting, save the role. When I apply, set the status to applied and applied_on to today. When a recruiter or interviewer gets in touch, add them as a contact. When something is scheduled or happens, add an event, and move the status along when it changes. 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 job application tracker in databasedmcp: each role with company, title, link, where I found it and its status; the people I'm talking to; and every screen, interview, take-home and offer with its date. Update it when I tell you something happened.
ChatGPT creates a database called job-search and its tables:
CREATE TABLE applications (
id INTEGER PRIMARY KEY,
company TEXT NOT NULL,
role TEXT NOT NULL,
url TEXT,
source TEXT,
status TEXT NOT NULL DEFAULT 'saved' CHECK (status IN ('saved', 'applied', 'interviewing', 'offer', 'rejected', 'withdrawn')),
applied_on TEXT,
notes TEXT,
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE contacts (
id INTEGER PRIMARY KEY,
application_id INTEGER NOT NULL REFERENCES applications(id),
name TEXT NOT NULL,
role TEXT,
email TEXT
);
CREATE TABLE events (
id INTEGER PRIMARY KEY,
application_id INTEGER NOT NULL REFERENCES applications(id),
kind TEXT NOT NULL CHECK (kind IN ('screen', 'interview', 'takehome', 'offer', 'rejection', 'note')),
happened_on TEXT NOT NULL DEFAULT (date('now')),
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. ChatGPT files things the same way next week as today, and so does any other assistant you connect.
# job-search: applications, contacts, events
- **applications**: one row per role. status: saved, applied, interviewing, offer, rejected, withdrawn. `applied_on` is set when I apply.
- **contacts**: recruiters and interviewers, linked to the application they came from.
- **events**: screens, interviews, take-homes, offers, rejections. `happened_on` can be in the future for something scheduled.
Find an application by company (LIKE) before adding one.
Coming up: `SELECT e.happened_on, a.company, a.role, e.kind, e.notes FROM events e JOIN applications a ON a.id = e.application_id WHERE e.happened_on >= date('now') ORDER BY e.happened_on`
Gone quiet: applied over 14 days ago with nothing since.
Use it
From here on you talk, and ChatGPT writes the rows. Each request below is one statement:
Save this one: senior product designer at Fernhill Labs, from their careers page.
INSERT INTO applications (company, role, url, source) VALUES (?, ?, ?, ?) RETURNING id -- params: ["Fernhill Labs","Senior product designer","https://fernhill-labs.example/jobs/senior-product-designer","Careers page"]
Sent the Fernhill application.
UPDATE applications SET status = 'applied', applied_on = date('now') WHERE id = ? AND status = 'saved'
-- params: [1]
Their recruiter, Priya Raman, wrote back.
INSERT INTO contacts (application_id, name, role, email) VALUES (?, ?, ?, ?) -- params: [1,"Priya Raman","Recruiter","priya@fernhill-labs.example"]
Screen call with Priya is on Thursday. Then they want a portfolio review.
INSERT INTO events (application_id, kind, happened_on, notes) VALUES (?, 'screen', date('now', 'weekday 4'), ?)
-- params: [1,"30 minutes with Priya. Portfolio review comes after."]
The screen went well, I'm through to interviews.
UPDATE applications SET status = 'interviewing' WHERE id = ? -- params: [1]
Ask it questions
Once there's data, each report you'd pay for is a single query:
How does my search look overall?
SELECT status, count(*) AS roles FROM applications GROUP BY status ORDER BY CASE status WHEN 'offer' THEN 1 WHEN 'interviewing' THEN 2 WHEN 'applied' THEN 3 WHEN 'saved' THEN 4 ELSE 5 END
What's coming up?
SELECT e.happened_on, a.company, a.role, e.kind, e.notes FROM events e JOIN applications a ON a.id = e.application_id WHERE e.happened_on >= date('now') ORDER BY e.happened_on
Who should I follow up with?
SELECT a.id, a.company, a.role, a.applied_on FROM applications a WHERE a.status = 'applied' AND a.applied_on < date('now', '-14 days') AND NOT EXISTS (SELECT 1 FROM events e WHERE e.application_id = a.id AND e.happened_on > a.applied_on) ORDER BY a.applied_on
You can also open the database on the website, page through its rows and run read-only SQL yourself.
What you give up
Paid job trackers usually save a posting from a job board in a click and keep your CV and cover letters next to each role. Here, a role is saved because you pasted or described it. Files stay where they are: keep a link to the CV you sent, not the CV.
Nothing reminds you of an interview or syncs it to your calendar. Ask "what's coming up?" on Monday, and put the interview in your calendar yourself. You also won't get a drag-and-drop board. The website shows the rows as a table, which is plenty for one person's search.
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.