Job Prep Assistant (MCP Server) avatar

Job Prep Assistant (MCP Server)

Pricing

from $100.00 / 1,000 results

Go to Apify Store
Job Prep Assistant (MCP Server)

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

Abhishek Kumar

Maintained by Community

Actor 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

ToolWhat 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, so get_dashboard never 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

  1. Open the Actor in Apify Console.
  2. Fill in the input:
    • action — one of parse_job_posting, get_company_signals, find_interview_experiences, save_application, get_dashboard
    • serperApiKey — your free key from serper.dev (required for every action; only actually used by the two search tools)
    • the action-specific fields below
  3. Run it. Output shows up in the run's dataset and as the default key-value store OUTPUT record.

Input reference

FieldTypeUsed by
actionstring (enum)all — required
serperApiKeystring (secret)all — required by the schema; only get_company_signals and find_interview_experiences actually call Serper
jobUrlstringparse_job_posting (required), save_application (optional), get_dashboard (optional — triggers resume matching)
companyNamestringget_company_signals (required), find_interview_experiences (required), save_application (required)
rolestringfind_interview_experiences (required), save_application (required)
resumeVersionUsedstringsave_application (optional)
matchNotesstringsave_application (optional)
identifiedGapsstring[]save_application (optional)
statusstringsave_application (optional, default "applied")
filterStatusstringget_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/activate
pip install -r requirements-dev.txt
cp .env.example .env # fill in your own SERPER_API_KEY
pytest -q
ruff 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_posting is heuristic (common header keywords), not a layout-aware parser — unusually-formatted postings fall back to raw_text rather than guessing wrong.
  • find_interview_experiences only 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_dashboard is 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_signals call uses 2 queries and each find_interview_experiences call 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.