career-compass-mcp 2.0.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.
- package/LICENSE +21 -0
- package/README.md +340 -0
- package/build/bin/cli.d.ts +9 -0
- package/build/bin/cli.d.ts.map +1 -0
- package/build/bin/cli.js +134 -0
- package/build/bin/cli.js.map +1 -0
- package/build/src/index.d.ts +3 -0
- package/build/src/index.d.ts.map +1 -0
- package/build/src/index.js +18 -0
- package/build/src/index.js.map +1 -0
- package/build/src/prompts/index.d.ts +3 -0
- package/build/src/prompts/index.d.ts.map +1 -0
- package/build/src/prompts/index.js +122 -0
- package/build/src/prompts/index.js.map +1 -0
- package/build/src/resources/career-kb.d.ts +3 -0
- package/build/src/resources/career-kb.d.ts.map +1 -0
- package/build/src/resources/career-kb.js +143 -0
- package/build/src/resources/career-kb.js.map +1 -0
- package/build/src/schemas/career-schema.d.ts +361 -0
- package/build/src/schemas/career-schema.d.ts.map +1 -0
- package/build/src/schemas/career-schema.js +146 -0
- package/build/src/schemas/career-schema.js.map +1 -0
- package/build/src/server.d.ts +3 -0
- package/build/src/server.d.ts.map +1 -0
- package/build/src/server.js +30 -0
- package/build/src/server.js.map +1 -0
- package/build/src/storage/file-store.d.ts +22 -0
- package/build/src/storage/file-store.d.ts.map +1 -0
- package/build/src/storage/file-store.js +163 -0
- package/build/src/storage/file-store.js.map +1 -0
- package/build/src/tools/career-kb.d.ts +3 -0
- package/build/src/tools/career-kb.d.ts.map +1 -0
- package/build/src/tools/career-kb.js +148 -0
- package/build/src/tools/career-kb.js.map +1 -0
- package/build/src/tools/interview.d.ts +3 -0
- package/build/src/tools/interview.d.ts.map +1 -0
- package/build/src/tools/interview.js +194 -0
- package/build/src/tools/interview.js.map +1 -0
- package/build/src/tools/opportunity.d.ts +3 -0
- package/build/src/tools/opportunity.d.ts.map +1 -0
- package/build/src/tools/opportunity.js +137 -0
- package/build/src/tools/opportunity.js.map +1 -0
- package/build/src/tools/pipeline.d.ts +11 -0
- package/build/src/tools/pipeline.d.ts.map +1 -0
- package/build/src/tools/pipeline.js +295 -0
- package/build/src/tools/pipeline.js.map +1 -0
- package/build/src/tools/resume.d.ts +3 -0
- package/build/src/tools/resume.d.ts.map +1 -0
- package/build/src/tools/resume.js +222 -0
- package/build/src/tools/resume.js.map +1 -0
- package/build/src/types/tool-args.d.ts +52 -0
- package/build/src/types/tool-args.d.ts.map +1 -0
- package/build/src/types/tool-args.js +2 -0
- package/build/src/types/tool-args.js.map +1 -0
- package/data/example/career/experience.yaml +67 -0
- package/data/example/career/profile.yaml +31 -0
- package/data/example/career/skills.yaml +71 -0
- package/data/example/career/testimonials.yaml +26 -0
- package/data/example/pipeline/applications.yaml +312 -0
- package/package.json +82 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { loadPipeline, savePipeline, isCorruptDataError } from "../storage/file-store.js";
|
|
3
|
+
import { ApplicationStatus } from "../schemas/career-schema.js";
|
|
4
|
+
import { randomUUID } from "crypto";
|
|
5
|
+
// ─── Extracted Handler Functions ──────────────────────────────────────────────
|
|
6
|
+
export async function handleAdd(args, pipeline) {
|
|
7
|
+
const id = randomUUID().slice(0, 8);
|
|
8
|
+
const now = new Date().toISOString();
|
|
9
|
+
const newApp = {
|
|
10
|
+
id,
|
|
11
|
+
company: args.company,
|
|
12
|
+
role: args.role,
|
|
13
|
+
status: "applied",
|
|
14
|
+
dateApplied: now.slice(0, 10),
|
|
15
|
+
dateUpdated: now,
|
|
16
|
+
postingUrl: args.postingUrl,
|
|
17
|
+
postingText: args.postingText,
|
|
18
|
+
source: args.source,
|
|
19
|
+
referral: args.referral,
|
|
20
|
+
priority: args.priority ?? "medium",
|
|
21
|
+
excitement: args.excitement,
|
|
22
|
+
salaryRange: (args.salaryMin || args.salaryMax) ? { min: args.salaryMin, max: args.salaryMax, currency: "USD" } : undefined,
|
|
23
|
+
contacts: [],
|
|
24
|
+
interviewRounds: [],
|
|
25
|
+
notes: [],
|
|
26
|
+
coverLetterGenerated: false,
|
|
27
|
+
remote: "unknown",
|
|
28
|
+
};
|
|
29
|
+
pipeline.applications.push(newApp);
|
|
30
|
+
await savePipeline(pipeline);
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: `✅ Added application: **${args.role}** at **${args.company}**\nID: \`${id}\`\nStatus: applied` }],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function handleUpdate(args, pipeline) {
|
|
36
|
+
const idx = pipeline.applications.findIndex(a => a.id === args.id);
|
|
37
|
+
if (idx === -1)
|
|
38
|
+
return { content: [{ type: "text", text: `❌ Application ${args.id} not found.` }] };
|
|
39
|
+
const app = pipeline.applications[idx];
|
|
40
|
+
if (args.status)
|
|
41
|
+
app.status = args.status;
|
|
42
|
+
if (args.followUpDue)
|
|
43
|
+
app.followUpDue = args.followUpDue;
|
|
44
|
+
if (args.priority)
|
|
45
|
+
app.priority = args.priority;
|
|
46
|
+
if (args.notes)
|
|
47
|
+
app.notes = [...app.notes, `[${new Date().toISOString().slice(0, 10)}] ${args.notes}`];
|
|
48
|
+
if (args.contactName) {
|
|
49
|
+
app.contacts.push({ name: args.contactName, title: args.contactTitle, email: args.contactEmail });
|
|
50
|
+
}
|
|
51
|
+
if (args.interviewType) {
|
|
52
|
+
app.interviewRounds.push({ type: args.interviewType, date: args.interviewDate, interviewers: [], notes: "" });
|
|
53
|
+
}
|
|
54
|
+
app.dateUpdated = new Date().toISOString();
|
|
55
|
+
pipeline.applications[idx] = app;
|
|
56
|
+
await savePipeline(pipeline);
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: "text", text: `✅ Updated **${app.role}** at **${app.company}** (${app.id})\nStatus: ${app.status}` }],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function handleGet(args, pipeline) {
|
|
62
|
+
const app = pipeline.applications.find(a => a.id === args.id);
|
|
63
|
+
if (!app)
|
|
64
|
+
return { content: [{ type: "text", text: `❌ Application ${args.id} not found.` }] };
|
|
65
|
+
return { content: [{ type: "text", text: JSON.stringify(app, null, 2) }] };
|
|
66
|
+
}
|
|
67
|
+
export function handleList(args, pipeline) {
|
|
68
|
+
let apps = [...pipeline.applications];
|
|
69
|
+
if (args.filterStatus)
|
|
70
|
+
apps = apps.filter(a => a.status === args.filterStatus);
|
|
71
|
+
if (args.filterPriority)
|
|
72
|
+
apps = apps.filter(a => a.priority === args.filterPriority);
|
|
73
|
+
const sortBy = args.sortBy ?? "date";
|
|
74
|
+
apps.sort((a, b) => {
|
|
75
|
+
if (sortBy === "date")
|
|
76
|
+
return b.dateUpdated.localeCompare(a.dateUpdated);
|
|
77
|
+
if (sortBy === "company")
|
|
78
|
+
return a.company.localeCompare(b.company);
|
|
79
|
+
if (sortBy === "excitement")
|
|
80
|
+
return (b.excitement ?? 0) - (a.excitement ?? 0);
|
|
81
|
+
if (sortBy === "priority") {
|
|
82
|
+
const p = { high: 0, medium: 1, low: 2 };
|
|
83
|
+
return p[a.priority] - p[b.priority];
|
|
84
|
+
}
|
|
85
|
+
return 0;
|
|
86
|
+
});
|
|
87
|
+
const limited = apps.slice(0, args.limit ?? 20);
|
|
88
|
+
const rows = limited.map(a => `| ${a.id} | ${a.company} | ${a.role} | ${a.status} | ${a.priority} | ${a.dateUpdated.slice(0, 10)} |`).join("\n");
|
|
89
|
+
return {
|
|
90
|
+
content: [{
|
|
91
|
+
type: "text",
|
|
92
|
+
text: `# Applications (${apps.length} total, showing ${limited.length})\n\n| ID | Company | Role | Status | Priority | Updated |\n|---|---|---|---|---|---|\n${rows}`,
|
|
93
|
+
}],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function handleStats(pipeline) {
|
|
97
|
+
const apps = pipeline.applications;
|
|
98
|
+
const byStatus = apps.reduce((acc, a) => { acc[a.status] = (acc[a.status] ?? 0) + 1; return acc; }, {});
|
|
99
|
+
const total = apps.length;
|
|
100
|
+
const active = apps.filter(a => !["rejected", "withdrawn", "accepted", "ghosted"].includes(a.status)).length;
|
|
101
|
+
const ghosted = apps.filter(a => a.status === "ghosted").length;
|
|
102
|
+
const responseRate = total > 0 ? Math.round(((total - apps.filter(a => a.status === "applied").length) / total) * 100) : 0;
|
|
103
|
+
const statsText = Object.entries(byStatus)
|
|
104
|
+
.sort((a, b) => b[1] - a[1])
|
|
105
|
+
.map(([status, count]) => `- **${status}**: ${count}`)
|
|
106
|
+
.join("\n");
|
|
107
|
+
return {
|
|
108
|
+
content: [{
|
|
109
|
+
type: "text",
|
|
110
|
+
text: `# Pipeline Statistics
|
|
111
|
+
|
|
112
|
+
**Total applications:** ${total}
|
|
113
|
+
**Active:** ${active}
|
|
114
|
+
**Response rate:** ${responseRate}%
|
|
115
|
+
**Ghost rate:** ${total > 0 ? Math.round((ghosted / total) * 100) : 0}%
|
|
116
|
+
|
|
117
|
+
## By Status
|
|
118
|
+
${statsText}
|
|
119
|
+
|
|
120
|
+
## High Priority Active
|
|
121
|
+
${apps.filter(a => a.priority === "high" && !["rejected", "withdrawn", "accepted", "ghosted"].includes(a.status)).map(a => `- ${a.company} / ${a.role} (${a.status})`).join("\n") || "None"}`,
|
|
122
|
+
}],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export function handleNextActions(pipeline) {
|
|
126
|
+
const now = new Date();
|
|
127
|
+
const actions = [];
|
|
128
|
+
for (const app of pipeline.applications) {
|
|
129
|
+
if (["rejected", "withdrawn", "accepted"].includes(app.status))
|
|
130
|
+
continue;
|
|
131
|
+
const updatedDate = new Date(app.dateUpdated);
|
|
132
|
+
const daysSinceUpdate = Math.floor((now.getTime() - updatedDate.getTime()) / (1000 * 60 * 60 * 24));
|
|
133
|
+
if (app.status === "applied" && daysSinceUpdate >= 7) {
|
|
134
|
+
actions.push(`📬 **Follow up** — ${app.company} / ${app.role} (applied ${daysSinceUpdate}d ago, ID: ${app.id})`);
|
|
135
|
+
}
|
|
136
|
+
if (app.status === "screening" && daysSinceUpdate >= 5) {
|
|
137
|
+
actions.push(`📞 **Check status** — ${app.company} / ${app.role} (in screening ${daysSinceUpdate}d, ID: ${app.id})`);
|
|
138
|
+
}
|
|
139
|
+
if (app.followUpDue && new Date(app.followUpDue) <= now) {
|
|
140
|
+
actions.push(`⚠️ **Overdue follow-up** — ${app.company} / ${app.role} (due ${app.followUpDue}, ID: ${app.id})`);
|
|
141
|
+
}
|
|
142
|
+
if (app.status === "interviewing") {
|
|
143
|
+
const nextInterview = app.interviewRounds.find(r => r.date && new Date(r.date) > now);
|
|
144
|
+
if (nextInterview) {
|
|
145
|
+
actions.push(`🎯 **Upcoming interview** — ${app.company} / ${app.role}: ${nextInterview.type} on ${nextInterview.date} (ID: ${app.id})`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (app.status === "offer") {
|
|
149
|
+
actions.push(`💰 **Pending offer** — ${app.company} / ${app.role} — evaluate and respond (ID: ${app.id})`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
content: [{
|
|
154
|
+
type: "text",
|
|
155
|
+
text: actions.length > 0
|
|
156
|
+
? `# Next Actions (${actions.length})\n\n${actions.join("\n")}`
|
|
157
|
+
: "✅ No immediate actions needed. Your pipeline is up to date.",
|
|
158
|
+
}],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// ─── Tool Registration ────────────────────────────────────────────────────────
|
|
162
|
+
export function registerPipelineTools(server) {
|
|
163
|
+
server.registerTool("manage_pipeline", {
|
|
164
|
+
title: "Manage Application Pipeline",
|
|
165
|
+
description: "Add, update, list, and analyze job applications. Track status from discovered through offer/rejection.",
|
|
166
|
+
inputSchema: {
|
|
167
|
+
action: z.enum(["add", "update", "list", "stats", "next_actions", "get"]).describe("Operation to perform"),
|
|
168
|
+
// For add
|
|
169
|
+
company: z.string().optional(),
|
|
170
|
+
role: z.string().optional(),
|
|
171
|
+
postingUrl: z.string().optional(),
|
|
172
|
+
postingText: z.string().optional().describe("Full posting text to cache"),
|
|
173
|
+
source: z.string().optional().describe("Where you found it: LinkedIn, Referral, Company site, etc."),
|
|
174
|
+
referral: z.string().optional(),
|
|
175
|
+
priority: z.enum(["high", "medium", "low"]).optional(),
|
|
176
|
+
excitement: z.number().min(1).max(10).optional(),
|
|
177
|
+
salaryMin: z.number().optional(),
|
|
178
|
+
salaryMax: z.number().optional(),
|
|
179
|
+
// For update
|
|
180
|
+
id: z.string().optional().describe("Application ID (required for update/get)"),
|
|
181
|
+
status: ApplicationStatus.optional(),
|
|
182
|
+
notes: z.string().optional().describe("Note to add to this application"),
|
|
183
|
+
followUpDue: z.string().optional().describe("ISO date for follow-up reminder"),
|
|
184
|
+
contactName: z.string().optional(),
|
|
185
|
+
contactTitle: z.string().optional(),
|
|
186
|
+
contactEmail: z.string().optional(),
|
|
187
|
+
interviewType: z.enum(["phone_screen", "behavioral", "technical", "panel", "final", "offer_call", "other"]).optional(),
|
|
188
|
+
interviewDate: z.string().optional(),
|
|
189
|
+
// For list
|
|
190
|
+
filterStatus: ApplicationStatus.optional().describe("Filter by status"),
|
|
191
|
+
filterPriority: z.enum(["high", "medium", "low"]).optional(),
|
|
192
|
+
sortBy: z.enum(["date", "status", "priority", "company", "excitement"]).optional().default("date"),
|
|
193
|
+
limit: z.number().optional().default(20),
|
|
194
|
+
},
|
|
195
|
+
}, async (args) => {
|
|
196
|
+
let pipeline;
|
|
197
|
+
try {
|
|
198
|
+
pipeline = await loadPipeline();
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
if (isCorruptDataError(error)) {
|
|
202
|
+
return { content: [{ type: "text", text: `❌ ${error.message}` }] };
|
|
203
|
+
}
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
switch (args.action) {
|
|
207
|
+
case "add": {
|
|
208
|
+
if (!args.company || !args.role) {
|
|
209
|
+
return { content: [{ type: "text", text: "❌ company and role are required for add action." }] };
|
|
210
|
+
}
|
|
211
|
+
return handleAdd(args, pipeline);
|
|
212
|
+
}
|
|
213
|
+
case "update": {
|
|
214
|
+
if (!args.id)
|
|
215
|
+
return { content: [{ type: "text", text: "❌ id is required for update action." }] };
|
|
216
|
+
return handleUpdate(args, pipeline);
|
|
217
|
+
}
|
|
218
|
+
case "get": {
|
|
219
|
+
if (!args.id)
|
|
220
|
+
return { content: [{ type: "text", text: "❌ id is required for get action." }] };
|
|
221
|
+
return handleGet(args, pipeline);
|
|
222
|
+
}
|
|
223
|
+
case "list":
|
|
224
|
+
return handleList(args, pipeline);
|
|
225
|
+
case "stats":
|
|
226
|
+
return handleStats(pipeline);
|
|
227
|
+
case "next_actions":
|
|
228
|
+
return handleNextActions(pipeline);
|
|
229
|
+
default:
|
|
230
|
+
return { content: [{ type: "text", text: `❌ Unknown action: ${args.action}` }] };
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
server.registerTool("classify_email", {
|
|
234
|
+
title: "Classify Email",
|
|
235
|
+
description: "Classify a job-search-related email and extract structured data: type, company, role, contact, next action, and urgency.",
|
|
236
|
+
inputSchema: {
|
|
237
|
+
emailContent: z.string().describe("Full email content — paste subject line and body"),
|
|
238
|
+
autoUpdatePipeline: z.boolean().default(false).describe("If true, automatically update the pipeline based on classification"),
|
|
239
|
+
},
|
|
240
|
+
}, async ({ emailContent, autoUpdatePipeline }) => {
|
|
241
|
+
let pipeline;
|
|
242
|
+
try {
|
|
243
|
+
pipeline = await loadPipeline();
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
if (isCorruptDataError(error)) {
|
|
247
|
+
return { content: [{ type: "text", text: `❌ ${error.message}` }] };
|
|
248
|
+
}
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
const companyList = [...new Set(pipeline.applications.map(a => a.company))].join(", ");
|
|
252
|
+
return {
|
|
253
|
+
content: [{
|
|
254
|
+
type: "text",
|
|
255
|
+
text: `# Email Classification Request
|
|
256
|
+
|
|
257
|
+
## Email Content
|
|
258
|
+
${emailContent}
|
|
259
|
+
|
|
260
|
+
## Known Companies in Pipeline
|
|
261
|
+
${companyList || "None yet"}
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
**Instructions for Claude:**
|
|
266
|
+
Classify this email and extract structured data:
|
|
267
|
+
|
|
268
|
+
### Classification
|
|
269
|
+
- **Type:** one of: recruiter_outreach | application_confirmation | interview_invite | technical_assessment | rejection | offer | reference_request | networking | unknown
|
|
270
|
+
- **Urgency:** high (response needed today) | medium (respond within 2 days) | low (FYI only)
|
|
271
|
+
- **Sentiment:** positive | neutral | negative
|
|
272
|
+
|
|
273
|
+
### Extracted Data
|
|
274
|
+
- **Company:**
|
|
275
|
+
- **Role:**
|
|
276
|
+
- **Contact name:**
|
|
277
|
+
- **Contact title:**
|
|
278
|
+
- **Contact email:**
|
|
279
|
+
- **Date/time mentioned:** (for interviews or deadlines)
|
|
280
|
+
- **Salary mentioned:** (if any)
|
|
281
|
+
|
|
282
|
+
### Suggested Pipeline Action
|
|
283
|
+
- Which application does this match? (match against known companies: ${companyList || "none"})
|
|
284
|
+
- What status update should be made?
|
|
285
|
+
- What follow-up action is needed and by when?
|
|
286
|
+
|
|
287
|
+
### Suggested Response Draft
|
|
288
|
+
Write a brief, professional reply (3-5 sentences) appropriate for this email type.
|
|
289
|
+
|
|
290
|
+
${autoUpdatePipeline ? "\n**Auto-update:** After classifying, call manage_pipeline with action='update' to update the matching application." : ""}`,
|
|
291
|
+
}],
|
|
292
|
+
};
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/tools/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/tools/resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmP3D"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { loadCareerData } from "../storage/file-store.js";
|
|
3
|
+
export function registerResumeTools(server) {
|
|
4
|
+
server.registerTool("tailor_resume", {
|
|
5
|
+
title: "Tailor Resume",
|
|
6
|
+
description: "Generate a tailored, ATS-optimized resume matched to a specific job posting using your Career KB.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
posting: z.string().describe("Full job posting text"),
|
|
9
|
+
format: z.enum(["standard", "federal", "academic", "functional"]).default("standard").describe("Resume format"),
|
|
10
|
+
pages: z.number().min(1).max(4).default(2).describe("Target page count"),
|
|
11
|
+
includeProjects: z.boolean().default(true).describe("Include projects section"),
|
|
12
|
+
focusAreas: z.string().optional().describe("Specific areas to emphasize, e.g. 'leadership, data analysis'"),
|
|
13
|
+
},
|
|
14
|
+
}, async ({ posting, format, pages, includeProjects, focusAreas }) => {
|
|
15
|
+
const career = await loadCareerData();
|
|
16
|
+
if (!career) {
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: "text", text: "⚠️ No career data found. Please populate your Career KB first." }],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
content: [{
|
|
23
|
+
type: "text",
|
|
24
|
+
text: `# Resume Tailoring Request
|
|
25
|
+
|
|
26
|
+
## Full Career KB
|
|
27
|
+
${JSON.stringify(career, null, 2)}
|
|
28
|
+
|
|
29
|
+
## Job Posting
|
|
30
|
+
${posting}
|
|
31
|
+
|
|
32
|
+
## Output Requirements
|
|
33
|
+
- **Format:** ${format}
|
|
34
|
+
- **Length:** ${pages} page(s)
|
|
35
|
+
- **Include projects:** ${includeProjects}
|
|
36
|
+
${focusAreas ? `- **Emphasis areas:** ${focusAreas}` : ""}
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
**Instructions for Claude:**
|
|
41
|
+
Using the complete Career KB above, generate a tailored resume:
|
|
42
|
+
|
|
43
|
+
**Structure for ${format} format:**
|
|
44
|
+
${format === "standard" ? `1. Header (name, contact, LinkedIn)
|
|
45
|
+
2. Professional Summary (3-4 sentences, bridging background to this role)
|
|
46
|
+
3. Core Competencies (keyword-matched to posting)
|
|
47
|
+
4. Professional Experience (reverse chronological, achievement-focused)
|
|
48
|
+
5. ${includeProjects ? "Key Projects\n6. Education & Certifications" : "Education & Certifications"}` : ""}
|
|
49
|
+
${format === "federal" ? `1. Header with full contact info
|
|
50
|
+
2. Work Experience (detailed, with hours per week, supervisor info)
|
|
51
|
+
3. Education
|
|
52
|
+
4. Certifications & Training
|
|
53
|
+
5. Skills Matrix` : ""}
|
|
54
|
+
${format === "functional" ? `1. Header
|
|
55
|
+
2. Professional Summary
|
|
56
|
+
3. Core Competencies by theme
|
|
57
|
+
4. Career Highlights (top 6-8 achievements regardless of employer)
|
|
58
|
+
5. Employment History (condensed)
|
|
59
|
+
6. Education` : ""}
|
|
60
|
+
|
|
61
|
+
**Rules:**
|
|
62
|
+
- Match the posting's language exactly where truthful
|
|
63
|
+
- Lead each achievement with an action verb
|
|
64
|
+
- Quantify every achievement possible (%, $, time, scale)
|
|
65
|
+
- ATS-safe: no tables, columns, headers/footers, graphics
|
|
66
|
+
- Do not fabricate — only use data from the Career KB
|
|
67
|
+
- Flag "[VERIFY]" next to any claim that needs confirmation
|
|
68
|
+
- Industry-agnostic: use the posting's vocabulary, not my previous employer's
|
|
69
|
+
|
|
70
|
+
Output the full resume text, then a "Keyword Match Report" showing which posting requirements are covered and which aren't.`,
|
|
71
|
+
}],
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
server.registerTool("generate_cover_letter", {
|
|
75
|
+
title: "Generate Cover Letter",
|
|
76
|
+
description: "Write a compelling, personalized cover letter for a specific job posting using your Career KB.",
|
|
77
|
+
inputSchema: {
|
|
78
|
+
posting: z.string().describe("Full job posting text"),
|
|
79
|
+
company: z.string().describe("Company name"),
|
|
80
|
+
hiringManager: z.string().optional().describe("Hiring manager name if known"),
|
|
81
|
+
tone: z.enum(["professional", "conversational", "enthusiastic", "concise"]).default("professional"),
|
|
82
|
+
angle: z.string().optional().describe("The key story or angle to lead with"),
|
|
83
|
+
},
|
|
84
|
+
}, async ({ posting, company, hiringManager, tone, angle }) => {
|
|
85
|
+
const career = await loadCareerData();
|
|
86
|
+
if (!career) {
|
|
87
|
+
return {
|
|
88
|
+
content: [{ type: "text", text: "⚠️ No career data found." }],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
content: [{
|
|
93
|
+
type: "text",
|
|
94
|
+
text: `# Cover Letter Generation
|
|
95
|
+
|
|
96
|
+
## Career KB Summary
|
|
97
|
+
**Name:** ${career.profile.name}
|
|
98
|
+
**Summary:** ${career.profile.summary}
|
|
99
|
+
**Top achievements:**
|
|
100
|
+
${career.experience.flatMap(e => e.achievements.slice(0, 2).map(a => `- ${a.metric}: ${a.impact}`)).slice(0, 8).join("\n")}
|
|
101
|
+
|
|
102
|
+
## Job Posting
|
|
103
|
+
${posting}
|
|
104
|
+
|
|
105
|
+
## Parameters
|
|
106
|
+
- **Company:** ${company}
|
|
107
|
+
- **Hiring manager:** ${hiringManager ?? "Unknown (use 'Dear Hiring Team')"}
|
|
108
|
+
- **Tone:** ${tone}
|
|
109
|
+
${angle ? `- **Lead angle:** ${angle}` : ""}
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
**Instructions for Claude:**
|
|
114
|
+
Write a compelling cover letter. Structure:
|
|
115
|
+
|
|
116
|
+
**Opening (1 paragraph):** Hook with a specific achievement or observation about ${company} that connects to why I'm applying. Don't start with "I am writing to apply..."
|
|
117
|
+
|
|
118
|
+
**Body (2 paragraphs):**
|
|
119
|
+
- Para 1: My most relevant experience, told as a brief story with a specific outcome
|
|
120
|
+
- Para 2: Why ${company} specifically — what excites me about their mission, product, or stage
|
|
121
|
+
|
|
122
|
+
**Closing (1 paragraph):** Confident call to action. Specific, not generic.
|
|
123
|
+
|
|
124
|
+
**Tone notes for ${tone}:**
|
|
125
|
+
${tone === "professional" ? "Polished, measured, authoritative" : ""}
|
|
126
|
+
${tone === "conversational" ? "Warm, direct, human — write like you talk" : ""}
|
|
127
|
+
${tone === "enthusiastic" ? "High energy, genuine excitement, mission-driven" : ""}
|
|
128
|
+
${tone === "concise" ? "Every sentence earns its place. Max 250 words total." : ""}
|
|
129
|
+
|
|
130
|
+
Keep it under 400 words. Make it feel human, not templated.`,
|
|
131
|
+
}],
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
server.registerTool("format_for_ats", {
|
|
135
|
+
title: "Format for ATS",
|
|
136
|
+
description: "Format resume and application content for specific ATS systems: Workday, Greenhouse, Lever, LinkedIn, and others.",
|
|
137
|
+
inputSchema: {
|
|
138
|
+
resumeContent: z.string().describe("The resume text to format"),
|
|
139
|
+
targetSystem: z.enum(["workday", "greenhouse", "lever", "linkedin", "icims", "taleo", "smartrecruiters", "generic"]).describe("Target ATS system"),
|
|
140
|
+
postingUrl: z.string().optional().describe("Job posting URL for reference"),
|
|
141
|
+
},
|
|
142
|
+
}, async ({ resumeContent, targetSystem, postingUrl }) => {
|
|
143
|
+
const systemGuides = {
|
|
144
|
+
workday: `**Workday formatting rules:**
|
|
145
|
+
- Plain text for work history fields (no markdown)
|
|
146
|
+
- Each role entered separately via form fields: Job Title, Company, Start Date, End Date, Description
|
|
147
|
+
- Description field: bullet points separated by line breaks, max ~2000 chars per role
|
|
148
|
+
- Skills: enter each individually in the skills inventory
|
|
149
|
+
- Education: separate fields for Degree, Major, School, Year
|
|
150
|
+
- Keep each bullet under 150 characters for display
|
|
151
|
+
- Dates format: MM/YYYY`,
|
|
152
|
+
greenhouse: `**Greenhouse formatting rules:**
|
|
153
|
+
- Accepts PDF and DOCX — PDF preferred for layout preservation
|
|
154
|
+
- LinkedIn URL field is separate — don't include in resume body
|
|
155
|
+
- Cover letter is a separate rich text field
|
|
156
|
+
- Custom questions vary by company — read each carefully
|
|
157
|
+
- Work samples/portfolio links go in their designated field`,
|
|
158
|
+
lever: `**Lever formatting rules:**
|
|
159
|
+
- PDF strongly preferred
|
|
160
|
+
- One-page recommended for most roles
|
|
161
|
+
- Apply via email application or form
|
|
162
|
+
- Cover letter in the body text field — keep under 300 words
|
|
163
|
+
- Social links (GitHub, LinkedIn, portfolio) in dedicated fields`,
|
|
164
|
+
linkedin: `**LinkedIn Easy Apply formatting rules:**
|
|
165
|
+
- Resume PDF is attached — must be ATS-readable (no graphics)
|
|
166
|
+
- Additional questions are auto-populated from profile — ensure profile matches resume
|
|
167
|
+
- Character limits on text fields: ~2000 per experience entry
|
|
168
|
+
- Skills should match LinkedIn's taxonomy exactly
|
|
169
|
+
- Headline is pulled from your profile — update before applying`,
|
|
170
|
+
icims: `**iCIMS formatting rules:**
|
|
171
|
+
- Plain text preferred in form fields
|
|
172
|
+
- Work history entered field by field
|
|
173
|
+
- Date format: MM/DD/YYYY
|
|
174
|
+
- Can upload PDF/DOCX for resume attachment
|
|
175
|
+
- Cover letter is a rich text field`,
|
|
176
|
+
taleo: `**Taleo formatting rules:**
|
|
177
|
+
- Very finicky with PDF formatting — use plain DOCX
|
|
178
|
+
- Enter work history manually even with resume upload
|
|
179
|
+
- Dates: MM/YYYY
|
|
180
|
+
- Character limits are strict — keep bullets under 100 chars
|
|
181
|
+
- Multi-page forms — don't close the browser`,
|
|
182
|
+
smartrecruiters: `**SmartRecruiters formatting rules:**
|
|
183
|
+
- Accepts PDF and DOCX
|
|
184
|
+
- LinkedIn import available
|
|
185
|
+
- Clean single-column layout recommended
|
|
186
|
+
- Each section entered separately in profile`,
|
|
187
|
+
generic: `**Generic ATS formatting rules:**
|
|
188
|
+
- Plain text, single column
|
|
189
|
+
- Standard section headers (Experience, Education, Skills)
|
|
190
|
+
- Dates: Month YYYY – Month YYYY
|
|
191
|
+
- No tables, graphics, columns, headers/footers, text boxes
|
|
192
|
+
- Standard fonts only (Arial, Calibri, Times New Roman)`,
|
|
193
|
+
};
|
|
194
|
+
return {
|
|
195
|
+
content: [{
|
|
196
|
+
type: "text",
|
|
197
|
+
text: `# ATS Formatting: ${targetSystem.toUpperCase()}
|
|
198
|
+
|
|
199
|
+
${systemGuides[targetSystem]}
|
|
200
|
+
|
|
201
|
+
## Resume Content to Format
|
|
202
|
+
${resumeContent}
|
|
203
|
+
|
|
204
|
+
${postingUrl ? `**Posting reference:** ${postingUrl}` : ""}
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
**Instructions for Claude:**
|
|
209
|
+
Reformat the resume content above following the ${targetSystem} rules exactly. Produce:
|
|
210
|
+
|
|
211
|
+
1. **Formatted version** — ready to paste into ${targetSystem} fields
|
|
212
|
+
2. **Field-by-field breakdown** — if form-based, show exactly what goes in each field
|
|
213
|
+
3. **Character count warnings** — flag any sections that may exceed limits
|
|
214
|
+
4. **ATS keyword density** — top 10 keywords from the posting and whether they appear in the formatted output
|
|
215
|
+
5. **Copy-paste ready sections** — formatted so each section can be directly pasted
|
|
216
|
+
|
|
217
|
+
Flag any content that doesn't translate well to this system and suggest alternatives.`,
|
|
218
|
+
}],
|
|
219
|
+
};
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/tools/resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { ApplicationStatus } from "../schemas/career-schema.js";
|
|
2
|
+
export type PipelineAddArgs = {
|
|
3
|
+
action: "add";
|
|
4
|
+
company: string;
|
|
5
|
+
role: string;
|
|
6
|
+
postingUrl?: string;
|
|
7
|
+
postingText?: string;
|
|
8
|
+
source?: string;
|
|
9
|
+
referral?: string;
|
|
10
|
+
priority?: "high" | "medium" | "low";
|
|
11
|
+
excitement?: number;
|
|
12
|
+
salaryMin?: number;
|
|
13
|
+
salaryMax?: number;
|
|
14
|
+
};
|
|
15
|
+
export type PipelineUpdateArgs = {
|
|
16
|
+
action: "update";
|
|
17
|
+
id: string;
|
|
18
|
+
status?: ApplicationStatus;
|
|
19
|
+
notes?: string;
|
|
20
|
+
followUpDue?: string;
|
|
21
|
+
priority?: "high" | "medium" | "low";
|
|
22
|
+
contactName?: string;
|
|
23
|
+
contactTitle?: string;
|
|
24
|
+
contactEmail?: string;
|
|
25
|
+
interviewType?: "phone_screen" | "behavioral" | "technical" | "panel" | "final" | "offer_call" | "other";
|
|
26
|
+
interviewDate?: string;
|
|
27
|
+
};
|
|
28
|
+
export type PipelineGetArgs = {
|
|
29
|
+
action: "get";
|
|
30
|
+
id: string;
|
|
31
|
+
};
|
|
32
|
+
export type PipelineListArgs = {
|
|
33
|
+
action: "list";
|
|
34
|
+
filterStatus?: ApplicationStatus;
|
|
35
|
+
filterPriority?: "high" | "medium" | "low";
|
|
36
|
+
sortBy?: "date" | "status" | "priority" | "company" | "excitement";
|
|
37
|
+
limit?: number;
|
|
38
|
+
};
|
|
39
|
+
export type PipelineStatsArgs = {
|
|
40
|
+
action: "stats";
|
|
41
|
+
};
|
|
42
|
+
export type PipelineNextActionsArgs = {
|
|
43
|
+
action: "next_actions";
|
|
44
|
+
};
|
|
45
|
+
export type PipelineArgs = PipelineAddArgs | PipelineUpdateArgs | PipelineGetArgs | PipelineListArgs | PipelineStatsArgs | PipelineNextActionsArgs;
|
|
46
|
+
export type ToolResponse = {
|
|
47
|
+
content: Array<{
|
|
48
|
+
type: "text";
|
|
49
|
+
text: string;
|
|
50
|
+
}>;
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=tool-args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-args.d.ts","sourceRoot":"","sources":["../../../src/types/tool-args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIrE,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,QAAQ,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;IACzG,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AACpD,MAAM,MAAM,uBAAuB,GAAG;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC;AAEjE,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,kBAAkB,GAClB,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,uBAAuB,CAAC;AAI5B,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-args.js","sourceRoot":"","sources":["../../../src/types/tool-args.ts"],"names":[],"mappings":""}
|