Job Prep Assistant (MCP Server)
Pricing
from $100.00 / 1,000 results
Job Prep Assistant (MCP Server)
MCP server that fetches, stores, and returns structured job-search data (postings, company signals, interview experiences, resume-match history, gap intelligence) so a calling AI agent can reason over it. Persists independently of any chat session.
Pricing
from $100.00 / 1,000 results
Rating
0.0
(0)
Developer
Abhishek Kumar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a month ago
Last modified
Categories
Share
Job Prep Assistant
An MCP (Model Context Protocol) server that helps you prepare for job applications — parsing postings, pulling real company signals, surfacing genuine interview experiences, tracking which resume version you used where, and spotting the skill gaps that keep coming up across your search. All of it persists on its own, independent of any single chat session.
Built as an Apify Actor so it runs for free (Serper's free tier, no credit card) and your data lives in your own Apify account.
Why this exists
A normal chat with Claude or ChatGPT forgets everything the moment you close the tab, switch devices, or start a new conversation. If you're applying to 40 jobs over three months, that's a real problem: you lose track of which resume version you sent where, you re-notice the same skill gap for the fifth time without ever fixing it, and you have no record of what you learned about a company two weeks ago.
Job Prep Assistant fixes that by storing everything in Apify's Key-Value Store, scoped to your Apify account. Whoever runs the Actor owns their own data — no separate signup, no database to manage.
Design principle
This server does no AI reasoning. It only fetches, stores, and returns clean structured data — the calling agent (Claude, Cursor, or whatever you connect it to) does all the actual thinking. Every tool is small, composable, and returns flat, table-ready JSON so the agent can render it as clean Markdown without extra transformation.
The five tools
| Tool | What it does |
|---|---|
parse_job_posting(url) | Fetches a job posting, strips boilerplate, and splits it into responsibilities / required / preferred / salary_range — with a guaranteed raw_text fallback so nothing is ever silently dropped. |
get_company_signals(company_name) | Recent news (~90 days) and engineering blog posts about a company, via Serper. |
find_interview_experiences(company_name, role) | Real interview experiences from Reddit, Blind, and Medium — snippets and links only, never full article bodies. |
save_application(...) | Persists one analyzed application (company, role, resume version used, notes, identified gaps, status) to your Apify account. |
get_dashboard(filter_status?, job_url?) | The main event: lists every saved application, ranks your past resume versions against a new job posting by keyword overlap, and surfaces which skill gaps keep recurring across your whole search. |
All five tools are written to be used proactively — the calling agent is nudged (via each tool's description) to reach for them whenever the conversation touches job search, applications, or a specific company/role, not only when explicitly asked.
How persistence works
- One record per analyzed application, stored under a key like
application__{company}__{role}__{timestamp}. - A lightweight running index (
application_index) lists every record key, soget_dashboardnever has to scan the whole store. - Data is scoped per Apify account. There's no separate login for this tool — whoever runs the Actor is the "user."
Running it on Apify
- Open the Actor in Apify Console.
- Fill in the input:
action— one ofparse_job_posting,get_company_signals,find_interview_experiences,save_application,get_dashboardserperApiKey— your free key from serper.dev (required for every action; only actually used by the two search tools)- the action-specific fields below
- Run it. Output shows up in the run's dataset and as the default key-value store
OUTPUTrecord.
Input reference
| Field | Type | Used by |
|---|---|---|
action | string (enum) | all — required |
serperApiKey | string (secret) | all — required by the schema; only get_company_signals and find_interview_experiences actually call Serper |
jobUrl | string | parse_job_posting (required), save_application (optional), get_dashboard (optional — triggers resume matching) |
companyName | string | get_company_signals (required), find_interview_experiences (required), save_application (required) |
role | string | find_interview_experiences (required), save_application (required) |
resumeVersionUsed | string | save_application (optional) |
matchNotes | string | save_application (optional) |
identifiedGaps | string[] | save_application (optional) |
status | string | save_application (optional, default "applied") |
filterStatus | string | get_dashboard (optional) |
Example inputs
Parse a job posting
{"action": "parse_job_posting","serperApiKey": "YOUR_KEY","jobUrl": "https://boards.greenhouse.io/example/jobs/123456"}
Get company signals
{"action": "get_company_signals","serperApiKey": "YOUR_KEY","companyName": "Acme Corp"}
Find interview experiences
{"action": "find_interview_experiences","serperApiKey": "YOUR_KEY","companyName": "Acme Corp","role": "Backend Engineer"}
Save an application
{"action": "save_application","serperApiKey": "YOUR_KEY","companyName": "Acme Corp","role": "Backend Engineer","jobUrl": "https://boards.greenhouse.io/example/jobs/123456","resumeVersionUsed": "FDE-tailored","matchNotes": "Strong backend + client-facing overlap","identifiedGaps": ["Kubernetes", "AWS"],"status": "applied"}
Get the dashboard
{"action": "get_dashboard","serperApiKey": "YOUR_KEY","filterStatus": "applied","jobUrl": "https://boards.greenhouse.io/another-example/jobs/789"}
Local development
See examples/README.md for full local setup instructions (.env, running tests, running a single action from the command line).
Quick version:
python3 -m venv .venv && source .venv/bin/activatepip install -r requirements-dev.txtcp .env.example .env # fill in your own SERPER_API_KEYpytest -qruff check src tests
Tech stack
Python 3.12, the Apify SDK for storage, httpx for HTTP, trafilatura (+ readability-lxml fallback) for HTML extraction, python-dotenv for local config, pytest + ruff for tests/lint.
Limitations
- Section-splitting in
parse_job_postingis heuristic (common header keywords), not a layout-aware parser — unusually-formatted postings fall back toraw_textrather than guessing wrong. find_interview_experiencesonly searches Reddit, Blind, and Medium, and only returns short snippets — it does not scrape Glassdoor, LeetCode Discuss, or any site with restrictive terms of service, and never fetches full third-party article bodies.- Resume-version matching in
get_dashboardis a simple, transparent keyword-overlap score (no ML) — it's meant to be a starting point for the calling agent's reasoning, not a verdict. - Serper's free tier is 2,500 queries total; each
get_company_signalscall uses 2 queries and eachfind_interview_experiencescall uses 3. - No AI reasoning happens inside this server, by design — all judgment calls (is this a good match? is this gap worth addressing?) belong to the calling agent.


