resume-parser-ats 1.2.0 → 1.2.1
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/CONTRIBUTING.md +272 -0
- package/README.md +358 -156
- package/bin/cli.js +27 -0
- package/package.json +3 -2
- package/resume-parser-ats/SKILL.md +20 -5
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Contributing to Resume Parser
|
|
2
|
+
|
|
3
|
+
First off, thank you for considering contributing! 🎉
|
|
4
|
+
|
|
5
|
+
This project is a resume parsing agent skill, npm CLI tool, and MCP server. Contributions of all kinds are welcome: bug fixes, features, documentation improvements, test cases, and more.
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
- [Code of Conduct](#code-of-conduct)
|
|
10
|
+
- [Getting Started](#getting-started)
|
|
11
|
+
- [Development Setup](#development-setup)
|
|
12
|
+
- [Project Structure](#project-structure)
|
|
13
|
+
- [Making Changes](#making-changes)
|
|
14
|
+
- [Running Tests](#running-tests)
|
|
15
|
+
- [Code Style](#code-style)
|
|
16
|
+
- [Commit Messages](#commit-messages)
|
|
17
|
+
- [Pull Requests](#pull-requests)
|
|
18
|
+
- [Reporting Bugs](#reporting-bugs)
|
|
19
|
+
- [Feature Requests](#feature-requests)
|
|
20
|
+
|
|
21
|
+
## Code of Conduct
|
|
22
|
+
|
|
23
|
+
Be respectful, constructive, and inclusive. We're all here to make resume parsing better for everyone.
|
|
24
|
+
|
|
25
|
+
## Getting Started
|
|
26
|
+
|
|
27
|
+
1. **Fork** the repository on GitHub
|
|
28
|
+
2. **Clone** your fork locally:
|
|
29
|
+
```bash
|
|
30
|
+
git clone https://github.com/YOUR_USERNAME/resume-parser-skill.git
|
|
31
|
+
cd resume-parser-skill
|
|
32
|
+
```
|
|
33
|
+
3. **Install** dependencies:
|
|
34
|
+
```bash
|
|
35
|
+
npm install
|
|
36
|
+
```
|
|
37
|
+
4. **Build** the project:
|
|
38
|
+
```bash
|
|
39
|
+
npm run build
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Development Setup
|
|
43
|
+
|
|
44
|
+
### Prerequisites
|
|
45
|
+
|
|
46
|
+
- **Node.js** >= 18 (tested on 18, 20, 22)
|
|
47
|
+
- **npm** >= 9
|
|
48
|
+
|
|
49
|
+
### Key Commands
|
|
50
|
+
|
|
51
|
+
| Command | Description |
|
|
52
|
+
|---------|-------------|
|
|
53
|
+
| `npm install` | Install dependencies |
|
|
54
|
+
| `npm run build` | Compile TypeScript to `dist/` |
|
|
55
|
+
| `npm test` | Run all evaluation tests |
|
|
56
|
+
| `npm run lint` | Lint source files |
|
|
57
|
+
| `npm run dev` | Run index.ts directly with ts-node |
|
|
58
|
+
| `npm run mcp` | Start the MCP server locally |
|
|
59
|
+
|
|
60
|
+
### Verify Everything Works
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Build and test
|
|
64
|
+
npm run build && npm test
|
|
65
|
+
|
|
66
|
+
# Verify CLI
|
|
67
|
+
node bin/cli.js --help
|
|
68
|
+
|
|
69
|
+
# Quick parse test
|
|
70
|
+
node bin/cli.js parse "John Doe
|
|
71
|
+
john@example.com
|
|
72
|
+
(555) 123-4567
|
|
73
|
+
Software Engineer"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Project Structure
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
resume-parser-skill/
|
|
80
|
+
├── resume-parser-ats/ # Agent skill directory (npx skills add)
|
|
81
|
+
│ ├── SKILL.md # Skill manifest & agent instructions
|
|
82
|
+
│ └── references/
|
|
83
|
+
│ └── algorithm.md # Full 4-step algorithm spec
|
|
84
|
+
├── src/ # TypeScript source code
|
|
85
|
+
│ ├── index.ts # Main entry, exports, fullPipeline()
|
|
86
|
+
│ ├── tools/
|
|
87
|
+
│ │ ├── parse-resume.ts # Step 1-4 parsing engine
|
|
88
|
+
│ │ ├── analyze-resume.ts # ATS scoring & analysis
|
|
89
|
+
│ │ └── suggest-improvements.ts # Suggestion generator
|
|
90
|
+
│ └── prompts/
|
|
91
|
+
│ ├── parser-prompt.ts # Parsing prompt templates
|
|
92
|
+
│ └── insights-prompt.ts # Insights prompt templates
|
|
93
|
+
├── bin/
|
|
94
|
+
│ └── cli.js # CLI entry point (npx resume-parser-ats)
|
|
95
|
+
├── mcp-server/
|
|
96
|
+
│ └── server.ts # MCP server implementation
|
|
97
|
+
├── test/evals/ # Test suites
|
|
98
|
+
│ ├── parse-resume.test.mjs
|
|
99
|
+
│ ├── analyze-resume.test.mjs
|
|
100
|
+
│ └── suggest-improvements.test.mjs
|
|
101
|
+
├── AGENTS.md # Agent configuration (skills spec)
|
|
102
|
+
├── package.json
|
|
103
|
+
├── tsconfig.json
|
|
104
|
+
└── README.md
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Making Changes
|
|
108
|
+
|
|
109
|
+
### Branch Naming
|
|
110
|
+
|
|
111
|
+
Use descriptive branch names:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
feature/add-bullet-point-parsing
|
|
115
|
+
fix/education-date-extraction
|
|
116
|
+
docs/mcp-setup-guide
|
|
117
|
+
test/strict-mode-edge-cases
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Code Changes
|
|
121
|
+
|
|
122
|
+
1. **Create a branch** from `master`:
|
|
123
|
+
```bash
|
|
124
|
+
git checkout -b feature/your-feature
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
2. **Make your changes** — follow the existing code patterns
|
|
128
|
+
|
|
129
|
+
3. **Update tests** — add or modify tests in `test/evals/`
|
|
130
|
+
|
|
131
|
+
4. **Update documentation** — if you add a feature, update:
|
|
132
|
+
- `SKILL.md` if it affects agent-facing instructions
|
|
133
|
+
- `README.md` if it affects user-facing docs
|
|
134
|
+
- `references/algorithm.md` if it changes the parsing algorithm
|
|
135
|
+
|
|
136
|
+
5. **Verify** — build and test:
|
|
137
|
+
```bash
|
|
138
|
+
npm run build && npm test
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Important Files to Update
|
|
142
|
+
|
|
143
|
+
| If you change... | Also update |
|
|
144
|
+
|---|---|
|
|
145
|
+
| Parsing logic in `src/tools/parse-resume.ts` | `resume-parser-ats/references/algorithm.md` |
|
|
146
|
+
| Output format of any tool | `resume-parser-ats/SKILL.md` and `README.md` |
|
|
147
|
+
| CLI commands or flags | `bin/cli.js` help text and `README.md` |
|
|
148
|
+
| MCP tool definitions | `mcp-server/server.ts` and `README.md` |
|
|
149
|
+
| Scoring or grading | `resume-parser-ats/SKILL.md` scoring tables |
|
|
150
|
+
|
|
151
|
+
## Running Tests
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# Run all 86 tests
|
|
155
|
+
npm test
|
|
156
|
+
|
|
157
|
+
# Run specific test suite
|
|
158
|
+
node --test test/evals/parse-resume.test.mjs
|
|
159
|
+
node --test test/evals/analyze-resume.test.mjs
|
|
160
|
+
node --test test/evals/suggest-improvements.test.mjs
|
|
161
|
+
|
|
162
|
+
# Run a single test with verbose output
|
|
163
|
+
node --test test/evals/parse-resume.test.mjs --test-name-pattern "Step 1"
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Tests use Node.js built-in test runner (`node:test`) and assert module (`node:assert/strict`). No additional test framework needed.
|
|
167
|
+
|
|
168
|
+
### Writing New Tests
|
|
169
|
+
|
|
170
|
+
Add test cases in the appropriate file under `test/evals/`:
|
|
171
|
+
|
|
172
|
+
```javascript
|
|
173
|
+
import { describe, it } from "node:test";
|
|
174
|
+
import assert from "node:assert/strict";
|
|
175
|
+
import { parseResume } from "../../dist/src/tools/parse-resume.js";
|
|
176
|
+
|
|
177
|
+
describe("My New Feature", () => {
|
|
178
|
+
it("should handle the new case correctly", () => {
|
|
179
|
+
const result = parseResume({ rawText: "..." });
|
|
180
|
+
assert.equal(result.success, true);
|
|
181
|
+
assert.equal(result.data.profile.name, "Expected Name");
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Code Style
|
|
187
|
+
|
|
188
|
+
- **TypeScript** for all source code (`src/` and `mcp-server/`)
|
|
189
|
+
- **ES modules** with CommonJS compilation output
|
|
190
|
+
- **2-space indentation**
|
|
191
|
+
- Run `npm run lint` before committing — ESLint with TypeScript plugin
|
|
192
|
+
|
|
193
|
+
Key conventions:
|
|
194
|
+
- Use Zod for input validation schemas
|
|
195
|
+
- Always return `{ success: boolean, data: T, metadata: {...} }` format
|
|
196
|
+
- Include `warnings` array in metadata for non-fatal issues
|
|
197
|
+
- Feature scoring uses additive positive and negative scores
|
|
198
|
+
|
|
199
|
+
## Commit Messages
|
|
200
|
+
|
|
201
|
+
Follow [Conventional Commits](https://www.conventionalcommits.org/):
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
feat: add bullet-point parsing for experience sections
|
|
205
|
+
fix: handle edge case in date extraction for seasonal dates
|
|
206
|
+
docs: add MCP setup guide for Claude Desktop
|
|
207
|
+
test: add strict mode edge cases for phone parsing
|
|
208
|
+
refactor: simplify section grouping logic
|
|
209
|
+
chore: update dependencies
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Prefixes: `feat:`, `fix:`, `docs:`, `test:`, `refactor:`, `perf:`, `chore:`, `ci:`
|
|
213
|
+
|
|
214
|
+
## Pull Requests
|
|
215
|
+
|
|
216
|
+
1. **Push** your branch to your fork:
|
|
217
|
+
```bash
|
|
218
|
+
git push origin feature/your-feature
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
2. **Open a Pull Request** against the `master` branch
|
|
222
|
+
|
|
223
|
+
3. **Describe your changes** — what, why, and how to test
|
|
224
|
+
|
|
225
|
+
4. **Ensure CI passes** — all tests must pass across Node 18, 20, 22
|
|
226
|
+
|
|
227
|
+
5. **Respond to review feedback** promptly
|
|
228
|
+
|
|
229
|
+
### PR Checklist
|
|
230
|
+
|
|
231
|
+
- [ ] Code compiles (`npm run build` succeeds)
|
|
232
|
+
- [ ] All tests pass (`npm test`)
|
|
233
|
+
- [ ] Lint passes (`npm run lint`)
|
|
234
|
+
- [ ] New features have tests
|
|
235
|
+
- [ ] Documentation updated (SKILL.md, README.md, algorithm.md as needed)
|
|
236
|
+
- [ ] Commit messages follow conventional commits format
|
|
237
|
+
|
|
238
|
+
## Reporting Bugs
|
|
239
|
+
|
|
240
|
+
Open a [GitHub Issue](https://github.com/dhanushk-offl/resume-parser-skill/issues/new) with:
|
|
241
|
+
|
|
242
|
+
1. **What you did** — exact command or input
|
|
243
|
+
2. **What happened** — actual output or error
|
|
244
|
+
3. **What you expected** — desired output
|
|
245
|
+
4. **Environment** — Node.js version, OS, how you're using it (CLI, library, MCP, skill)
|
|
246
|
+
|
|
247
|
+
## Feature Requests
|
|
248
|
+
|
|
249
|
+
Open a [GitHub Issue](https://github.com/dhanushk-offl/resume-parser-skill/issues/new) with:
|
|
250
|
+
|
|
251
|
+
1. **Use case** — what problem does this solve?
|
|
252
|
+
2. **Proposed solution** — how should it work?
|
|
253
|
+
3. **Alternatives considered** — other approaches you thought of
|
|
254
|
+
4. **Which interface** — does this affect the skill, CLI, library, or MCP?
|
|
255
|
+
|
|
256
|
+
## Release Process
|
|
257
|
+
|
|
258
|
+
Maintainers only:
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
# Bump version
|
|
262
|
+
npm version patch # or minor, major
|
|
263
|
+
|
|
264
|
+
# Push with tags
|
|
265
|
+
git push --follow-tags
|
|
266
|
+
|
|
267
|
+
# CI automatically publishes to npm and creates a GitHub release
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
Thank you for contributing! 💛
|
package/README.md
CHANGED
|
@@ -1,177 +1,383 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
<strong>Deep resume parsing • ATS compatibility scoring • Actionable improvement insights</strong>
|
|
5
|
-
</p>
|
|
3
|
+
# 📄 Resume Parser
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
Made with ❤️ by <strong>Dhanush Kandhan</strong>
|
|
9
|
-
</p>
|
|
5
|
+
**Deep resume parsing • ATS compatibility scoring • Actionable improvement insights**
|
|
10
6
|
|
|
11
|
-
|
|
7
|
+
An agent skill, CLI tool, npm library, and MCP server that deeply parses resumes using the **OpenResume 4-step algorithm**, extracts structured information (Name, Email, Phone, Education, Work Experience, Skills, Projects), evaluates ATS compatibility, and provides prioritized, actionable suggestions.
|
|
8
|
+
|
|
9
|
+
Made with ❤️ by **Dhanush Kandhan**
|
|
10
|
+
|
|
11
|
+
[](https://www.npmjs.com/package/resume-parser-ats)
|
|
12
|
+
[](https://github.com/dhanushk-offl/resume-parser-skill/actions/workflows/ci.yml)
|
|
13
|
+
[](./LICENSE)
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
---
|
|
14
18
|
|
|
15
19
|
## ✨ Features
|
|
16
20
|
|
|
17
21
|
- **🔍 Deep Parsing** — Extracts 10+ fields from raw text or PDF using a feature-scoring engine
|
|
18
|
-
- **📊 ATS Scoring** — Grades your resume A+ through F with
|
|
22
|
+
- **📊 ATS Scoring** — Grades your resume A+ through F with per-field confidence ratings
|
|
19
23
|
- **💡 Smart Suggestions** — Prioritized, categorized fixes (critical → low) with before/after examples
|
|
20
|
-
- **🤖 Agent Skill** — Install via `npx skills add`
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
+
- **🤖 Agent Skill** — Install via `npx skills add` for pi, Claude Code, Codex, Gemini CLI, and more
|
|
25
|
+
- **🖥️ CLI** — Use directly from the command line
|
|
26
|
+
- **📡 MCP Server** — Plug into Claude Desktop, ChatGPT, and other MCP-compatible apps
|
|
27
|
+
- **📖 Library** — Import as an npm package for programmatic use
|
|
28
|
+
- **⚙️ Configurable** — Lenient, moderate, or strict ATS evaluation modes
|
|
29
|
+
- **🔒 Privacy-first** — Runs entirely locally, no external API calls
|
|
24
30
|
|
|
25
|
-
|
|
31
|
+
---
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
## 🚀 Quick Start
|
|
28
34
|
|
|
29
|
-
|
|
30
|
-
npx skills add dhanushk-offl/resume-parser-skill
|
|
31
|
-
```
|
|
35
|
+
Choose how you want to use Resume Parser:
|
|
32
36
|
|
|
33
|
-
|
|
37
|
+
| Method | Install | Best for |
|
|
38
|
+
|--------|---------|----------|
|
|
39
|
+
| **Agent Skill** | `npx skills add dhanushk-offl/resume-parser-skill` | AI agents (pi, Claude Code, Codex, Gemini CLI) |
|
|
40
|
+
| **CLI** | `npm install -g resume-parser-ats` | Quick one-off resume analysis |
|
|
41
|
+
| **Library** | `npm install resume-parser-ats` | Building apps, batch processing |
|
|
42
|
+
| **MCP Server** | `npm install resume-parser-ats` | Claude Desktop, ChatGPT, Cursor |
|
|
34
43
|
|
|
35
|
-
|
|
44
|
+
---
|
|
36
45
|
|
|
37
|
-
|
|
38
|
-
# Clone the repo
|
|
39
|
-
git clone https://github.com/dhanushk-offl/resume-parser-skill.git
|
|
40
|
-
cd resume-parser-skill
|
|
46
|
+
## 🤖 1. Agent Skill
|
|
41
47
|
|
|
42
|
-
|
|
43
|
-
npm install
|
|
48
|
+
Install as an agent skill for automatic activation in AI coding assistants:
|
|
44
49
|
|
|
45
|
-
|
|
46
|
-
|
|
50
|
+
```bash
|
|
51
|
+
npx skills add dhanushk-offl/resume-parser-skill
|
|
47
52
|
```
|
|
48
53
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
### As an Agent Skill
|
|
52
|
-
|
|
53
|
-
Once installed via `npx skills add`, the agent will automatically use this skill when you:
|
|
54
|
+
Once installed, the skill activates automatically when you:
|
|
54
55
|
|
|
55
56
|
- Ask to parse, review, or analyze a resume
|
|
56
57
|
- Ask "is my resume ATS-friendly?"
|
|
57
58
|
- Ask for resume improvement suggestions
|
|
58
59
|
- Upload or reference a resume PDF
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
**Works with:** pi, Claude Code, OpenAI Codex, Gemini CLI, Cursor, Continue, and all [Agent Skills](https://agentskills.io) compatible tools.
|
|
62
|
+
|
|
63
|
+
### What the Agent Gets
|
|
61
64
|
|
|
62
65
|
| Tool | Description |
|
|
63
66
|
|------|-------------|
|
|
64
|
-
| `parse_resume` | Parse a resume PDF
|
|
67
|
+
| `parse_resume` | Parse a resume PDF/text → structured data |
|
|
65
68
|
| `analyze_resume` | Parse + compute ATS compatibility score with per-field confidence |
|
|
66
69
|
| `suggest_improvements` | Parse + analyze + generate prioritized improvement suggestions |
|
|
67
70
|
|
|
68
|
-
###
|
|
71
|
+
### Example Agent Prompts
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
"Is my resume ATS-friendly? Here's the PDF path: ./my-resume.pdf"
|
|
75
|
+
"Parse this resume and extract the contact info"
|
|
76
|
+
"Analyze my resume for ATS compatibility with strict grading"
|
|
77
|
+
"What can I improve on my resume to get past ATS filters?"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 🖥️ 2. CLI
|
|
83
|
+
|
|
84
|
+
Install globally for command-line use:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm install -g resume-parser-ats
|
|
88
|
+
```
|
|
69
89
|
|
|
70
90
|
```bash
|
|
71
91
|
# Parse a resume and output structured data
|
|
72
|
-
|
|
92
|
+
resume-parser-ats parse resume.pdf
|
|
73
93
|
|
|
74
94
|
# Parse + analyze ATS compatibility
|
|
75
|
-
|
|
95
|
+
resume-parser-ats analyze resume.pdf
|
|
96
|
+
|
|
97
|
+
# Full pipeline: parse + analyze + suggestions
|
|
98
|
+
resume-parser-ats insights resume.pdf
|
|
76
99
|
|
|
77
|
-
#
|
|
78
|
-
|
|
100
|
+
# Parse from raw text
|
|
101
|
+
resume-parser-ats parse "John Doe\njohn@email.com\nSoftware Engineer"
|
|
102
|
+
|
|
103
|
+
# Adjust ATS strictness
|
|
104
|
+
resume-parser-ats analyze resume.pdf --strictness strict
|
|
105
|
+
|
|
106
|
+
# Focus on specific areas
|
|
107
|
+
resume-parser-ats insights resume.pdf --focus ats,formatting
|
|
108
|
+
|
|
109
|
+
# Output as JSON
|
|
110
|
+
resume-parser-ats insights resume.pdf --json
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Or use without installing:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
npx resume-parser-ats parse resume.pdf
|
|
79
117
|
```
|
|
80
118
|
|
|
81
|
-
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 📖 3. Library (npm Package)
|
|
122
|
+
|
|
123
|
+
Install as a dependency for programmatic use:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npm install resume-parser-ats
|
|
127
|
+
```
|
|
82
128
|
|
|
83
129
|
```typescript
|
|
84
130
|
import { parseResume, analyzeResume, suggestImprovements } from "resume-parser-ats";
|
|
85
131
|
|
|
86
|
-
//
|
|
87
|
-
const parsed = parseResume({
|
|
88
|
-
|
|
89
|
-
|
|
132
|
+
// Parse — extract structured data
|
|
133
|
+
const parsed = parseResume({ filePath: "./resume.pdf" });
|
|
134
|
+
// or: parseResume({ rawText: "John Doe\njohn@email.com\n..." })
|
|
135
|
+
|
|
136
|
+
console.log(parsed.data.profile.name); // "Jane Doe"
|
|
137
|
+
console.log(parsed.data.profile.email); // "jane@example.com"
|
|
90
138
|
console.log(parsed.data.education[0]?.school); // "MIT"
|
|
91
139
|
|
|
92
|
-
//
|
|
140
|
+
// Analyze — ATS compatibility scoring
|
|
93
141
|
const analysis = analyzeResume({
|
|
94
|
-
|
|
142
|
+
filePath: "./resume.pdf",
|
|
95
143
|
parsedResume: parsed.data,
|
|
96
|
-
strictness: "
|
|
144
|
+
strictness: "strict",
|
|
97
145
|
});
|
|
146
|
+
|
|
98
147
|
console.log(analysis.data.atsScore); // 72
|
|
99
148
|
console.log(analysis.data.atsGrade); // "B-"
|
|
149
|
+
console.log(analysis.data.fieldAnalyses);
|
|
150
|
+
console.log(analysis.data.formatIssues);
|
|
100
151
|
|
|
101
|
-
//
|
|
152
|
+
// Suggest — prioritized improvement recommendations
|
|
102
153
|
const suggestions = suggestImprovements({
|
|
103
|
-
|
|
154
|
+
filePath: "./resume.pdf",
|
|
104
155
|
parsedResume: parsed.data,
|
|
105
156
|
analysisResult: analysis.data,
|
|
106
|
-
focusAreas: ["ats", "content", "formatting"
|
|
157
|
+
focusAreas: ["ats", "content", "formatting"],
|
|
107
158
|
});
|
|
108
|
-
|
|
109
|
-
console.log(suggestions.data.
|
|
159
|
+
|
|
160
|
+
console.log(suggestions.data.quickWins);
|
|
161
|
+
console.log(suggestions.data.suggestions);
|
|
110
162
|
```
|
|
111
163
|
|
|
112
|
-
###
|
|
164
|
+
### Full Pipeline
|
|
113
165
|
|
|
114
|
-
```
|
|
115
|
-
|
|
166
|
+
```typescript
|
|
167
|
+
import { fullPipeline } from "resume-parser-ats";
|
|
168
|
+
|
|
169
|
+
const { parsed, analyzed, suggestions } = fullPipeline({
|
|
170
|
+
filePath: "./resume.pdf",
|
|
171
|
+
strictness: "moderate",
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
console.log(`ATS Score: ${analyzed.data.atsScore}/100 (${analyzed.data.atsGrade})`);
|
|
116
175
|
```
|
|
117
176
|
|
|
118
|
-
|
|
177
|
+
### TypeScript Types
|
|
119
178
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
179
|
+
All types are exported:
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
import type {
|
|
183
|
+
ParseResumeInput,
|
|
184
|
+
ParseResumeOutput,
|
|
185
|
+
AnalyzeResumeInput,
|
|
186
|
+
AnalyzeResumeOutput,
|
|
187
|
+
SuggestImprovementsInput,
|
|
188
|
+
SuggestImprovementsOutput,
|
|
189
|
+
ParsedResume,
|
|
190
|
+
TextItem,
|
|
191
|
+
LineItem,
|
|
192
|
+
SectionItem,
|
|
193
|
+
} from "resume-parser-ats";
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 📡 4. MCP Server
|
|
199
|
+
|
|
200
|
+
Use Resume Parser as a Model Context Protocol (MCP) server to give AI assistants direct access to the parsing tools.
|
|
201
|
+
|
|
202
|
+
### Claude Desktop
|
|
203
|
+
|
|
204
|
+
Add to your Claude Desktop config file:
|
|
205
|
+
|
|
206
|
+
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
207
|
+
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
208
|
+
|
|
209
|
+
```json
|
|
210
|
+
{
|
|
211
|
+
"mcpServers": {
|
|
212
|
+
"resume-parser": {
|
|
213
|
+
"command": "npx",
|
|
214
|
+
"args": ["-y", "resume-parser-ats", "--mcp"]
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Restart Claude Desktop. You can now ask Claude to parse and analyze resumes:
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
"Can you analyze my resume for ATS compatibility? The file is at ~/Documents/my-resume.pdf"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### ChatGPT / Codex (OpenAI)
|
|
227
|
+
|
|
228
|
+
Add to your OpenAI MCP configuration:
|
|
229
|
+
|
|
230
|
+
```json
|
|
231
|
+
{
|
|
232
|
+
"mcpServers": {
|
|
233
|
+
"resume-parser": {
|
|
234
|
+
"command": "npx",
|
|
235
|
+
"args": ["-y", "resume-parser-ats", "--mcp"]
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Cursor
|
|
242
|
+
|
|
243
|
+
Add to `~/.cursor/mcp.json`:
|
|
244
|
+
|
|
245
|
+
```json
|
|
246
|
+
{
|
|
247
|
+
"mcpServers": {
|
|
248
|
+
"resume-parser": {
|
|
249
|
+
"command": "npx",
|
|
250
|
+
"args": ["-y", "resume-parser-ats", "--mcp"]
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Other MCP-Compatible Apps
|
|
257
|
+
|
|
258
|
+
The server uses stdio transport. For any MCP-compatible application, configure:
|
|
259
|
+
|
|
260
|
+
```json
|
|
261
|
+
{
|
|
262
|
+
"mcpServers": {
|
|
263
|
+
"resume-parser": {
|
|
264
|
+
"command": "npx",
|
|
265
|
+
"args": ["-y", "resume-parser-ats", "--mcp"]
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
If you have `resume-parser-ats` installed globally:
|
|
272
|
+
|
|
273
|
+
```json
|
|
274
|
+
{
|
|
275
|
+
"mcpServers": {
|
|
276
|
+
"resume-parser": {
|
|
277
|
+
"command": "resume-parser-ats",
|
|
278
|
+
"args": ["--mcp"]
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### MCP Tools Available
|
|
285
|
+
|
|
286
|
+
| Tool | Description | Parameters |
|
|
287
|
+
|------|-------------|------------|
|
|
288
|
+
| `parse_resume` | Parse resume PDF/text → structured data | `filePath`, `rawText` |
|
|
289
|
+
| `analyze_resume` | Parse + ATS scoring | `filePath`, `rawText`, `strictness` |
|
|
290
|
+
| `suggest_improvements` | Parse + analyze + suggestions | `filePath`, `rawText`, `focusAreas` |
|
|
291
|
+
|
|
292
|
+
---
|
|
125
293
|
|
|
126
294
|
## 🧠 How It Works: The 4-Step Algorithm
|
|
127
295
|
|
|
128
|
-
The parser
|
|
296
|
+
The parser implements the **OpenResume algorithm**, the same methodology used by real ATS systems:
|
|
129
297
|
|
|
130
|
-
### Step 1 — Read Text Items
|
|
298
|
+
### Step 1 — Read Text Items from PDF
|
|
131
299
|
|
|
132
|
-
|
|
133
|
-
- Text content
|
|
134
|
-
- X/Y positions (relative to bottom-left origin)
|
|
135
|
-
- Bold metadata
|
|
136
|
-
- Newline markers
|
|
300
|
+
Extract every text item with position, bold, and newline metadata:
|
|
137
301
|
|
|
138
|
-
|
|
302
|
+
```typescript
|
|
303
|
+
{ text: "John Doe", x1: 72, x2: 144, y: 720, bold: true, newLine: true }
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Step 2 — Group Text Items into Lines
|
|
139
307
|
|
|
140
|
-
|
|
308
|
+
Merge adjacent items when their horizontal gap is less than average character width. Group by Y-coordinate to reconstruct the natural reading order.
|
|
141
309
|
|
|
142
|
-
### Step 3 — Group
|
|
310
|
+
### Step 3 — Group Lines into Sections
|
|
143
311
|
|
|
144
|
-
|
|
312
|
+
Detect section titles using two heuristics:
|
|
145
313
|
1. **Primary**: Only text item in line + bold + ALL UPPERCASE
|
|
146
|
-
2. **Fallback**: Keyword match
|
|
314
|
+
2. **Fallback**: Keyword match (EDUCATION, EXPERIENCE, SKILLS, etc.)
|
|
147
315
|
|
|
148
316
|
### Step 4 — Extract Attributes via Feature Scoring
|
|
149
317
|
|
|
150
|
-
Each attribute
|
|
318
|
+
Each attribute has feature sets with scoring functions. The text item with the **highest total score** wins:
|
|
319
|
+
|
|
320
|
+
| Attribute | Core Pattern | Example |
|
|
321
|
+
|-----------|-------------|---------|
|
|
322
|
+
| Name | Only letters/spaces/periods | `John Doe` |
|
|
323
|
+
| Email | Email format | `john@email.com` |
|
|
324
|
+
| Phone | `(xxx) xxx-xxxx` | `(555) 123-4567` |
|
|
325
|
+
| Location | `City, ST` | `New York, NY` |
|
|
326
|
+
| School | Contains "University" etc. | `MIT` |
|
|
327
|
+
| Degree | Contains "B.S.", "M.A." etc. | `B.S. Computer Science` |
|
|
328
|
+
|
|
329
|
+
**Name scoring example**: Only letters (+3), bolded (+2), uppercase (+2), has @ (-4), has digit (-4)
|
|
151
330
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
|
331
|
+
See [`resume-parser-ats/references/algorithm.md`](resume-parser-ats/references/algorithm.md) for the full specification.
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## 📊 ATS Compatibility Scoring
|
|
336
|
+
|
|
337
|
+
| Dimension | Weight | What it checks |
|
|
338
|
+
|-----------|--------|---------------|
|
|
339
|
+
| Name extraction | 20 pts | Can the parser identify a full name? |
|
|
340
|
+
| Email extraction | 20 pts | Is there a valid email address? |
|
|
341
|
+
| Phone extraction | 10 pts | Is there a parseable phone number? |
|
|
342
|
+
| Section detection | 15 pts | Are sections properly structured? |
|
|
343
|
+
| Education parsing | 10 pts | Are school, degree, and date parsed? |
|
|
344
|
+
| Experience parsing | 15 pts | Are company, title, and date parsed? |
|
|
345
|
+
| Skills parsing | 10 pts | Are skills extracted correctly? |
|
|
346
|
+
|
|
347
|
+
### Grading Scale
|
|
348
|
+
|
|
349
|
+
| Grade | Score | Meaning |
|
|
350
|
+
|-------|-------|---------|
|
|
351
|
+
| A+ | 90-100 | Excellent — ATS will parse everything correctly |
|
|
352
|
+
| A | 85-89 | Great — minor issues only |
|
|
353
|
+
| B+ | 80-84 | Good — most fields parse correctly |
|
|
354
|
+
| B | 75-79 | Adequate — some sections need improvement |
|
|
355
|
+
| B- | 70-74 | Below average — multiple parsing issues |
|
|
356
|
+
| C+ | 65-69 | Needs work — significant ATS problems |
|
|
357
|
+
| C | 60-64 | Poor — many fields fail to parse |
|
|
358
|
+
| D | 50-59 | Bad — critical fields missing |
|
|
359
|
+
| F | 0-49 | Failing — unrecognizable as a resume |
|
|
360
|
+
|
|
361
|
+
### Issue Severity Levels
|
|
362
|
+
|
|
363
|
+
- 🔴 **CRITICAL** — Name or email cannot be parsed (ATS will discard)
|
|
364
|
+
- 🟠 **HIGH** — Sections missing, dates unparseable, phone not found
|
|
365
|
+
- 🟡 **MEDIUM** — Skills not clean, formatting merge issues
|
|
366
|
+
- 🟢 **LOW** — Minor inconsistencies, optional fields missing
|
|
367
|
+
|
|
368
|
+
---
|
|
159
369
|
|
|
160
370
|
## 📊 Use Cases
|
|
161
371
|
|
|
162
|
-
###
|
|
372
|
+
### 🎯 Job Seeker — ATS Optimization
|
|
163
373
|
|
|
164
|
-
|
|
374
|
+
Before applying, see what an ATS actually extracts:
|
|
165
375
|
|
|
166
376
|
```bash
|
|
167
|
-
|
|
377
|
+
resume-parser-ats insights my-resume.pdf --strictness strict --json
|
|
168
378
|
```
|
|
169
379
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
### 2. 🏢 Recruiter — Bulk Resume Screening
|
|
173
|
-
|
|
174
|
-
> *Programmatically parse and score hundreds of resumes to rank candidates by ATS readability.*
|
|
380
|
+
### 🏢 Recruiter — Bulk Resume Screening
|
|
175
381
|
|
|
176
382
|
```typescript
|
|
177
383
|
import { parseResume, analyzeResume } from "resume-parser-ats";
|
|
@@ -180,110 +386,106 @@ import fs from "fs";
|
|
|
180
386
|
const files = fs.readdirSync("resumes/");
|
|
181
387
|
for (const file of files) {
|
|
182
388
|
const parsed = parseResume({ filePath: `resumes/${file}` });
|
|
183
|
-
const analysis = analyzeResume({
|
|
184
|
-
|
|
185
|
-
parsedResume: parsed.data,
|
|
186
|
-
strictness: "moderate",
|
|
187
|
-
});
|
|
188
|
-
console.log(`${file}: ATS Score ${analysis.data.atsScore}/100 (${analysis.data.atsGrade})`);
|
|
389
|
+
const analysis = analyzeResume({ parsedResume: parsed.data, strictness: "moderate" });
|
|
390
|
+
console.log(`${file}: ${analysis.data.atsScore}/100 (${analysis.data.atsGrade})`);
|
|
189
391
|
}
|
|
190
392
|
```
|
|
191
393
|
|
|
192
|
-
###
|
|
394
|
+
### 📈 Career Platform — Resume Health Dashboard
|
|
193
395
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
```typescript
|
|
197
|
-
import { fullPipeline } from "resume-parser-ats";
|
|
198
|
-
|
|
199
|
-
const result = fullPipeline({ rawText: resumeText, strictness: "strict" });
|
|
200
|
-
|
|
201
|
-
// Feed to an LLM for natural-language coaching
|
|
202
|
-
const prompt = `You are a resume coach. Here is the analysis:
|
|
203
|
-
${JSON.stringify(result.analyzed.data)}
|
|
204
|
-
Suggest improvements in a friendly, encouraging tone.`;
|
|
205
|
-
```
|
|
396
|
+
Parse on upload → store ATS score → visualize → suggest improvements → track progress.
|
|
206
397
|
|
|
207
|
-
###
|
|
398
|
+
### 🎓 University Career Center — Student Reviews
|
|
208
399
|
|
|
209
|
-
|
|
400
|
+
Batch-parse resumes, flag common issues, generate improvement templates.
|
|
210
401
|
|
|
211
|
-
|
|
212
|
-
- Display a visual dashboard with color-coded field ratings
|
|
213
|
-
- Surface `quickWins` as a checklist
|
|
214
|
-
- Track score improvements over time as users update their resumes
|
|
215
|
-
|
|
216
|
-
### 5. 🎓 University Career Center — Student Resume Reviews
|
|
217
|
-
|
|
218
|
-
> *Automate initial resume screening for career centers at scale.*
|
|
219
|
-
|
|
220
|
-
- Batch-parse student resumes and generate summary reports
|
|
221
|
-
- Flag common issues (missing dates, non-standard section headers)
|
|
222
|
-
- Provide standardized improvement templates
|
|
402
|
+
---
|
|
223
403
|
|
|
224
404
|
## 🏗️ Architecture
|
|
225
405
|
|
|
226
406
|
```
|
|
227
407
|
resume-parser-skill/
|
|
228
|
-
├── resume-parser-ats/ # Agent skill
|
|
408
|
+
├── resume-parser-ats/ # Agent skill (npx skills add)
|
|
229
409
|
│ ├── SKILL.md # Skill manifest & instructions
|
|
230
|
-
│
|
|
231
|
-
│ │ ├── parse.mjs # Parse a resume → JSON
|
|
232
|
-
│ │ ├── analyze.mjs # Parse + ATS scoring → JSON
|
|
233
|
-
│ │ └── insights.mjs # Full pipeline → JSON
|
|
234
|
-
│ └── references/ # Detailed docs loaded on-demand
|
|
410
|
+
│ └── references/
|
|
235
411
|
│ └── algorithm.md # Full algorithm specification
|
|
236
412
|
├── src/ # TypeScript source
|
|
237
|
-
│ ├── index.ts #
|
|
413
|
+
│ ├── index.ts # Exports + fullPipeline()
|
|
238
414
|
│ ├── tools/
|
|
239
|
-
│ │ ├── parse-resume.ts
|
|
240
|
-
│ │ ├── analyze-resume.ts
|
|
241
|
-
│ │ └── suggest-improvements.ts
|
|
415
|
+
│ │ ├── parse-resume.ts # Step 1-4 parsing engine
|
|
416
|
+
│ │ ├── analyze-resume.ts # ATS scoring & analysis
|
|
417
|
+
│ │ └── suggest-improvements.ts # Suggestion generator
|
|
242
418
|
│ └── prompts/
|
|
243
|
-
│ ├── parser-prompt.ts
|
|
244
|
-
│ └── insights-prompt.ts
|
|
419
|
+
│ ├── parser-prompt.ts # Parsing prompt templates
|
|
420
|
+
│ └── insights-prompt.ts # Insights prompt templates
|
|
245
421
|
├── bin/
|
|
246
|
-
│ └── cli.js
|
|
422
|
+
│ └── cli.js # CLI entry point
|
|
247
423
|
├── mcp-server/
|
|
248
|
-
│ └── server.ts
|
|
249
|
-
├── test/
|
|
250
|
-
|
|
251
|
-
├──
|
|
424
|
+
│ └── server.ts # MCP server implementation
|
|
425
|
+
├── test/evals/ # Test suites (86 tests)
|
|
426
|
+
├── AGENTS.md # Agent configuration
|
|
427
|
+
├── CONTRIBUTING.md # Contributing guide
|
|
252
428
|
├── package.json
|
|
253
|
-
└──
|
|
429
|
+
└── tsconfig.json
|
|
254
430
|
```
|
|
255
431
|
|
|
432
|
+
---
|
|
433
|
+
|
|
256
434
|
## 🧪 Testing
|
|
257
435
|
|
|
258
436
|
```bash
|
|
259
|
-
# Run all tests
|
|
437
|
+
# Run all 86 tests
|
|
260
438
|
npm test
|
|
261
|
-
```
|
|
262
439
|
|
|
263
|
-
|
|
440
|
+
# Run a specific suite
|
|
441
|
+
node --test test/evals/parse-resume.test.mjs
|
|
442
|
+
node --test test/evals/analyze-resume.test.mjs
|
|
443
|
+
node --test test/evals/suggest-improvements.test.mjs
|
|
264
444
|
|
|
265
|
-
|
|
445
|
+
# Filter by test name
|
|
446
|
+
node --test test/evals/parse-resume.test.mjs --test-name-pattern "Step 1"
|
|
447
|
+
```
|
|
266
448
|
|
|
267
|
-
|
|
268
|
-
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
269
|
-
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
270
|
-
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
271
|
-
5. Open a Pull Request
|
|
449
|
+
---
|
|
272
450
|
|
|
273
451
|
## ☁️ CI/CD
|
|
274
452
|
|
|
275
453
|
| Workflow | Trigger | What it does |
|
|
276
454
|
|----------|---------|-------------|
|
|
277
|
-
| **Build & Test** | Push/PR to `master` | Lint, build, and test across Node 18
|
|
455
|
+
| **Build & Test** | Push/PR to `master` | Lint, build, and test across Node 18, 20, 22 |
|
|
278
456
|
| **Publish to npm** | Tag push `v*` | Builds and publishes to npmjs with provenance |
|
|
279
457
|
|
|
458
|
+
To publish a new version:
|
|
459
|
+
|
|
460
|
+
```bash
|
|
461
|
+
npm version patch # or minor, major
|
|
462
|
+
git push --follow-tags
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
---
|
|
466
|
+
|
|
467
|
+
## 🤝 Contributing
|
|
468
|
+
|
|
469
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for:
|
|
470
|
+
|
|
471
|
+
- Development setup
|
|
472
|
+
- Project structure guide
|
|
473
|
+
- Code style and testing conventions
|
|
474
|
+
- Commit message format
|
|
475
|
+
- Pull request checklist
|
|
476
|
+
|
|
477
|
+
---
|
|
478
|
+
|
|
280
479
|
## 📄 License
|
|
281
480
|
|
|
282
481
|
MIT License — Copyright (c) 2025 **Dhanush Kandhan**. See [LICENSE](./LICENSE) for details.
|
|
283
482
|
|
|
284
483
|
---
|
|
285
484
|
|
|
286
|
-
<
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
485
|
+
<div align="center">
|
|
486
|
+
|
|
487
|
+
Made with ❤️ by **Dhanush Kandhan**
|
|
488
|
+
|
|
489
|
+
If this project helped you, consider giving it a ⭐ on [GitHub](https://github.com/dhanushk-offl/resume-parser-skill)!
|
|
490
|
+
|
|
491
|
+
</div>
|
package/bin/cli.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* resume-parser-ats parse <file|text> Parse a resume and output structured data
|
|
8
8
|
* resume-parser-ats analyze <file|text> Parse + analyze ATS compatibility
|
|
9
9
|
* resume-parser-ats insights <file|text> Full pipeline: parse + analyze + suggestions
|
|
10
|
+
* resume-parser-ats --mcp Start MCP server for Claude/ChatGPT/Cursor
|
|
10
11
|
*/
|
|
11
12
|
|
|
12
13
|
const path = require("path");
|
|
@@ -35,6 +36,7 @@ Options:
|
|
|
35
36
|
--strictness <level> ATS strictness: lenient, moderate, strict (default: moderate)
|
|
36
37
|
--focus <areas> Focus areas: ats,content,formatting,structure (default: all)
|
|
37
38
|
--json Output raw JSON instead of formatted report
|
|
39
|
+
--mcp Start MCP server (for Claude Desktop, ChatGPT, Cursor, etc.)
|
|
38
40
|
--help Show this help message
|
|
39
41
|
|
|
40
42
|
Examples:
|
|
@@ -42,12 +44,37 @@ Examples:
|
|
|
42
44
|
resume-parser-ats analyze resume.pdf --strictness strict
|
|
43
45
|
resume-parser-ats insights resume.pdf --focus ats,formatting --json
|
|
44
46
|
resume-parser-ats parse "John Doe\\njohn@email.com\\nSoftware Engineer"
|
|
47
|
+
|
|
48
|
+
MCP Server:
|
|
49
|
+
resume-parser-ats --mcp
|
|
50
|
+
|
|
51
|
+
Add to Claude Desktop config:
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"resume-parser": {
|
|
55
|
+
"command": "npx",
|
|
56
|
+
"args": ["-y", "resume-parser-ats", "--mcp"]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
45
60
|
`);
|
|
46
61
|
}
|
|
47
62
|
|
|
48
63
|
function main() {
|
|
49
64
|
const args = process.argv.slice(2);
|
|
50
65
|
|
|
66
|
+
// Handle --mcp flag: start MCP server
|
|
67
|
+
if (args.includes("--mcp")) {
|
|
68
|
+
try {
|
|
69
|
+
require("../dist/mcp-server/server.js");
|
|
70
|
+
} catch (err) {
|
|
71
|
+
console.error("Error: MCP server not built. Run `npm run build` first.");
|
|
72
|
+
console.error(err.message);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
51
78
|
if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
|
|
52
79
|
printUsage();
|
|
53
80
|
process.exit(0);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "resume-parser-ats",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "An agent skill that deeply parses resumes, extracts structured data, and provides actionable insights to improve ATS compatibility and readability.",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"bin/",
|
|
21
21
|
"resume-parser-ats/",
|
|
22
22
|
"README.md",
|
|
23
|
-
"LICENSE"
|
|
23
|
+
"LICENSE",
|
|
24
|
+
"CONTRIBUTING.md"
|
|
24
25
|
],
|
|
25
26
|
"keywords": [
|
|
26
27
|
"resume",
|
|
@@ -193,11 +193,26 @@ Always provide results in this structured format:
|
|
|
193
193
|
|
|
194
194
|
## Programmatic Access
|
|
195
195
|
|
|
196
|
-
|
|
196
|
+
### As an npm Library
|
|
197
197
|
|
|
198
198
|
```bash
|
|
199
199
|
npm install resume-parser-ats
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
import { parseResume, analyzeResume, suggestImprovements } from "resume-parser-ats";
|
|
204
|
+
|
|
205
|
+
const result = parseResume({ filePath: "resume.pdf" });
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### As an MCP Server
|
|
209
|
+
|
|
210
|
+
Start the MCP server for use with Claude Desktop, ChatGPT, Cursor, and other MCP-compatible apps:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
resume-parser-ats --mcp
|
|
214
|
+
# or
|
|
215
|
+
npx resume-parser-ats --mcp
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
See README for full MCP configuration instructions.
|