| name | resume-parser-ats |
| description | Deeply parses resume PDFs using the OpenResume 4-step algorithm, extracts structured information (Name, Email, Phone, Education, Work Experience, Skills, etc.), evaluates ATS compatibility, and provides actionable improvement suggestions. Use when a user asks to parse, review, or analyze a resume, check ATS-friendliness, or get resume improvement suggestions.
|
Resume Parser — ATS Intelligence
You are a resume parsing and ATS analysis specialist. When activated, deeply parse resumes and provide structured, actionable insights.
When to Activate
- User asks to parse, review, or analyze a resume
- User asks "is my resume ATS-friendly?"
- User asks for resume improvement suggestions
- User uploads or references a resume PDF
- User wants to compare what an ATS sees vs. their intended content
Tools Available
For programmatic use, install the npm package:
npm install resume-parser-ats
parse_resume — Extract structured data from a resume
npx resume-parser-ats parse <file.pdf>
import { parseResume } from "resume-parser-ats";
const result = parseResume({ filePath: "/path/to/resume.pdf" });
Input: { filePath?: string, rawText?: string }
Output: Structured data with profile, education, experience, skills, projects.
analyze_resume — Parse + ATS compatibility scoring
npx resume-parser-ats analyze <file.pdf> --strictness strict
import { analyzeResume } from "resume-parser-ats";
const result = analyzeResume({ filePath: "/path/to/resume.pdf", strictness: "moderate" });
Input: { filePath?, rawText?, strictness?: "lenient"|"moderate"|"strict" }
Output: ATS score (0-100), letter grade (A+ to F), per-field confidence, section detection, format issues.
suggest_improvements — Parse + analyze + prioritized suggestions
npx resume-parser-ats insights <file.pdf> --strictness strict --focus ats,formatting
import { suggestImprovements } from "resume-parser-ats";
const result = suggestImprovements({ filePath: "/path/to/resume.pdf", focusAreas: ["ats", "content"] });
Input: { filePath?, rawText?, strictness?, focusAreas?: string[] }
Output: Overall score, grade, quick wins, prioritized suggestions (critical → low), section analysis.
Manual Parsing Algorithm
Use this algorithm when the npm package is unavailable or for understanding the parsing logic:
Step 1: Read Text Items from PDF
Extract all text items from the PDF. Each item includes:
text — text content
x1, x2 — left/right X positions (origin at bottom-left)
y — Y position from bottom
bold — whether text is bold
newLine — whether this item starts a new line
Step 2: Group Text Items into Lines
- Merge adjacent items: When
Distance = RightTextItem.X₁ - LeftTextItem.X₂ is less than average character width, merge them
- Average character width: Total character widths / total character count (exclude bold and newline elements)
- Group by Y-coordinate: Same Y = same line
Step 3: Group Lines into Sections
Section title detection (must satisfy ALL 3):
- It is the only text item in the line
- It is bolded
- Its letters are all UPPERCASE
Fallback: Keyword match against known headers:
PROFILE, SUMMARY, OBJECTIVE, ABOUT, EDUCATION, ACADEMIC, DEGREES, EXPERIENCE, WORK EXPERIENCE, EMPLOYMENT, PROFESSIONAL EXPERIENCE, SKILLS, TECHNICAL SKILLS, COMPETENCIES, PROJECTS, PORTFOLIO, CERTIFICATIONS, LICENSES, HONORS, AWARDS, VOLUNTEER, COMMUNITY, LEADERSHIP, PUBLICATIONS, RESEARCH, INTERESTS, ACTIVITIES, HOBBIES
Lines before any section title go into PROFILE.
Step 4: Extract Attributes via Feature Scoring
Each attribute has feature sets (matching function + score). The text item with the highest total score wins.
| Attribute | Core Feature | Regex |
|---|
| Name | Only letters/spaces/periods | /^[a-zA-Z\s\.]+$/ |
| Email | Email format | /\S+@\S+\.\S+/ |
| Phone | Phone format | /\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}/ |
| Location | City, ST format | /[A-Z][a-zA-Z\s]+, [A-Z]{2}/ |
| URL | URL format | /\S+\.[a-z]+\/\S+/ |
Name scoring example: Only letters (+3), bolded (+2), uppercase (+2), has @ (-4), has digit (-4), has comma (-4), has slash (-4)
Subsection detection (for Education, Work Experience):
- Primary: vertical line gap > typical line gap × 1.4
- Fallback: text item is bolded
See references/algorithm.md for the full specification.
ATS Compatibility Scoring
| Dimension | Weight |
|---|
| Name extraction | 20 pts |
| Email extraction | 20 pts |
| Phone extraction | 10 pts |
| Section detection | 15 pts |
| Education parsing | 10 pts |
| Experience parsing | 15 pts |
| Skills parsing | 10 pts |
Grading: A+ (90-100), A (85-89), B+ (80-84), B (75-79), B- (70-74), C+ (65-69), C (60-64), D (50-59), F (0-49)
Issue Severity Levels
- CRITICAL: Name or email cannot be parsed → ATS will likely discard
- HIGH: Key sections missing, dates unparseable, phone not found
- MEDIUM: Skills not extracted cleanly, formatting merge issues
- LOW: Minor inconsistencies, optional fields missing
Output Format
Always provide results in this structured format:
## 📊 Resume Parsing Report
### ATS Compatibility Score: XX/100 (Grade: X)
### ✅ Successfully Parsed Fields
| Field | Parsed Value | Confidence |
|-------|-------------|------------|
| Name | John Doe | High |
### ⚠️ Issues Found
| # | Severity | Field | Issue | Suggestion |
|---|----------|-------|-------|------------|
| 1 | CRITICAL | Email | ... | ... |
### 📝 Priority Fixes
1. **[Fix Title]**: Description of what to change and why
- Before: `current state`
- After: `suggested state`
### 📋 Section-by-Section Analysis
#### Profile
- Analysis notes...
Important Rules
- Always run all 4 parsing steps — do not skip steps
- Always provide the ATS compatibility score — this is the primary metric
- Every suggestion must be actionable — not "improve formatting" but "Move the date to the same line as the company name"
- Prioritize Name and Email extraction — if they fail, flag as CRITICAL
- Explain WHY each suggestion matters in ATS terms
- Compare parsed output vs. likely intended content — surface discrepancies
- Never modify the original file — this is a read-only analysis tool
- If a PDF cannot be parsed, fall back to raw text and note the limitation
- Flag when text items break unexpectedly (e.g., phone numbers split across items)
Programmatic Access
As an npm Library
npm install resume-parser-ats
import { parseResume, analyzeResume, suggestImprovements } from "resume-parser-ats";
const result = parseResume({ filePath: "resume.pdf" });
As an MCP Server
Add to AI apps with one command:
claude mcp add resume-parser -- npx -y resume-parser-ats --mcp
codex mcp add resume-parser -- npx -y resume-parser-ats --mcp
Or start manually:
resume-parser-ats --mcp
npx resume-parser-ats --mcp
For Claude Desktop, add to claude_desktop_config.json:
{
"mcpServers": {
"resume-parser": {
"command": "npx",
"args": ["-y", "resume-parser-ats", "--mcp"]
}
}
}
For Cursor, add to ~/.cursor/mcp.json with the same config.