Skip to main content
Glama
nishtobehonest

Resume Tailor MCP Server

README.md
# Resume Tailor — MCP Server

An MCP server that tailors your LaTeX resume to a job description using Claude.
It returns a structured diff — keywords, gap summary, before/after bullet changes,
and a guardrails report — without touching your formatting or inventing new facts.

---

## How it works

```
You (or Claude Desktop)
        │
        │  job_description + resume_content
        ▼
  tailor_resume tool  ←── this server
        │
        │  calls Claude Sonnet with a constrained system prompt
        ▼
  structured JSON response
        │
        ├── jd_keywords        top 3–5 repeated JD terms
        ├── gap_summary        skills JD wants that aren't in your resume
        ├── bullet_changes     before/after for each modified bullet only
        ├── skills_changes     before/after for skills section (or null)
        ├── guardrails_report  model's self-audit (new claims, removed metrics)
        └── validation         5 deterministic checks run after the LLM response
```

**What it will never do:**
- Add experiences, metrics, or skills not already in your resume
- Remove numbers or percentages
- Change LaTeX commands or document structure
- Rewrite bullets you didn't ask it to touch

---

## Project structure

```
server.py           MCP server — exposes hello and tailor_resume tools
client.py           Standalone MCP client (learning exercise / smoke test)
prompts.py          System prompt that constrains Claude's output
guardrails.py       Post-LLM validation (5 deterministic safety checks)
test_guardrails.py  Offline unit tests for the guardrails module
pyproject.toml      Project config and dependencies
.env                Your ANTHROPIC_API_KEY (never committed)
```

---

## Setup

**1. Clone and install**
```bash
git clone <your-repo-url>
cd MCP_push1
uv sync
```

**2. Add your API key**

Create a `.env` file:
```
ANTHROPIC_API_KEY=sk-ant-...
```
Get a key at https://console.anthropic.com → API Keys.

**3. Test in the MCP Inspector**
```bash
uv run mcp dev server.py
```
Open the URL it prints. You'll see two tools: `hello` and `tailor_resume`.

**4. Run the offline guardrail tests**
```bash
uv run python test_guardrails.py
```

---

## Connect to Claude Desktop

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

```json
{
  "mcpServers": {
    "resume-tailor": {
      "command": "/Users/your-username/.local/bin/uv",
      "args": [
        "--directory",
        "/path/to/MCP_push1",
        "run",
        "server.py"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-..."
      }
    }
  }
}
```

> **Why full paths?** Claude Desktop spawns the server in a minimal environment
> that may not have your shell PATH. Full paths are required.

Restart Claude Desktop after saving. The `resume-tailor` server will appear
in the connectors list.

---

## Usage

### Via Claude Desktop

Once connected, ask Claude:

> "Use the tailor_resume tool. Here's the job description: [paste JD].
> Here's my resume: [paste LaTeX]."

Claude will call the tool automatically and explain the results to you.

### JD ingestion modes

| Source | How to use |
|--------|-----------|
| Pasted text | Copy the JD text, pass it directly |
| URL | Open the page, copy all text, paste it |
| PDF | Open the PDF, copy text, paste it |

The tool takes plain text input. Claude Desktop can also read URLs and PDFs
from your context window and pass the extracted text to the tool.

---

## Output format

```json
{
  "jd_keywords": ["Python", "ETL", "SQL"],
  "gap_summary": "No evidence of distributed systems experience.",
  "bullet_changes": [
    {
      "section": "Acme Corp / Data Engineer",
      "before": "\\resumeItem{Built pipeline tooling...}",
      "after":  "\\resumeItem{Built data pipeline tooling...}",
      "rationale": "Targets 'ETL' keyword — no new facts added."
    }
  ],
  "skills_changes": { "before": null, "after": null, "rationale": null },
  "guardrails_report": {
    "new_claims": [],
    "removed_metrics": [],
    "formatting_changes": []
  },
  "validation": {
    "passed": true,
    "issues": []
  }
}
```

---

## Guardrails

Five checks run after every LLM response:

| Check | What it catches |
|-------|----------------|
| Self-reported new claims | Model admits hallucinating |
| Self-reported removed metrics | Model admits stripping numbers |
| "Before" not in resume | Model invented the source text |
| LaTeX commands dropped | Formatting silently corrupted |
| Word count >50% growth | Keyword stuffing |

If any check fails, `validation.passed` is `false` and `issues` lists exactly what went wrong.

TDQS

A3.6/5.0

Scored across 2 tools

Disambiguation5/5

The two tools serve completely distinct purposes: hello is a health check, and tailor_resume is the core functionality. No overlap or ambiguity.

Naming Consistency2/5

The naming conventions are inconsistent: 'hello' is a bare verb while 'tailor_resume' follows a verb_noun pattern. Even with only two tools, the mismatch is notable.

Tool Count2/5

With only two tools, the server feels under-scoped. A resume tailoring service would benefit from more tools covering related operations, such as validation or keyword extraction.

Completeness2/5

The server lacks essential operations beyond the core tailoring task. No support for resume validation, multiple version management, or user feedback mechanisms, leaving significant gaps.

Maintenance

ActivityInactive
ResponsivenessNo issues