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.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +340 -0
  3. package/build/bin/cli.d.ts +9 -0
  4. package/build/bin/cli.d.ts.map +1 -0
  5. package/build/bin/cli.js +134 -0
  6. package/build/bin/cli.js.map +1 -0
  7. package/build/src/index.d.ts +3 -0
  8. package/build/src/index.d.ts.map +1 -0
  9. package/build/src/index.js +18 -0
  10. package/build/src/index.js.map +1 -0
  11. package/build/src/prompts/index.d.ts +3 -0
  12. package/build/src/prompts/index.d.ts.map +1 -0
  13. package/build/src/prompts/index.js +122 -0
  14. package/build/src/prompts/index.js.map +1 -0
  15. package/build/src/resources/career-kb.d.ts +3 -0
  16. package/build/src/resources/career-kb.d.ts.map +1 -0
  17. package/build/src/resources/career-kb.js +143 -0
  18. package/build/src/resources/career-kb.js.map +1 -0
  19. package/build/src/schemas/career-schema.d.ts +361 -0
  20. package/build/src/schemas/career-schema.d.ts.map +1 -0
  21. package/build/src/schemas/career-schema.js +146 -0
  22. package/build/src/schemas/career-schema.js.map +1 -0
  23. package/build/src/server.d.ts +3 -0
  24. package/build/src/server.d.ts.map +1 -0
  25. package/build/src/server.js +30 -0
  26. package/build/src/server.js.map +1 -0
  27. package/build/src/storage/file-store.d.ts +22 -0
  28. package/build/src/storage/file-store.d.ts.map +1 -0
  29. package/build/src/storage/file-store.js +163 -0
  30. package/build/src/storage/file-store.js.map +1 -0
  31. package/build/src/tools/career-kb.d.ts +3 -0
  32. package/build/src/tools/career-kb.d.ts.map +1 -0
  33. package/build/src/tools/career-kb.js +148 -0
  34. package/build/src/tools/career-kb.js.map +1 -0
  35. package/build/src/tools/interview.d.ts +3 -0
  36. package/build/src/tools/interview.d.ts.map +1 -0
  37. package/build/src/tools/interview.js +194 -0
  38. package/build/src/tools/interview.js.map +1 -0
  39. package/build/src/tools/opportunity.d.ts +3 -0
  40. package/build/src/tools/opportunity.d.ts.map +1 -0
  41. package/build/src/tools/opportunity.js +137 -0
  42. package/build/src/tools/opportunity.js.map +1 -0
  43. package/build/src/tools/pipeline.d.ts +11 -0
  44. package/build/src/tools/pipeline.d.ts.map +1 -0
  45. package/build/src/tools/pipeline.js +295 -0
  46. package/build/src/tools/pipeline.js.map +1 -0
  47. package/build/src/tools/resume.d.ts +3 -0
  48. package/build/src/tools/resume.d.ts.map +1 -0
  49. package/build/src/tools/resume.js +222 -0
  50. package/build/src/tools/resume.js.map +1 -0
  51. package/build/src/types/tool-args.d.ts +52 -0
  52. package/build/src/types/tool-args.d.ts.map +1 -0
  53. package/build/src/types/tool-args.js +2 -0
  54. package/build/src/types/tool-args.js.map +1 -0
  55. package/data/example/career/experience.yaml +67 -0
  56. package/data/example/career/profile.yaml +31 -0
  57. package/data/example/career/skills.yaml +71 -0
  58. package/data/example/career/testimonials.yaml +26 -0
  59. package/data/example/pipeline/applications.yaml +312 -0
  60. 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,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerResumeTools(server: McpServer): void;
3
+ //# sourceMappingURL=resume.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-args.js","sourceRoot":"","sources":["../../../src/types/tool-args.ts"],"names":[],"mappings":""}