resume-pdf-mcp
Compiles LaTeX resumes into PDFs using XeLaTeX or pdfLaTeX, with tools for validation, preview, template filling, and template listing.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@resume-pdf-mcpcompile my resume.tex using xelatex and show me the PDF"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
resume-pdf-mcp
Production-grade Model Context Protocol (MCP) server that compiles LaTeX resumes into PDFs.
GitHub: https://github.com/shashimehta03/mcp-resume
Works with Claude Desktop, Claude Code, Cursor, VS Code, and any MCP-compatible client.
What it does
Exposes MCP tools so your AI client can:
Tool | Purpose |
| Compile LaTeX → PDF (XeLaTeX or pdfLaTeX) |
| Check LaTeX before compile (structure + safety) |
| Page count, PDF size, compile duration |
| Save |
| List built-in resume templates |
| Fill a template with JSON variables → PDF |
| Server / engine / build info |
Security defaults: filename sanitization, path isolation, no shell interpolation, -no-shell-escape, size/timeout limits, stderr-only logging (LaTeX source is never logged in full).
Related MCP server: Resume Forge MCP
Complete setup checklist (follow in order)
Do every step once after cloning. Details for each step are in the sections below.
Install Node.js 20+ and a LaTeX engine (
pdflatexand/orxelatex) — see RequirementsClone the repo and run
npm installthennpm run build— see Clone and installConfirm build output exists:
dist/index.jsanddist/templates/must be presentNote your absolute paths: Node binary + clone folder — see What you must change after cloning
Configure your MCP host (pick one):
Claude Desktop → Configure Claude Desktop
Cursor → Configure Cursor
Claude Code → Configure Claude Code
Replace every example path in the config with your paths (Windows: use
\\in JSON)Do not leave
npm startrunning — Claude/Cursor start the server themselvesFully quit and reopen the host app (Claude: tray → Quit, not just close the window)
Verify the server is running (Claude: Settings → Developer →
resume-pdf= running)Use Chat mode (Claude Desktop) — Cowork/Code may ignore this MCP server
Smoke-test in chat: ask Claude/Cursor to call the
versiontoolOptional: run
npm run test:toolslocally to confirm TeX works without an MCP host
After you change code later: npm run build → quit/reopen the MCP host again.
Requirements
Node.js 20+ (22 LTS recommended)
A LaTeX engine on PATH
Windows: MiKTeX or TeX Live (
pdflatex/xelatex)macOS:
brew install --cask mactex-no-gui(or BasicTeX)Linux:
texlive-xetex/texlive-latex-recommended
Verify:
node -v
pdflatex --version
# and/or
xelatex --versionClone and install (do this first)
git clone https://github.com/shashimehta03/mcp-resume.git
cd mcp-resume
npm install
npm run buildConfirm the build:
# Windows PowerShell
Test-Path .\dist\index.js
Test-Path .\dist\templates\index.json
# macOS / Linux
ls dist/index.js dist/templates/index.jsonOptional local env file (MCP hosts do not auto-load .env — still set env in their JSON):
cp .env.example .envYou do not need to keep npm start running for Claude/Cursor. Those apps spawn the server themselves. Only run npm start / npm run test:tools for local smoke tests.
What you must change after cloning
Repo examples keep sample paths on purpose. After clone, change them to your machine.
What | Default in repo / examples | Change to |
Project folder |
| Where you cloned the repo |
|
|
|
|
|
|
|
|
|
|
|
|
|
| Full path to |
|
| Whichever engine you installed |
| project root | Same as your clone path |
More notes: examples/README.md.
Find your paths
Windows (PowerShell):
# Node
(Get-Command node).Source
# Project (run from inside the clone)
(Get-Location).Path
# Real Claude config path on Microsoft Store / MSIX installs
$pkg = (Get-AppxPackage -Name "*Claude*").PackageFamilyName
Join-Path $env:LOCALAPPDATA "Packages\$pkg\LocalCache\Roaming\Claude\claude_desktop_config.json"macOS / Linux:
which node
pwd # from inside the clone
# Config is usually:
# ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)Windows JSON tip: every backslash in a path must be doubled: E:\\mcp_resume\\dist\\index.js.
Configure Claude Desktop
1) Build the project
npm install
npm run build2) Open the config Claude actually reads
In Claude Desktop:
Settings → Desktop app → Developer → Edit Config
That opens claude_desktop_config.json.
Windows Microsoft Store / MSIX builds (important)
“Edit Config” may open:
%APPDATA%\Claude\claude_desktop_config.json
…but the app often reads:
%LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\claude_desktop_config.json
Edit the LocalCache file (or copy your finished config into both).
If you only edit the %APPDATA% file, Claude may ignore your server with no error.
Details: MSIX config path issue.
3) Add the server (merge into existing JSON)
If the file already has preferences / coworkUserFilesPath, keep them. Only add or update the top-level mcpServers key (do not paste a second { ... } object).
Valid shape (copy, then replace paths):
{
"mcpServers": {
"resume-pdf": {
"command": "C:\\Program Files\\nodejs\\node.exe",
"args": ["E:\\mcp_resume\\dist\\index.js"],
"cwd": "E:\\mcp_resume",
"env": {
"OUTPUT_DIR": "E:\\mcp_resume\\output",
"TEMP_DIR": "E:\\mcp_resume\\temp",
"TEMPLATES_DIR": "E:\\mcp_resume\\dist\\templates",
"DEFAULT_ENGINE": "pdflatex",
"LOG_LEVEL": "info",
"NODE_ENV": "production"
}
}
}
}What to change in that block (defaults left above on purpose):
Key | Change? |
| Yes → your |
| Yes → your clone’s |
| Yes → your clone folder |
| Yes → folders under your clone |
| If needed → |
| Optional |
macOS / Linux example (same keys — only paths change):
{
"mcpServers": {
"resume-pdf": {
"command": "/usr/local/bin/node",
"args": ["/Users/YOU/mcp-resume/dist/index.js"],
"cwd": "/Users/YOU/mcp-resume",
"env": {
"OUTPUT_DIR": "/Users/YOU/mcp-resume/output",
"TEMP_DIR": "/Users/YOU/mcp-resume/temp",
"TEMPLATES_DIR": "/Users/YOU/mcp-resume/dist/templates",
"DEFAULT_ENGINE": "xelatex",
"LOG_LEVEL": "info"
}
}
}
}Repo template: examples/claude-desktop-config.json.
4) Fully quit and reopen Claude
Closing the window is not enough. Use the tray / menu bar → Quit, confirm no Claude process is left, then start Claude again.
MCP servers are loaded only at startup.
5) Verify
Settings → Developer → Local MCP servers
Select
resume-pdfStatus should be running (not failed / disconnected)
If failed: open View Logs on that server
Start a new Chat (not Cowork, not Code)
Ask:
Call the resume-pdf version tool and show the result.To steer Claude every time:
Always use resume-pdf MCP tools (compile_resume, validate_resume, compile_template)
for any resume/LaTeX/PDF work. Do not compile LaTeX yourself in the sandbox.PDFs land in your OUTPUT_DIR (for example <clone>/output).
Optional: install as a Claude Desktop Extension
If the JSON mcpServers entry does not stay connected on your Claude build:
npm run build
npm run install:claudeThen fully quit/reopen Claude and check Settings → Developer / Extensions for Resume PDF (enabled).
Before relying on that helper on another machine, point these at your clone (repo defaults are examples — leave them until you change them):
mcpb/manifest.json→user_config.*.defaultmcpb/server/index.js→ fallbackRESUME_PDF_MCP_ROOT
Configure Cursor
Open Cursor MCP settings (or project
.cursor/mcp.json/ global MCP config, depending on your Cursor version).Add a server entry like:
{
"mcpServers": {
"resume-pdf": {
// CHANGE: "node" is usually fine in Cursor if Node is on PATH
"command": "node",
// CHANGE: absolute path to YOUR clone
"args": ["E:/mcp_resume/dist/index.js"],
"env": {
// CHANGE these to YOUR clone paths
"OUTPUT_DIR": "E:/mcp_resume/output",
"TEMP_DIR": "E:/mcp_resume/temp",
"DEFAULT_ENGINE": "pdflatex"
}
}
}
}See also examples/cursor-mcp.json.
Restart Cursor / reload MCP servers after saving.
Configure Claude Code
Add to your Claude Code MCP config (see examples/claude-code-mcp.json):
{
"mcpServers": {
"resume-pdf": {
"command": "node",
// CHANGE: YOUR clone's dist entry
"args": ["./dist/index.js"],
// CHANGE: YOUR clone directory
"cwd": "/absolute/path/to/mcp-resume",
"env": {
"DEFAULT_ENGINE": "xelatex",
"OUTPUT_DIR": "./output",
"TEMP_DIR": "./temp"
}
}
}
}Or from the project folder:
claude mcp add resume-pdf -- node ./dist/index.js(Adjust to your Claude Code version’s exact mcp add syntax.)
Environment variables
Copy .env.example. Values below are defaults — change only if you need to.
Variable | Default | Notes |
|
| Prefer absolute path in MCP host |
|
| Per-request workspaces |
|
| Use |
|
| Max LaTeX source bytes |
|
| Compile timeout (ms) |
|
| Soft memory guidance |
|
|
|
|
| Override if you move templates |
|
| Set |
MCP hosts pass these via the env block in their JSON config (they do not automatically load .env).
How to use (from the AI chat)
Once the server is running in the client:
Compile raw LaTeX
Use compile_resume with engine pdflatex and this LaTeX:
\documentclass{article}
\begin{document}
Hello from resume-pdf-mcp
\end{document}Validate first
Use validate_resume on this LaTeX before compiling: ...Use a template
Use list_templates, then compile_template with template_name "modern-simple"
and variables for name, email, summary, skills, experience, education.Example payload shape: examples/sample-template-request.json.
Expected success response
{
"success": true,
"pdf_path": ".../output/resume.pdf",
"tex_path": ".../output/resume.tex",
"compilation_logs": "...",
"execution_time": 0.82
}Local testing (without Claude)
npm test # unit + integration
npm run test:coverage
npm run test:tools # hits all tools; watch USAGE logs on stderr
npm run test:smoke # compile minimal-ats template onceDocker
docker compose build
docker compose run --rm resume-pdf-mcpImage includes TeX Live. See docs/docker.md.
For Claude Desktop via Docker, point command at docker and pass your compose/run args (stdio must stay attached).
Project layout
src/ TypeScript source (tools, services, latex, config)
dist/ Build output (what MCP hosts should run)
mcpb/ Claude Desktop extension manifest + launcher
examples/ Sample MCP configs and requests
docs/ Installation, usage, architecture, contributing
tests/ Vitest suite
output/ Generated PDFs/TeX (gitignored contents)
temp/ Compile workspaces (gitignored contents)Architecture:
Tool → ResumeService → LatexCompiler → FileSystemService → XeLaTeX/pdfLaTeXTroubleshooting
Problem | Fix |
Tool not in Claude | Use Chat mode; fully Quit/reopen; confirm Developer shows running |
Config saved but ignored (Windows) | Edit the MSIX |
| Install MiKTeX/TeX Live; put |
| Rebuild ( |
Claude compiles in sandbox instead | Server not connected — fix Developer status; instruct Claude to use |
Wrong output folder | Set absolute |
Logs (Windows MSIX):
%LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\logs\mcp-server-resume-pdf.log
Documentation
Development scripts
npm run dev # tsx stdio server
npm run build
npm start
npm run lint
npm run typecheck
npm run install:claude # install local Claude Desktop extension helperLicense
MIT — see LICENSE.
Links
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables creating, editing, and compiling LaTeX resumes directly from Claude using built-in templates, with support for managing multiple resume files and automatic PDF generation.Last updated11MIT
- AlicenseAqualityDmaintenanceAn MCP server for intelligent LaTeX resume generation with multiple templates, quality scoring, and job description tailoring.Last updated11MIT
- Alicense-qualityDmaintenanceMCP server that renders LaTeX to PDF via pdflatex, supporting raw LaTeX and Jinja2 templates with artifact generation.Last updated11MIT
- Alicense-qualityBmaintenanceAn MCP server that enables LLMs to compile LaTeX documents and inspect the resulting PDF, supporting an autonomous write-compile-check-revise loop via a self-hosted Overleaf CLSI instance.Last updatedMIT
Related MCP Connectors
Create sandboxed public-unlisted or access-key-protected HTML previews through a remote MCP server.
Tailor resumes, generate cover letters, render CVs as PDF, and browse 22+ templates.
Static MCP manifest and tool-policy security preflight with signed input-redacted receipts
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/shashimehta03/mcp-resume'
If you have feedback or need assistance with the MCP directory API, please join our Discord server