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