career-compass-mcp 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +540 -486
  2. package/build/bin/cli.js +9 -12
  3. package/build/bin/cli.js.map +1 -1
  4. package/build/src/dashboard-lite/render.d.ts +1 -1
  5. package/build/src/dashboard-lite/render.d.ts.map +1 -1
  6. package/build/src/dashboard-lite/render.js +272 -150
  7. package/build/src/dashboard-lite/render.js.map +1 -1
  8. package/build/src/dashboard-lite/server.d.ts.map +1 -1
  9. package/build/src/dashboard-lite/server.js +5 -3
  10. package/build/src/dashboard-lite/server.js.map +1 -1
  11. package/build/src/index.js +2 -1
  12. package/build/src/index.js.map +1 -1
  13. package/build/src/prompts/index.d.ts.map +1 -1
  14. package/build/src/prompts/index.js +39 -2
  15. package/build/src/prompts/index.js.map +1 -1
  16. package/build/src/resources/live.d.ts.map +1 -1
  17. package/build/src/resources/live.js +7 -0
  18. package/build/src/resources/live.js.map +1 -1
  19. package/build/src/stdio-banner.d.ts +13 -0
  20. package/build/src/stdio-banner.d.ts.map +1 -0
  21. package/build/src/stdio-banner.js +24 -0
  22. package/build/src/stdio-banner.js.map +1 -0
  23. package/build/src/storage/file-store.d.ts +7 -1
  24. package/build/src/storage/file-store.d.ts.map +1 -1
  25. package/build/src/storage/file-store.js +19 -3
  26. package/build/src/storage/file-store.js.map +1 -1
  27. package/build/src/tools/doctor.d.ts.map +1 -1
  28. package/build/src/tools/doctor.js +50 -1
  29. package/build/src/tools/doctor.js.map +1 -1
  30. package/build/src/tools/opportunity.d.ts.map +1 -1
  31. package/build/src/tools/opportunity.js +9 -2
  32. package/build/src/tools/opportunity.js.map +1 -1
  33. package/build/src/tools/pipeline.d.ts.map +1 -1
  34. package/build/src/tools/pipeline.js +54 -14
  35. package/build/src/tools/pipeline.js.map +1 -1
  36. package/build/src/tools/resume.d.ts.map +1 -1
  37. package/build/src/tools/resume.js +18 -2
  38. package/build/src/tools/resume.js.map +1 -1
  39. package/build/src/types/tool-args.d.ts +1 -0
  40. package/build/src/types/tool-args.d.ts.map +1 -1
  41. package/package.json +77 -77
package/README.md CHANGED
@@ -1,486 +1,540 @@
1
- # Career Compass MCP
2
-
3
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
4
- [![npm](https://img.shields.io/npm/v/career-compass-mcp.svg)](https://www.npmjs.com/package/career-compass-mcp)
5
- [![Node](https://img.shields.io/badge/node-%3E%3D18-green.svg)](https://nodejs.org)
6
- [![MCP](https://img.shields.io/badge/MCP-server-7c4dff.svg)](https://modelcontextprotocol.io)
7
-
8
- **Your AI-native career co-pilot, built for Claude.**
9
-
10
- Career Compass turns Claude into a full job-search partner — one that knows your entire career history, tailors every resume and cover letter, tracks every application, and preps you for every interview. Initiate via conversation, onboard, and track multiple applications in moments.
11
-
12
- ---
13
-
14
-
15
- ## What it feels like
16
-
17
- ```
18
- You: I have a panel interview at Veridian Health on Friday — Director of Operations role.
19
- Can you prep me?
20
-
21
- Claude: On it. Reading your career history now...
22
-
23
- [Generates 90-second pitch, 8 STAR stories matched to likely panel questions,
24
- company research brief, 10 questions to ask them, and a list of watch-outs
25
- based on gaps in your background — all in one response]
26
- ```
27
-
28
- ```
29
- You: Here's a job posting I just found. [pastes posting]
30
- How well do I fit?
31
-
32
- Claude: Fit score: 8.1/10. Here's why — and here's what they'll probe you on...
33
-
34
- [Returns matched strengths, honest gap analysis, talking points in their language,
35
- and a "day in the life" of what the role actually looks like]
36
- ```
37
-
38
- ```
39
- You: Show me what needs attention in my pipeline today.
40
-
41
- Claude: 3 things:
42
- - Meridian Logistics follow-up is overdue (8 days since you applied, referral from Marcus Chen)
43
- - Veridian panel is Friday — prep above
44
- - Novare rejection arrived — want me to draft a keep-the-door-open response?
45
- ```
46
-
47
- ---
48
-
49
- ## Architecture
50
-
51
- ```
52
- ┌─────────────┐ ┌──────────────────────────────────────┐
53
- │ │ MCP │ MCP Server (Node.js) │
54
- │ Claude │◄────────►│ │
55
- │ │ stdio │ Tools ─── Resume, Pipeline, Interview│
56
- │ │ │ Resources ─ Career KB, Pipeline data │
57
- └─────────────┘ │ Prompts ── Power-user shortcuts │
58
- │ │
59
- │ ┌──────────────┐ │
60
- │ │ File Store │ │
61
- │ │ (YAML files) │ │
62
- │ └──────┬───────┘ │
63
- └────────────────┼─────────────────────┘
64
- │ reads
65
- ┌────────────────┼─────────────────────┐
66
- │ Dashboard │ (Next.js) │
67
- │ ▼ │
68
- │ Pipeline Kanban · Career KB Overview │
69
- │ Analytics · Onboarding Wizard │
70
- └──────────────────────────────────────┘
71
- ```
72
-
73
- ---
74
-
75
- ## Your data stays on your machine
76
-
77
- Career Compass is local-first by design. Your real career data — résumé history, the
78
- companies you're talking to, salary numbers, interview notes — lives in **plain YAML
79
- files on your own disk** and never leaves it.
80
-
81
- - **Where your data lives:** `~/.career-compass/` by default (override with the
82
- `CAREER_DATA_PATH` environment variable). This directory is created and read on *your*
83
- machine. It is **never** uploaded anywhere, and it is **not** part of this npm package.
84
- - **Never committed to git:** `.gitignore` excludes `data/career/` and `data/pipeline/`, so
85
- the only career data in this repo is the fictional sample under `data/example/` (meet Alex
86
- Rivera). Read it, edit it, delete it — it's all just files you own.
87
- - **No account, no cloud sync, no telemetry.** The one request the package ever makes is
88
- `check_setup`'s optional version check against the public npm registry, which carries
89
- nothing about you or your data — see [Privacy Policy](#privacy-policy).
90
- - **What ships in the package:** only the MCP server code and a small set of **fictional
91
- example files** (`data/example/` — the "Alex Rivera" persona). There is no real career
92
- data in the published package, and none can be — the package and your data live in
93
- different places, and the publish-time leak guard enforces it.
94
- - **The dashboard reads your data at request time, locally.** The Next.js routes are
95
- `force-dynamic`, so the dashboard server reads your YAML *when you open a page*, from a
96
- server running on your own `localhost`. Your data is **never baked into a build**, never
97
- prerendered into static HTML, and never sent over the network. *(There's a regression
98
- test, `standalone-dynamic.test.ts`, that guards exactly this.)*
99
- - **No telemetry.** Career Compass makes no analytics or phone-home calls. The only thing
100
- that ever sees your career data is the Claude conversation *you* start, through the MCP
101
- server *you* run.
102
-
103
- In short: this is a tool you run, on your machine, over your files. Treat
104
- `~/.career-compass/` like any private notebook — back it up, don't commit it to a public
105
- repo, and it stays yours.
106
-
107
- ---
108
-
109
- ## Quick Start
110
-
111
- Career Compass is on npm — point Claude straight at it, no clone or build required.
112
-
113
- ### 1. Add to Claude
114
-
115
- Add this to your `~/.claude.json` (Claude Code) or equivalent MCP config:
116
-
117
- ```json
118
- {
119
- "mcpServers": {
120
- "career-compass": {
121
- "command": "npx",
122
- "args": ["-y", "career-compass-mcp"],
123
- "env": {
124
- "CAREER_DATA_PATH": "/Users/you/career-data"
125
- }
126
- }
127
- }
128
- }
129
- ```
130
-
131
- `npx -y career-compass-mcp` fetches and runs the latest server on demand. Point
132
- `CAREER_DATA_PATH` anywhere you like — Career Compass initializes the directory on first
133
- run. Leave it unset to use the default, `~/.career-compass`.
134
-
135
- Prefer a global install? Run `npm install -g career-compass-mcp`, then set
136
- `"command": "career-compass-mcp"` with no args.
137
-
138
- ### 2. Onboard (first conversation)
139
-
140
- Open Claude and say:
141
-
142
- > **"Set up my Career KB. Here's my resume:"** [paste your resume]
143
-
144
- Claude will:
145
- - Extract your work history, achievements, and skills into structured YAML
146
- - Ask clarifying questions about gaps or unclear metrics
147
- - Call `save_career_section` once per section to write it to your `CAREER_DATA_PATH`
148
-
149
- `save_career_section` is the step where your data actually lands on disk — it is
150
- the only tool that writes the Career KB. It saves one section at a time
151
- (`profile`, `experience`, `skills`, `education`, `projects`, `testimonials`),
152
- validates against the schema before touching the file, and keeps the previous
153
- version as a timestamped `.bak`. Because it replaces a section wholesale, your
154
- host will ask you to confirm each write; approving them is what fills the KB.
155
-
156
- That's it. From there, every tool has full context on who you are.
157
-
158
- ---
159
-
160
- ## Data structure
161
-
162
- Career Compass stores all data as YAML files under `CAREER_DATA_PATH` (default `~/.career-compass`):
163
-
164
- ```
165
- ~/.career-compass/
166
- ├── career/
167
- │ ├── profile.yaml # who you are, what you're targeting
168
- │ ├── experience.yaml # roles, achievements (metrics + context + impact)
169
- │ ├── skills.yaml # skills with proficiency and recency
170
- │ ├── education.yaml # degrees, certifications, coursework
171
- │ ├── projects.yaml # portfolio projects
172
- │ └── testimonials.yaml # quotes and recommendations
173
- └── pipeline/
174
- └── applications.yaml # all job applications
175
- ```
176
-
177
- This is your single source of truth — built once, enriched over time, read by every tool. You never need to edit these files by hand: paste a document and ask Claude to save it, and it will extract the structure and write it with `save_career_section`. (`ingest_document` reads a document and pulls achievements out of it, but never writes — `save_career_section` is what puts them on disk.)
178
-
179
- See [`data/example/`](data/example/) in this repo for a fully populated sample (the fictional Alex Rivera).
180
-
181
- ---
182
-
183
- ## Dashboard
184
-
185
- v2.0 includes a local web dashboard — a visual layer on top of your Career KB and pipeline data. Open it alongside Claude or use it standalone to review and manage your search.
186
-
187
- > **Which dashboard is which.** The **lite dashboard** (zero-build, bundled in the npm package) is the maintained, shipped surface — it starts automatically and is what nearly everyone sees. The full **Next.js dashboard** below is a **source-build-only reference**: it is not in the npm package, it is frozen as a design quarry (its detail view, onboarding wizard, and analytics are worked-out reference implementations), and active GUI investment goes to the lite dashboard. See `dashboard/FROZEN.md` for why. The richer in-Claude surface an MCP App would give is deferred — Claude renders MCP Apps only for remote HTTP connectors, not the local stdio/`.mcpb` server this ships as.
188
-
189
- ![Pipeline Kanban](docs/screenshots/pipeline-kanban-dark.png)
190
- ![Application Detail](docs/screenshots/application-detail-dark.png)
191
- ![Career KB](docs/screenshots/career-kb-dark.png)
192
- ![Analytics](docs/screenshots/analytics-dark.png)
193
-
194
- Four views:
195
-
196
- **Pipeline kanban board** — All your applications laid out by stage (Discovered → Applied → Screening → Interviewing → Offer → Closed). Stages change through Claude — ask it to move an application and it calls `pipeline_update`; the board reflects the new stage on the next load. See stale applications at a glance. Click any card to drill in.
197
-
198
- **Application detail view** — Full timeline for a single application: every status change, contacts associated with the role, notes from conversations, and next action. Everything Claude knows about that opportunity in one place.
199
-
200
- **Career KB overview** — Visual summary of your career data: skills radar (proficiency × recency), experience timeline, testimonials, and a completeness indicator showing what Claude has to work with. Useful for spotting gaps before you onboard a new role.
201
-
202
- **Analytics** — Funnel conversion rates, response rates by source, time-in-stage averages, and source effectiveness. See which channels are actually working.
203
-
204
- ### Running the dashboard
205
-
206
- >**Two dashboards ship now.** A built-in **lite dashboard** (zero-build, pure HTML) is bundled
207
- > in the npm package and starts automatically when the full dashboard isn't built - so
208
- > `career-compass-mcp dashboard` always works. The **full dashboard** (Next.js: kanban board,
209
- > analytics, Career KB views, onboarding wizard) still runs from a source build:
210
-
211
- ```bash
212
- git clone https://github.com/benskamps/career-compass-mcp.git
213
- cd career-compass-mcp
214
- npm install # MCP server deps
215
- cd dashboard && npm install && cd .. # dashboard deps (its own package.json)
216
- npm run build
217
-
218
- # Try it with the bundled Alex Rivera sample (no setup, ~1 minute):
219
- npm run dashboard -- --sample
220
- ```
221
-
222
- This opens the dashboard at `http://localhost:3141` (or the next available port). Point
223
- `CAREER_DATA_PATH` at your own data directory to use it for real. The onboarding wizard
224
- walks you through job targets, salary expectations, and confirming your skills inventory —
225
- the gaps a resume doesn't naturally contain.
226
-
227
-
228
- ### Lite dashboard (zero-build)
229
-
230
- Don't want to build the Next.js app? The **lite dashboard** ships inside the npm package and
231
- needs no build step. It's a single self-contained HTML page - pipeline KPIs, a kanban board by
232
- stage, a next-actions panel (overdue follow-ups, upcoming interviews, expiring offers), and a
233
- stage-distribution chart - served by a dependency-free Node server that **re-reads your YAML on
234
- every request**, so a browser refresh always reflects the current state of `~/.career-compass`.
235
-
236
- > Requires **v2.1.0 or newer**. On 2.0.0 the flag does not exist and plain
237
- > `dashboard` reports that no dashboard is available.
238
-
239
- ```bash
240
- # Try it with the bundled Alex Rivera sample - no clone, no build, no setup:
241
- npx -y career-compass-mcp dashboard --lite --sample
242
-
243
- # Or against your own data (CAREER_DATA_PATH, or ~/.career-compass if unset):
244
- npx -y career-compass-mcp dashboard --lite
245
- ```
246
-
247
- `--sample` (alias `--demo`) resolves the demo *inside the installed package*, wherever npx
248
- put it, so it works from any directory and on any shell. The sample is a **read-only
249
- demo**: its dates are shifted to sit around today each time it is read, so the pipeline
250
- always looks like a live search, and Career Compass refuses to write into it. Drop the flag
251
- — and point `CAREER_DATA_PATH` at your own folder, or leave it unset for
252
- `~/.career-compass` — before saving anything.
253
-
254
- Plain `career-compass-mcp dashboard` uses the full dashboard when it's been built and falls back
255
- to the lite one otherwise. Data never leaves your machine - the page has no external assets and
256
- makes no network calls. Clicking a card copies a ready-to-paste prompt for Claude (in Cowork, the
257
- same board is available as a live artifact that dispatches the prompt straight into chat).
258
-
259
- ---
260
-
261
- ## Privacy Policy
262
-
263
- Career Compass runs entirely on your own computer. There is no account, no cloud sync, and
264
- no telemetry. The whole package makes exactly one outbound network request: `check_setup`
265
- asks the public npm registry whether a newer version has been released. It is an
266
- unauthenticated GET for the package name — nothing about you or your data goes with it —
267
- and calling `check_setup` with `checkForUpdates: false` never constructs the request at all.
268
-
269
- - **What it handles:** the career history, job pipeline, and pasted documents you give it.
270
- - **Where it's stored:** plain YAML in the directory you set via `CAREER_DATA_PATH`
271
- (default `~/.career-compass/`), plus timestamped `.bak` copies of previous versions,
272
- and — only while a write is actually happening — a `.write-claim` file that stops a second
273
- Career Compass process from writing at the same time
274
- (the five most recent per file are kept; older ones are pruned on the next write —
275
- backups you make by hand are never touched).
276
- - **Who else sees it:** only the MCP client you connect (e.g. Claude Desktop), and through
277
- it your model provider, under *their* policy — and only for the requests you make.
278
- Career Compass sends nothing anywhere on its own.
279
- - **Third-party sharing:** none. We never receive your data, so there is nothing to share.
280
- - **Retention:** your files stay until you delete them. Remove the `CAREER_DATA_PATH`
281
- directory to erase everything.
282
- - **Contact:** https://github.com/benskamps/career-compass-mcp/issues
283
-
284
- Full policy: **[PRIVACY.md](PRIVACY.md)** ·
285
- published at https://benskamps.github.io/career-compass-mcp/privacy
286
-
287
- ---
288
-
289
- ## Tools
290
-
291
- | Tool | What it does |
292
- |------|-------------|
293
- | `explore_opportunity` | Analyzes a job posting against your Career KB **and your stated preferences** — salary band, remote, relocation, notice period. Returns a fit score, an explicit compensation and location check, matched strengths, gaps, talking points, day-in-the-life, red flags. Pass `sourceFitLabel` ("LinkedIn: strong match") and it will explicitly agree or disagree with the job board, in both directions |
294
- | `research_company` | Builds an intelligence brief: product, culture, funding, interview process, strategic fit |
295
- | `tailor_resume` | Generates an ATS-optimized, tailored resume from your KB — standard, federal, academic, or functional formats |
296
- | `generate_cover_letter` | Writes a personalized cover letter with your actual achievements woven in |
297
- | `format_for_ats` | Reformats resume content for specific ATS systems: Workday, Greenhouse, Lever, LinkedIn, iCIMS, Taleo |
298
- | `pipeline_view` | Reads the pipeline — list, funnel stats, what needs attention, or one application by id. Read-only, so it runs without a permission prompt |
299
- | `pipeline_add` | Adds one job application to the pipeline. Takes an optional starting `status` (defaults to `applied`); unknown statuses are rejected with a did-you-mean suggestion |
300
- | `pipeline_update` | Updates one application — status, notes, follow-up date, a contact, or an interview round |
301
- | `classify_email` | Classifies a job-search email and extracts contacts, dates, and suggested pipeline updates |
302
- | `prepare_interview` | Full interview prep: opening pitch, STAR stories, likely questions, company alignment, questions to ask |
303
- | `interview_arc` | Mid-process projection: reconstructs the arc so far from your recorded rounds and journal signals, then projects what the **next** round will probe — ground already covered, threads the last interview left open, gaps nobody has tested yet, and ranked likely questions |
304
- | `evaluate_offer` | Breaks down total comp, compares to market, builds negotiation strategy, drafts counter scripts |
305
- | `ingest_document` | Extracts achievements from any document: performance review, award email, LinkedIn recommendation, project summary |
306
- | `generate_rejection_response` | Drafts a graceful response that keeps the door open and maintains the relationship |
307
- | `capture_insight` | Appends a dated signal to your career journal — fit signals, interview insights, offer reflections, rejection patterns, skill evidence, wins — which later resume, interview, and fit prompts read back |
308
- | `save_career_section` | Writes one section of your Career KB to disk as plain YAML — this is how the KB gets populated. Replaces the whole section; the previous version is kept as a `.bak` |
309
- | `check_setup` | Health-checks the install in one pass — version vs. the current npm release, data directory, which Career KB sections are filled, whether the pipeline parses, leftover temp files, dashboard status — each finding with the one command that fixes it. Read-only. Run it first when anything seems off |
310
- | `harvest_evidence` | Reads a local project's git history and reports what you measurably did there — months active, files and file types touched, your share of commits, test ratio — each with the exact command that produced it. Only your own commits count, and it says which identity it used. Read-only: it writes nothing, anywhere. It reports counts and asks the questions a commit log cannot answer; turning those into a résumé line is your call, then `capture_insight` records it |
311
-
312
- ## Resources
313
-
314
- Claude can read these directly (e.g., "read my career profile"):
315
-
316
- | Resource | URI | Contents |
317
- |----------|-----|----------|
318
- | Career Profile | `career://profile` | Name, contact, summary, targets, preferences |
319
- | Work Experience | `career://experience` | Full history with achievements |
320
- | Skills Inventory | `career://skills` | Skills with proficiency and recency |
321
- | Projects | `career://projects` | Portfolio with outcomes |
322
- | Education | `career://education` | Degrees, certifications, coursework |
323
- | Testimonials | `career://testimonials` | Quotes, recommendations |
324
- | Full KB | `career://full` | Everything above in one read |
325
- | Pipeline | `career://pipeline` | All applications with status |
326
-
327
- ## Prompts
328
-
329
- Power-user shortcuts (appear in Claude's prompt menu):
330
-
331
- | Prompt | What it does |
332
- |--------|-------------|
333
- | `resume-tailor` | Drop in a posting → get a tailored resume |
334
- | `interview-coach` | Company + role + interview type → full prep package |
335
- | `negotiation-coach` | Paste an offer → get analysis, strategy, and counter scripts |
336
- | `daily-review` | Triage the pipeline → today's highest-leverage moves, overdue items, and upcoming interviews |
337
- | `post-interview-debrief` | Capture what an interview surfaced → record the durable signal and set up the next step |
338
- | `weekly-retro` | Review the week's movement and journal signals → one takeaway that compounds |
339
-
340
- ---
341
-
342
- ## Configuration
343
-
344
- | Env var | Default | Description |
345
- |---------|---------|-------------|
346
- | `CAREER_DATA_PATH` | `~/.career-compass` | Directory where your career and pipeline YAML files are stored |
347
-
348
- ---
349
-
350
- ## Upgrading
351
-
352
- **If something is behaving strangely, start here:**
353
-
354
- > **"Run the Career Compass setup check."**
355
-
356
- That calls `check_setup`, which reports your installed version against the current npm
357
- release, whether your data directory exists and is writable, which Career KB sections are
358
- filled in, whether your pipeline file parses, any leftover temp files, and whether the
359
- dashboard is running — each with the one command that fixes it. It is read-only and usually
360
- answers the question before you have to debug anything.
361
-
362
- It is also the fastest way to find out you are simply on an old version, which is the most
363
- common cause of "this feels rough around the edges."
364
-
365
- Your career data is never touched by an upgrade. It lives in `CAREER_DATA_PATH`, not in the
366
- package, and older data directories keep working — sections added by later releases are
367
- created when you first write them.
368
-
369
- ### Claude Desktop (`.mcpb` bundle)
370
-
371
- The bundle does not self-update. Download the current `.mcpb` from the
372
- [Releases page](https://github.com/benskamps/career-compass-mcp/releases), then in Claude
373
- Desktop go to **Settings → Extensions**, remove the installed Career Compass extension, and
374
- install the new file. Restart Claude Desktop.
375
-
376
- Your settings — including `CAREER_DATA_PATH` — are re-entered on install, so note the path
377
- before you remove the old one. `check_setup` prints it.
378
-
379
- ### npx (the config in Quick Start)
380
-
381
- `npx -y career-compass-mcp` resolves the latest published version, but npx caches, so a
382
- stale copy can persist. To force the current one:
383
-
384
- ```bash
385
- npx -y career-compass-mcp@latest --version
386
- ```
387
-
388
- Then restart your MCP client. If the version still lags, clear the npx cache with
389
- `npm cache clean --force` and try again.
390
-
391
- ### Global npm install
392
-
393
- ```bash
394
- npm install -g career-compass-mcp@latest
395
- career-compass-mcp --version
396
- ```
397
-
398
- Restart your MCP client afterward — it keeps the old server process alive until it does.
399
-
400
- ### From source
401
-
402
- ```bash
403
- git pull
404
- npm install
405
- npm run build:mcp # or `npm run build` for the full Next.js dashboard too
406
- ```
407
-
408
- Restart your MCP client. A source checkout will normally report itself as *ahead* of npm in
409
- `check_setup`; that is expected, not drift.
410
-
411
- ---
412
-
413
- ## Building from Source
414
-
415
- ```bash
416
- git clone https://github.com/benskamps/career-compass-mcp
417
- cd career-compass-mcp
418
- npm install # MCP server deps
419
- cd dashboard && npm install && cd .. # dashboard deps (its own package.json)
420
- npm run build
421
- ```
422
-
423
- The dashboard is a separate package with its own `package.json` and lockfile, so it needs its own `npm install` — the root install deliberately does not carry Next.js or React (that kept 166 MB out of every `npm i career-compass-mcp`).
424
-
425
- `npm run build` compiles both the MCP server (TypeScript → `build/`) and the Next.js dashboard (`dashboard/.next/`). To work on just the MCP server, use `npm run build:mcp`. For dashboard development with hot reload, use `npm run dev:dashboard`.
426
-
427
- Then point your MCP config to `node /path/to/career-compass-mcp/build/src/index.js` (or just use the published package via `npx -y career-compass-mcp`).
428
-
429
- Use `npm run dev` during development — TypeScript watch mode recompiles on save.
430
- Use `npm run inspect` to open the MCP Inspector (web UI for testing tools interactively).
431
-
432
- ---
433
-
434
- ## Why Career Compass
435
-
436
- Job searching is one of the highest-stakes, most document-intensive activities most people do — and most tools treat it as a data entry problem. Spreadsheets for tracking. Templates for resumes. Generic advice for interviews.
437
-
438
- Career Compass treats it as a knowledge problem. Your career history is a corpus. Every application is a retrieval and synthesis task. Every interview is a pattern-matching problem against a known dataset (the posting) and a known corpus (your KB).
439
-
440
- The Career KB is your single source of truth — built once, enriched over time, and used by every tool. A tailored resume draws from it. Interview prep draws from it. Cover letters draw from it. The pipeline tracks against it. Nothing gets lost because it's never in a tab you'll close.
441
-
442
- ---
443
-
444
- ## Development
445
-
446
- ```bash
447
- git clone https://github.com/benskamps/career-compass-mcp.git
448
- cd career-compass-mcp
449
- npm install
450
- cd dashboard && npm install && cd ..
451
-
452
- # MCP server (TypeScript watch)
453
- npm run dev
454
-
455
- # Dashboard (Next.js + Turbopack)
456
- npm run dev:dashboard
457
-
458
- # MCP Inspector (test tools interactively)
459
- npm run inspect
460
-
461
- # Tests
462
- npm run test:mcp # MCP server tests
463
- npm run test # Dashboard tests
464
-
465
- # Storybook (component library)
466
- npm run storybook
467
-
468
- # Use example data for development
469
- CAREER_DATA_PATH=data/example npm run dev:dashboard
470
- ```
471
-
472
- ---
473
-
474
- ## Contributing
475
-
476
- Issues and PRs welcome. If you add a new tool, register it in `src/server.ts` and follow the pattern in any existing tool file — each tool returns a structured prompt that Claude acts on with the full KB in context.
477
-
478
- ---
479
-
480
- ## License
481
-
482
- MIT
483
-
484
- ---
485
-
486
- *Part of the [Brokenbranch Lab](https://www.brokenbranch.dev/lab/) — Ben Schippers' workshop of AI-native tools and research.*
1
+ # Career Compass
2
+
3
+ [![npm](https://img.shields.io/npm/v/career-compass-mcp.svg)](https://www.npmjs.com/package/career-compass-mcp)
4
+ [![npm downloads](https://img.shields.io/npm/dm/career-compass-mcp.svg)](https://www.npmjs.com/package/career-compass-mcp)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
6
+ [![Node](https://img.shields.io/badge/node-%3E%3D18-green.svg)](https://nodejs.org)
7
+ [![MCP](https://img.shields.io/badge/MCP-server-7c4dff.svg)](https://modelcontextprotocol.io)
8
+
9
+ **An AI-native career co-pilot for Claude.**
10
+
11
+ Career Compass gives Claude your entire career history as a working corpus — then uses it
12
+ to tailor every résumé, track every application, prep every interview, and pressure-test
13
+ every offer. One conversation that never forgets what you have done.
14
+
15
+ Your data is plain YAML on your own disk. No account, no cloud sync, no telemetry.
16
+
17
+ ![Career Compass dashboard — pipeline board, next actions, and stage distribution](docs/screenshots/dashboard-lite-dark.png)
18
+
19
+ **See it in 10 seconds.** No install, no config, no data of your own required:
20
+
21
+ ```bash
22
+ npx -y career-compass-mcp dashboard --sample
23
+ ```
24
+
25
+ That opens the screenshot above in your browser, running against a fictional job search
26
+ bundled with the package. It is read-only — nothing is written, and nothing leaves your
27
+ machine.
28
+
29
+ ---
30
+
31
+ ## What it feels like
32
+
33
+ ```
34
+ You: I have a panel interview at Veridian Health on Friday — Director of Operations role.
35
+ Can you prep me?
36
+
37
+ Claude: On it. Reading your career history now...
38
+
39
+ [Generates 90-second pitch, 8 STAR stories matched to likely panel questions,
40
+ company research brief, 10 questions to ask them, and a list of watch-outs
41
+ based on gaps in your background — all in one response]
42
+ ```
43
+
44
+ ```
45
+ You: Here's a job posting I just found. [pastes posting]
46
+ How well do I fit?
47
+
48
+ Claude: Fit score: 8.1/10. Here's why — and here's what they'll probe you on...
49
+
50
+ [Returns matched strengths, honest gap analysis, talking points in their language,
51
+ and a "day in the life" of what the role actually looks like]
52
+ ```
53
+
54
+ ```
55
+ You: Show me what needs attention in my pipeline today.
56
+
57
+ Claude: 3 things:
58
+ - Meridian Logistics follow-up is overdue (8 days since you applied, referral from Marcus Chen)
59
+ - Veridian panel is Friday — prep above
60
+ - Novare rejection arrived — want me to draft a keep-the-door-open response?
61
+ ```
62
+
63
+ ---
64
+
65
+ ## Install
66
+
67
+ Pick your client. Every route runs the same server, and none of them needs a clone or a
68
+ build.
69
+
70
+ ### Claude Code
71
+
72
+ One command:
73
+
74
+ ```bash
75
+ claude mcp add career-compass -s user -- npx -y career-compass-mcp
76
+ ```
77
+
78
+ `-s user` installs it for every project rather than just this one. Confirm it landed with
79
+ `claude mcp list`.
80
+
81
+ To keep your career files somewhere other than the default `~/.career-compass`:
82
+
83
+ ```bash
84
+ claude mcp add career-compass -s user -e CAREER_DATA_PATH=/path/to/career-data -- npx -y career-compass-mcp
85
+ ```
86
+
87
+ ### Claude Desktop
88
+
89
+ **The extension bundle is the short way.** Download the `.mcpb` file from the
90
+ [Releases page](https://github.com/benskamps/career-compass-mcp/releases/latest), then in
91
+ Claude Desktop go to **Settings → Extensions** and install it. There is no JSON to edit and
92
+ nothing to install first. Set `CAREER_DATA_PATH` in the extension's own settings if you
93
+ want your files somewhere other than `~/.career-compass`.
94
+
95
+ The bundle does not self-update: to upgrade, download the newer `.mcpb`, remove the
96
+ installed extension, and install the new file. Note your data path before removing it —
97
+ settings are re-entered on install, and `check_setup` prints the path.
98
+
99
+ **Or point Claude Desktop at npx.** Open **Settings → Developer → Edit Config**, or edit
100
+ the file directly:
101
+
102
+ | OS | Config file |
103
+ |----|-------------|
104
+ | macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
105
+ | Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
106
+ | Linux | `~/.config/Claude/claude_desktop_config.json` |
107
+
108
+ Add the server:
109
+
110
+ ```json
111
+ {
112
+ "mcpServers": {
113
+ "career-compass": {
114
+ "command": "npx",
115
+ "args": ["-y", "career-compass-mcp"]
116
+ }
117
+ }
118
+ }
119
+ ```
120
+
121
+ Restart Claude Desktop. To choose your own data directory, add an `env` block alongside
122
+ `args`:
123
+
124
+ ```json
125
+ "env": { "CAREER_DATA_PATH": "/Users/you/career-data" }
126
+ ```
127
+
128
+ ### Any other MCP client
129
+
130
+ Cursor, Windsurf, Cline, Continue and friends all take the same shape — a stdio server
131
+ with `command: "npx"` and `args: ["-y", "career-compass-mcp"]`. Drop that into whatever the
132
+ client calls its MCP config.
133
+
134
+ **Zed** — add to your `settings.json`:
135
+
136
+ ```json
137
+ {
138
+ "context_servers": {
139
+ "career-compass": {
140
+ "command": {
141
+ "path": "npx",
142
+ "args": ["-y", "career-compass-mcp"]
143
+ }
144
+ }
145
+ }
146
+ }
147
+ ```
148
+
149
+ ### Prefer a global install
150
+
151
+ ```bash
152
+ npm install -g career-compass-mcp
153
+ ```
154
+
155
+ Then use `"command": "career-compass-mcp"` with no `args`, or
156
+ `claude mcp add career-compass -s user -- career-compass-mcp`.
157
+
158
+ ### Confirm it worked
159
+
160
+ Ask Claude:
161
+
162
+ > **"Run the Career Compass setup check."**
163
+
164
+ That calls `check_setup`, which reports your version against the current npm release, where
165
+ your data directory is, which Career KB sections are filled in, whether your pipeline
166
+ parses, and whether the dashboard is running — each finding with the one command that fixes
167
+ it. It is read-only, so it runs without a permission prompt.
168
+
169
+ ---
170
+
171
+ ## Your first conversation
172
+
173
+ Open Claude and say:
174
+
175
+ > **"Set up my Career KB. Here's my résumé:"** [paste your résumé]
176
+
177
+ Claude will extract your work history, achievements, and skills into structured YAML, ask
178
+ clarifying questions about gaps or vague metrics, and call `save_career_section` once per
179
+ section to write it to disk.
180
+
181
+ `save_career_section` is where your data actually lands — it is the only tool that writes
182
+ the Career KB. It saves one section at a time (`profile`, `experience`, `skills`,
183
+ `education`, `projects`, `testimonials`), validates against the schema before touching the
184
+ file, and keeps the previous version as a timestamped `.bak`. Because it replaces a section
185
+ wholesale, your client will ask you to confirm each write; approving them is what fills the
186
+ KB.
187
+
188
+ That is the whole setup. From there every tool has full context on who you are, and the KB
189
+ compounds — each posting you explore, interview you debrief, and offer you weigh can add a
190
+ dated signal back to it.
191
+
192
+ **Already have material lying around?** Performance reviews, award emails, recommendations,
193
+ old project write-ups — paste any of them and ask Claude to pull the achievements out. That
194
+ is `ingest_document`. It reads and extracts but never writes; `save_career_section` is still
195
+ what puts the results on disk.
196
+
197
+ ---
198
+
199
+ ## Your data stays on your machine
200
+
201
+ Career Compass is local-first by design. Your real career data — résumé history, the
202
+ companies you are talking to, salary numbers, interview notes — lives in **plain YAML files
203
+ on your own disk**.
204
+
205
+ - **Where it lives:** `~/.career-compass/` by default, or wherever you point
206
+ `CAREER_DATA_PATH`. The directory is created on first run, on *your* machine, and is not
207
+ part of the npm package.
208
+ - **Who sees it:** only the MCP client you connect it to, and through that client your model
209
+ provider, under *their* policy — and only for the requests you make. Career Compass sends
210
+ it nowhere on its own.
211
+ - **The one network call:** `check_setup` asks the public **npm registry** whether a newer
212
+ version has been released. It is an unauthenticated GET for the package name, carrying
213
+ nothing about you or your data, and calling `check_setup` with `checkForUpdates: false`
214
+ never constructs the request at all. There is no analytics or phone-home path anywhere
215
+ else in the package.
216
+ - **What ships in the package:** the server code and a small set of **fictional** example
217
+ files (`data/example/` — the Alex Rivera persona). A publish-time leak guard enforces that
218
+ no real career data can ride along.
219
+ - **The dashboard reads at request time, locally.** Your YAML is read when you open a page,
220
+ by a server on your own `localhost`. It is never baked into a build, never prerendered,
221
+ and never sent over the network. A regression test (`standalone-dynamic.test.ts`) guards
222
+ exactly that.
223
+ - **What else is in that folder:** timestamped `.bak` copies of previous versions (the five
224
+ most recent per file; older ones are pruned on the next write, and backups you make by
225
+ hand are never touched), plus — only while a write is actually happening — a
226
+ `.write-claim` file that stops a second Career Compass process from writing at the same
227
+ time.
228
+ - **Retention is yours:** files stay until you delete them. Remove the `CAREER_DATA_PATH`
229
+ directory and everything is gone.
230
+
231
+ Treat `~/.career-compass/` like any private notebook — back it up, and do not commit it to a
232
+ public repo. (This repo's `.gitignore` already excludes `data/career/` and `data/pipeline/`.)
233
+
234
+ Full policy: **[PRIVACY.md](PRIVACY.md)** ·
235
+ published at <https://benskamps.github.io/career-compass-mcp/privacy> ·
236
+ questions or concerns: [open an issue](https://github.com/benskamps/career-compass-mcp/issues)
237
+
238
+ ---
239
+
240
+ ## Tools
241
+
242
+ Eighteen tools, grouped by where they land in a search. **Read** tools take no permission
243
+ prompt in most clients; **Write** tools ask before touching your files.
244
+
245
+ ### Find and assess a role
246
+
247
+ | Tool | Access | What it does |
248
+ |------|--------|-------------|
249
+ | `explore_opportunity` | Read | Scores a posting against your KB **and your stated preferences** — salary band, remote, relocation, notice period. Returns a fit score, an explicit comp and location check, matched strengths, honest gaps, talking points, day-in-the-life, red flags. Pass `sourceFitLabel` ("LinkedIn: strong match") and it will agree or disagree with the job board, in both directions |
250
+ | `research_company` | Read | Builds an intelligence brief: product, culture, funding, interview process, strategic fit |
251
+
252
+ ### Apply
253
+
254
+ | Tool | Access | What it does |
255
+ |------|--------|-------------|
256
+ | `tailor_resume` | Read | Generates an ATS-optimized résumé from your KB — standard, federal, academic, or functional |
257
+ | `generate_cover_letter` | Read | Writes a cover letter with your actual achievements woven in, in a tone you pick — professional, conversational, enthusiastic, or concise |
258
+ | `format_for_ats` | Read | Reformats résumé content for a specific ATS: Workday, Greenhouse, Lever, LinkedIn, iCIMS, Taleo, SmartRecruiters, or generic |
259
+
260
+ ### Track the pipeline
261
+
262
+ | Tool | Access | What it does |
263
+ |------|--------|-------------|
264
+ | `pipeline_view` | Read | Lists applications, funnel stats, what needs attention, or one application by id |
265
+ | `pipeline_add` | Write | Adds one application. Optional starting `status` (defaults to `applied`); unknown statuses are rejected with a did-you-mean suggestion |
266
+ | `pipeline_update` | Write | Updates one application — status, notes, follow-up date, a contact, or an interview round |
267
+ | `classify_email` | Read | Classifies a job-search email and extracts contacts, dates, and suggested pipeline updates |
268
+
269
+ ### Interview and decide
270
+
271
+ | Tool | Access | What it does |
272
+ |------|--------|-------------|
273
+ | `prepare_interview` | Read | Full prep: opening pitch, STAR stories, likely questions, company alignment, questions to ask |
274
+ | `interview_arc` | Read | Mid-process projection. Reconstructs the arc so far from your recorded rounds and journal signals, then projects what the **next** round will probe — ground already covered, threads the last interview left open, gaps nobody has tested yet, ranked likely questions |
275
+ | `evaluate_offer` | Read | Breaks down total comp, compares to market, builds negotiation strategy, drafts counter scripts |
276
+ | `generate_rejection_response` | Write | Drafts a graceful keep-the-door-open reply. Pass `applicationId` and it also marks that application rejected |
277
+
278
+ ### Feed the knowledge base
279
+
280
+ | Tool | Access | What it does |
281
+ |------|--------|-------------|
282
+ | `save_career_section` | Write | Writes one section of your Career KB as plain YAML — this is how the KB gets populated. Replaces the whole section; the previous version is kept as a `.bak` |
283
+ | `ingest_document` | Read | Extracts achievements from any document: performance review, award email, recommendation, project summary |
284
+ | `capture_insight` | Write | Appends a dated signal to your career journal — fit signals, interview insights, offer reflections, rejection patterns, skill evidence, wins — which later résumé, interview, and fit prompts read back |
285
+ | `harvest_evidence` | Read | Reads a local project's git history and reports what you measurably did there — months active, files and file types touched, your share of commits, test ratio — each with the exact command that produced it. Only your own commits count, and it names the identity it used. It writes nothing, anywhere |
286
+
287
+ ### Keep the install healthy
288
+
289
+ | Tool | Access | What it does |
290
+ |------|--------|-------------|
291
+ | `check_setup` | Read | Health-checks the install in one pass — version vs. the current npm release, data directory, filled KB sections, pipeline parse, leftover temp files, dashboard status — each with the one command that fixes it. Run it first when anything seems off |
292
+
293
+ ---
294
+
295
+ ## Resources
296
+
297
+ Claude can read these directly ("read my career profile"):
298
+
299
+ | Resource | URI | Contents |
300
+ |----------|-----|----------|
301
+ | Career Profile | `career://profile` | Name, contact, summary, targets, preferences |
302
+ | Work Experience | `career://experience` | Full history with achievements |
303
+ | Skills Inventory | `career://skills` | Skills with proficiency and recency |
304
+ | Projects | `career://projects` | Portfolio with outcomes |
305
+ | Education | `career://education` | Degrees, certifications, coursework |
306
+ | Testimonials | `career://testimonials` | Quotes, recommendations |
307
+ | Career Journal | `career://journal` | Dated signals captured over time |
308
+ | Full KB | `career://full` | Everything above in one read |
309
+ | Pipeline | `career://pipeline` | All applications with status |
310
+
311
+ **They are live.** Career Compass implements MCP resource subscriptions: subscribe to a
312
+ resource and the server tells you when the file behind it changes on disk — whoever changed
313
+ it, whether that was a tool call, the dashboard, or you in an editor. Three peers share one
314
+ directory of plain files and none of them owns it. Nothing is watched until a client
315
+ subscribes, so a client that never does pays nothing for the feature.
316
+
317
+ ---
318
+
319
+ ## Prompts
320
+
321
+ Power-user shortcuts. Most clients surface these as slash commands.
322
+
323
+ | Prompt | What it does |
324
+ |--------|-------------|
325
+ | `resume-tailor` | Drop in a posting → get a tailored résumé |
326
+ | `interview-coach` | Company + role + interview type → full prep package |
327
+ | `negotiation-coach` | Paste an offer → analysis, strategy, and counter scripts |
328
+ | `setup-career-kb` | Walk through building your Career KB from scratch — profile, experience, skills, first pipeline entry |
329
+ | `daily-review` | Triage the pipeline → today's highest-leverage moves, overdue items, upcoming interviews |
330
+ | `post-interview-debrief` | Capture what an interview surfaced → record the durable signal, set up the next step |
331
+ | `weekly-retro` | Review the week's movement and journal signals → one takeaway that compounds |
332
+
333
+ ---
334
+
335
+ ## The dashboard
336
+
337
+ A local web view of the same YAML the tools read. It ships inside the npm package as a
338
+ single self-contained HTML page with no build step, no dependencies, and no external
339
+ assets — pipeline KPIs, a kanban board by stage, a next-actions panel (overdue follow-ups,
340
+ upcoming interviews, expiring offers), and a stage-distribution chart.
341
+
342
+ ```bash
343
+ # The bundled demo — no clone, no build, no data of your own:
344
+ npx -y career-compass-mcp dashboard --sample
345
+
346
+ # Your own data (CAREER_DATA_PATH, or ~/.career-compass if unset):
347
+ npx -y career-compass-mcp dashboard
348
+ ```
349
+
350
+ It re-reads your YAML on **every request**, so a browser refresh always shows the current
351
+ state of your files. Stages change through Claude — ask it to move an application and it
352
+ calls `pipeline_update`; the board reflects that on the next load. Click a card to open its
353
+ detail drawer (days in stage, follow-up, posting link, contacts, interview rounds, latest
354
+ note); the drawer's button and every next-action row copy a ready-to-paste prompt for
355
+ Claude, which is where the work actually happens. Type in the filter box (or press `/`) to
356
+ narrow the board by company or role; the column counts follow.
357
+
358
+ ![The same dashboard in light mode](docs/screenshots/dashboard-lite-light.png)
359
+
360
+ `--sample` (alias `--demo`) resolves the demo *inside the installed package*, wherever npx
361
+ put it, so it works from any directory and any shell. The sample's dates are shifted to sit
362
+ around today each time it is read — so the pipeline always looks like a live search — and
363
+ Career Compass refuses to write into it.
364
+
365
+ Other flags: `--port <n>` (default 3141, falling back to the next free port), `--no-open` to
366
+ skip launching a browser, `--lite` to force this dashboard explicitly. Full list:
367
+ `career-compass-mcp --help`.
368
+
369
+ > **A second, frozen dashboard exists.** The repo also contains a full Next.js app — kanban
370
+ > with a detail view, an onboarding wizard, analytics. It is **not** in the npm package and
371
+ > is frozen as a design reference rather than a product; GUI investment goes to the
372
+ > dashboard above. See [`dashboard/FROZEN.md`](dashboard/FROZEN.md) for the reasoning. An
373
+ > in-Claude MCP App board is deferred too: Claude renders MCP Apps only for remote HTTP
374
+ > connectors, not the local stdio transport this ships as.
375
+
376
+ ---
377
+
378
+ ## The files on disk
379
+
380
+ ```
381
+ ~/.career-compass/ # or wherever CAREER_DATA_PATH points
382
+ ├── career/
383
+ │ ├── profile.yaml # who you are, what you're targeting
384
+ │ ├── experience.yaml # roles, achievements (metrics + context + impact)
385
+ │ ├── skills.yaml # skills with proficiency and recency
386
+ │ ├── education.yaml # degrees, certifications, coursework
387
+ │ ├── projects.yaml # portfolio projects
388
+ │ ├── testimonials.yaml # quotes and recommendations
389
+ │ └── journal.yaml # dated signals, appended over time
390
+ └── pipeline/
391
+ └── applications.yaml # all job applications
392
+ ```
393
+
394
+ This is your single source of truth — built once, enriched over time, read by every tool.
395
+ You never need to edit these files by hand: paste a document and ask Claude to save it. But
396
+ they are plain YAML, so you can.
397
+
398
+ [`data/example/`](data/example/) in this repo is a fully populated sample (the fictional
399
+ Alex Rivera) if you want to see the shape before writing your own.
400
+
401
+ ---
402
+
403
+ ## Configuration
404
+
405
+ | Env var | Default | Description |
406
+ |---------|---------|-------------|
407
+ | `CAREER_DATA_PATH` | `~/.career-compass` | Directory holding your career and pipeline YAML |
408
+
409
+ ---
410
+
411
+ ## Troubleshooting and upgrading
412
+
413
+ **If anything seems off, start here:**
414
+
415
+ > **"Run the Career Compass setup check."**
416
+
417
+ `check_setup` is read-only and usually answers the question before you have to debug
418
+ anything. It is also the fastest way to find out you are simply on an old version, which is
419
+ the most common cause of "this feels rough around the edges."
420
+
421
+ Your career data is never touched by an upgrade. It lives in `CAREER_DATA_PATH`, not in the
422
+ package, and older data directories keep working — sections added by later releases are
423
+ created when you first write them.
424
+
425
+ **On npx.** `npx -y career-compass-mcp` resolves the latest published version, but npx
426
+ caches, so a stale copy can persist. Force the current one, then restart your client:
427
+
428
+ ```bash
429
+ npx -y career-compass-mcp@latest --version
430
+ ```
431
+
432
+ If the version still lags, run `npm cache clean --force` and try again.
433
+
434
+ **On a global install.** `npm install -g career-compass-mcp@latest`, then
435
+ `career-compass-mcp --version`. Restart your client afterward — it keeps the old server
436
+ process alive until it does.
437
+
438
+ **From source.** `git pull && npm install && npm run build:mcp`, then restart your client. A
439
+ source checkout normally reports itself as *ahead* of npm in `check_setup`; that is
440
+ expected, not drift.
441
+
442
+ ---
443
+
444
+ ## How it works
445
+
446
+ ```
447
+ ┌─────────────┐ ┌────────────────────────────────────────┐
448
+ │ │ MCP │ MCP server (Node.js) │
449
+ │ Claude │◄────────►│ │
450
+ │ │ stdio │ Tools ······ résumé, pipeline, prep │
451
+ └─────────────┘ │ Resources ·· Career KB, pipeline │
452
+ │ Prompts ···· slash-command shortcuts │
453
+ └───────────────────┬────────────────────┘
454
+ │ reads + writes
455
+ ┌──────────────▼───────────────┐
456
+ │ Plain YAML on your disk │
457
+ │ CAREER_DATA_PATH │
458
+ └──────────────▲───────────────┘
459
+ │ re-reads per request
460
+ ┌──────────────┴───────────────┐
461
+ │ Local dashboard (localhost) │
462
+ └──────────────────────────────┘
463
+ ```
464
+
465
+ No database, no server to host, no state the model has to carry between sessions. The files
466
+ are the interface.
467
+
468
+ **Diagrams:** [`docs/architecture.md`](docs/architecture.md) has the detailed version —
469
+ the path a posting takes from paste to offer, the application state machine, what happens
470
+ during your first conversation, how three peers share one directory without stepping on
471
+ each other, and why a write cannot be left half-done.
472
+
473
+ ---
474
+
475
+ ## Building from source
476
+
477
+ ```bash
478
+ git clone https://github.com/benskamps/career-compass-mcp.git
479
+ cd career-compass-mcp
480
+ npm install # MCP server deps
481
+ cd dashboard && npm install && cd .. # only if you want the frozen Next.js app
482
+ npm run build:mcp # or `npm run build` to include that app
483
+ ```
484
+
485
+ Point your MCP config at `node /path/to/career-compass-mcp/build/src/index.js`.
486
+
487
+ The Next.js dashboard is a separate package with its own `package.json` and lockfile, so it
488
+ needs its own `npm install` — the root install deliberately carries neither Next.js nor
489
+ React, which keeps 166 MB out of every `npm i career-compass-mcp`.
490
+
491
+ Common tasks:
492
+
493
+ ```bash
494
+ npm run dev # TypeScript watch mode
495
+ npm run inspect # MCP Inspector — exercise tools interactively
496
+ npm run test:mcp # MCP server test suite
497
+ npm test # server + dashboard suites
498
+ npm run visuals # regenerate the screenshots in this README
499
+ npm run pack:mcpb # build the Claude Desktop .mcpb extension bundle
500
+ npm run dev:dashboard # frozen Next.js app, hot reload
501
+
502
+ # Develop against the fictional sample rather than your real data
503
+ CAREER_DATA_PATH=data/example npm run dev:dashboard
504
+ ```
505
+
506
+ ---
507
+
508
+ ## Why Career Compass
509
+
510
+ Job searching is one of the highest-stakes, most document-intensive things most people ever
511
+ do — and most tools treat it as a data-entry problem. Spreadsheets for tracking. Templates
512
+ for résumés. Generic advice for interviews.
513
+
514
+ Career Compass treats it as a knowledge problem. Your career history is a corpus. Every
515
+ application is a retrieval and synthesis task. Every interview is a pattern-match against a
516
+ known dataset (the posting) and a known corpus (you).
517
+
518
+ The Career KB is the single source of truth — built once, enriched over time, read by every
519
+ tool. A tailored résumé draws from it. Interview prep draws from it. Cover letters draw from
520
+ it. The pipeline tracks against it. Nothing gets lost, because nothing lives in a tab you
521
+ will close.
522
+
523
+ ---
524
+
525
+ ## Contributing
526
+
527
+ [Issues](https://github.com/benskamps/career-compass-mcp/issues) and PRs welcome — bug
528
+ reports with a reproduction are especially useful, and they do get fixed. If you add a tool,
529
+ register it in `src/server.ts` and follow the
530
+ pattern in any existing tool file — each tool returns a structured prompt that Claude acts
531
+ on with the full KB in context. The test suite includes docs-truth guards, so a new tool or
532
+ prompt that is not documented here fails CI rather than surprising a stranger.
533
+
534
+ ## License
535
+
536
+ MIT
537
+
538
+ ---
539
+
540
+ *Part of the [Brokenbranch Lab](https://www.brokenbranch.dev/lab/) — Ben Schippers' workshop of AI-native tools and research.*