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