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:
{
"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
{
"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.












