quantjobs
Enables conversational management of quant job search, tailored CV generation, and skill gap analysis through MCP tools. Allows Claude to search, ingest, score jobs, and build/iterate LaTeX CVs.
README
QuantJobs
A terminal app for hunting quant roles and managing a tailored LaTeX CV — with a Claude MCP server so you can drive the whole thing in conversation.
It does four things:
- Finds jobs — scrapes stable public job boards (Greenhouse/Lever) for London quant roles, or lets Claude web-search and ingest jobs for you via MCP.
- Scores & curates — a fit score (0–100) per job, bucketed into Strong match / Stretch / Long shot, plus star ★ and archive. The scorer is deliberately optimistic about skills you're learning, so genuine stretch roles surface instead of being filtered.
- Builds your CV — generates a LaTeX → PDF CV from a single source of truth
(
profile.yaml), either as your base CV or tailored to a specific job. Tailoring only reorders and selects your real experience — it never invents anything. If a job wants a skill you don't have, it adds a pending project (with an honest time estimate) and flags the skill to learn instead of fabricating a bullet. - Spots trends — aggregates skill demand across the jobs you're tracking and flags the in-demand skills you're missing (e.g. "C++ in 20% of roles — learn it").

Setup
Prereqs: uv and a LaTeX engine (latexmk/xelatex, e.g. MacTeX
or BasicTeX — already on this machine).
uv sync
uv run quantjobs init # create the DB + seed your CV profile
uv run quantjobs scrape # pull London quant jobs from the configured firms
uv run quantjobs # launch the TUI
Data (DB, your editable profile.yaml, generated CVs) lives in ./data/ by default.
Override with QUANTJOBS_HOME=/some/path.
The TUI
uv run quantjobs opens the dashboard. Left = job list, right = detail (fit %, the skills you
have vs miss, and the job description).
| Key | Action | Key | Action |
|---|---|---|---|
/ |
search (Enter apply, Esc clear) | t |
skill trends screen |
s |
star / unstar | p |
pending projects screen |
a |
archive | k |
skills gap screen |
g |
generate tailored CV for this job | y |
your skills profile |
o |
open the last generated CV (PDF) | f |
cycle filter (active/★/strong/stretch/all) |
R |
run the scrapers | r |
reload · q quit |
CV management
Your CV is defined entirely by data/profile.yaml (seeded from your current CV). Edit it to
change anything. The LaTeX template is quantjobs/cv/template.tex — drop your own .tex into
data/template.tex to override it.
uv run quantjobs cv --base # your standard CV
uv run quantjobs cv --job 42 --stretch aggressive --open
--stretch (conservative | balanced | aggressive) controls how hard the tailoring leans
into reach roles: it reorders bullets/skills to surface what the job asks for, and in
aggressive mode selects the strongest few bullets per role. It never adds experience you
don't have — missing skills become pending projects + flags. Generated CVs land in
data/output/. The template is a dense one-page modern-sans design (Helvetica Neue via xelatex).
Building a CV is best done as a conversation through the MCP (below): Claude drafts a tailored
CV for a job, you refine the bullets/order/summary together, then render — see cv_draft_* tools.
Adding job sources
Edit quantjobs/scrapers/firms.yaml (or data/firms.yaml to override). A firm's Greenhouse/Lever
token is the slug in its careers URL:
location_filter: London # applied to every firm; set "" for all locations
firms:
- {name: Jane Street, type: greenhouse, token: janestreet}
- {name: DRW, type: greenhouse, token: drweng}
- {name: Some Fund, type: lever, token: somefund}
uv run quantjobs scrape --list # show configured sources
uv run quantjobs scrape --source "Jane Street" # one firm
uv run quantjobs trends # skill demand + flags to learn
uv run quantjobs gap # missing skills + suggested projects
eFinancialCareers HTML scraping is included as a best-effort fallback (--source efc) but the
robust paths are the JSON boards above and Claude-driven ingestion below.
Talk to it: the Claude MCP server
Register the server so Claude can search, analyse and act on your job DB in conversation:
claude mcp add quantjobs -- uv run --directory "$(pwd)" quantjobs-mcp
<details><summary>Claude Desktop (JSON) config</summary>
{
"mcpServers": {
"quantjobs": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/quantjobs", "quantjobs-mcp"]
}
}
}
Note: Claude Desktop may not inherit your shell PATH; if CV compilation fails, ensure
/Library/TeX/texbin is on PATH for the server process.
</details>
Then just ask Claude things like:
- "Find London quant-developer roles and add them" → web search →
add_jobs - "What in-demand skills am I missing?" →
analyze_trends+skills_gap_report - "Which firms are hiring for C++?" →
run_query(read-only SQL over the DB) - "Star 42 and add a pending project to learn kdb+" →
star_job+add_pending_project - "I finished the order-book project — mark C++ as a skill I have" →
add_or_update_skill
Build a CV conversationally (the recommended way):
"Build my CV for job 107" →
cv_draft_create(Claude shows the proposed summary, the selected/reordered bullets, and the skills) → "tighten the second UBS bullet and lead with the ML one; drop the Excel bullet" →cv_draft_update(re-shows) → "render it" →cv_draft_render→ PDF. Drafts persist between messages, so you can iterate. Claude only rephrases your real experience (same facts/metrics) — it never invents anything.
29 tools are exposed. run_query is restricted to a single read-only SELECT/WITH on a
read-only connection, so Claude can freely explore patterns without being able to mutate data
except through the explicit, audited tools.
Useful tables for run_query: jobs, job_skills(job_id, skill), skills_profile,
pending_projects, skill_flags, cv_versions, saved_searches.
Development
uv run pytest # test suite
uv run ruff check . # lint
Layout: core data layer (db, repo, models, ingest, fit), cv/ (template +
generator + compile), scrapers/, analysis/ (trends, skills gap), tui/, mcp_server/.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。