Case study
jobops
A 51-tool MCP server that runs an entire job search end to end: sourcing, scoring, tailored resumes, outreach drafts, and a SQLite tracker.
Highlights
- 51 tools across evaluation, materials, outreach, tracker
- three-plane architecture (MCP / HTTP / SQLite)
- human-in-the-loop by design: no auto-submit, no auto-send
- versioned career packet with two-way sync to cv.md
jobops is a self-hosted MCP server built to run a full job search the way a small, disciplined team would: it sources postings, scores them against a rubric, tailors resume and cover-letter drafts, drafts outreach, and tracks the whole pipeline in one SQLite database, all exposed as 51 tools to any MCP-aware chat client.
The design splits cleanly into three planes. The MCP plane exposes the tools and resources over stdio (for Claude Desktop) or streamable HTTP (for other clients), so the same running server can serve several clients against one database at once. The HTTP plane serves rendered artifacts, a tracker dashboard, and a soft-delete trash view. The data plane is a single SQLite database in WAL mode, with every mutation serialized through a write lock so concurrent tool calls never interleave.
The career packet is the system's spine: a versioned table holding every claim a candidate is allowed to make, editable either from chat (update_career_packet, marked as a chat edit that a plain reseed will not silently overwrite) or from the source files (cv.md, config/profile.yml, then reseed_career_packet), with sync_packet_to_cv reconciling the two directions. Six markdown resources, rubric, report format, tailoring rules, outreach tone, negotiation playbook, and the packet template, are live-reloaded without a restart, so tuning the system's judgment doesn't require touching code.
The hard rule threaded through the whole design is human-in-the-loop: no tool ever auto-submits an application or auto-sends a message. apply_prefill opens the application page, fills only a narrow allowlist of identity fields, and leaves every free-text question blank for the person to answer; every outreach draft stops at a preview. A visa-leakage scan runs before any resume or cover-letter render persists, so sponsorship status never reaches a candidate-facing document.