Skip to main content
Glama
README.md
# resume-mcp

MCP server for maintaining a professional profile database and generating tailored, ATS-optimized resumes for specific job postings.

## Features

- **Profile database** — SQLite store for contact info, education, work experience, projects, and skills with proficiency ratings
- **Job scraping** — fetch and parse job postings from URLs; extract tech stack, experience level, requirements, and salary automatically
- **Tailored resume generation** — scores every experience and project against the job, selects the most relevant ones, and produces a clean LaTeX resume
- **Relevance scoring** — deterministic match score based on tech overlap, keyword coverage, and description similarity
- **ATS/keyword analysis** — identifies keyword gaps, naming mismatches (`React` vs `React.js`), weak action verbs, bullets lacking metrics, and unused profile items that could strengthen the resume
- **No extra API keys** — all analysis is pure Python (regex + keyword matching). The calling LLM (Claude, GPT, etc.) does the creative rewriting using its own subscription
- **Application tracker** — auto-logs every generated resume to a formatted `applications.xlsx` spreadsheet with color-coded scores and status tracking

## How tailoring works

Each experience and project is scored 0–1 against the job posting:

| Signal | Weight |
|---|---|
| Tech stack tag overlap | 40% |
| Keyword match against requirements | 35% |
| Description keyword match | 25% |

Items are ranked by score, the top 4 experiences and top 4 projects are selected, and skills matching the JD are reordered to appear first.

## Review pipeline

1. **`full_pipeline(url)`** — scrapes job → generates initial resume → runs deterministic analysis in one call
2. The analysis returns: keyword gaps, ATS issues (exact phrasing mismatches), weak verb flags, bullets missing metrics, and unused profile items from the DB
3. The calling LLM acts as a hiring manager and rewrites bullets, weaves in missing keywords, reorders sections
4. **`save_optimized_resume(...)`** — saves the LLM-rewritten LaTeX back to the DB and compiles to PDF

No API keys are consumed in step 2. The LLM you're already talking to does the creative work.

## Setup

```bash
cd ~/resume-mcp
pip install -r requirements.txt

# seed_profile.py is a template — open it and replace the placeholder data
# with your own info, then run it to populate the database:
python seed_profile.py
```

**Tip:** To keep your personal data out of git, copy the template to a private file:

```bash
cp seed_profile.py seed_yourname.py
echo "seed_yourname.py" >> .gitignore
python seed_yourname.py
```

**Optional:** Install `pdflatex` to compile resumes to PDF locally. Without it, `.tex` files are saved and can be compiled via [Overleaf](https://overleaf.com).

### Claude Desktop config

Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "resume-builder": {
      "command": "python3",
      "args": ["/Users/your-username/resume-mcp/server.py"]
    }
  }
}
```

## Data storage

| Path | Contents |
|---|---|
| `~/.resume-mcp/profile.db` | SQLite profile database |
| `~/.resume-mcp/generated/` | Generated `.tex` and `.pdf` files |
| `~/.resume-mcp/applications.xlsx` | Application tracker spreadsheet |

## MCP tools

### Profile

| Tool | Description |
|---|---|
| `get_profile` | Return full profile (contact, education, experience, projects, skills) |
| `set_contact_info` | Set name, email, phone, LinkedIn, GitHub, website, location |
| `add_experience` | Add a work experience entry with bullet points and tech tags |
| `update_experience` | Update fields on an existing experience by ID |
| `delete_experience` | Remove an experience by ID |
| `add_project` | Add a project with tech stack, bullets, URL, and status |
| `update_project` | Update fields on an existing project by ID |
| `delete_project` | Remove a project by ID |
| `add_education` | Add an education entry with GPA, coursework, honors |
| `add_skill` | Add or update a skill with category and proficiency (1–5) |
| `remove_skill` | Remove a skill |
| `bulk_add_skills` | Add multiple skills at once via `{"Category": ["Skill1", "Skill2"]}` |

### Job scraping

| Tool | Description |
|---|---|
| `scrape_job_posting` | Fetch a job posting URL and extract structured data |
| `analyze_job_from_text` | Parse a job from pasted text when URL scraping fails |

### Resume generation

| Tool | Description |
|---|---|
| `generate_resume` | Generate a tailored resume given job details |
| `scrape_and_generate` | One-shot: scrape URL and immediately generate resume |
| `match_score` | Check profile-to-job match without generating a resume |
| `get_resume_latex` | Retrieve full LaTeX source of a previously generated resume |
| `list_generated_resumes` | List recent resumes with job details and match scores |

### Review & optimization

| Tool | Description |
|---|---|
| `full_pipeline` | Scrape → generate → analyze in one call; returns everything the LLM needs to rewrite |
| `review_resume_against_job` | Run deterministic analysis on a resume by ID or raw LaTeX |
| `get_resume_with_context` | Get resume LaTeX + job info + full profile in one call for rewriting |
| `save_optimized_resume` | Save LLM-rewritten LaTeX back to DB and compile to PDF |

### Application tracker

| Tool | Description |
|---|---|
| `log_application` | Manually log an application to the spreadsheet |
| `update_application_status` | Update status (Generated → Applied → Interview → Offer/Rejected) |
| `get_application_stats` | Summary stats: total, by-status breakdown, average scores |

## Usage examples

These are natural language commands you'd send to Claude with the MCP server connected:

```
Generate a resume for this job posting: [paste URL]

Scrape this job and run the full pipeline so you can optimize my resume: [URL]

Add a new experience: I worked at Acme Corp as a backend engineer from Jan 2024 to present.
Bullets: [...]

What's my match score for a job that requires React, TypeScript, and AWS experience?

Update my application status for row 3 to "Interview"

Show me my application stats
```

Maintenance

ActivityInactive
ResponsivenessNo issues