resume-pdf-mcp
Compiles LaTeX resumes into PDFs using XeLaTeX or pdfLaTeX, with tools for validation, preview, template filling, and template listing.
Click on "Deploy 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
Available Tools
7 toolscompile_resumeA
Compile LaTeX resume source into a PDF using XeLaTeX (default) or pdfLaTeX. Returns paths and logs.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | xelatex | |
| filename | No | ||
| latex_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the engines used and what's returned (paths, logs), which is reasonable. However, it doesn't mention whether compilation failures throw errors vs return error logs, handling of missing latex_code, or whether the tool has side effects like writing files to disk (which would be relevant given no read-only annotations exist). The compiler-engine detail is useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero wasted words. Front-loaded with the core purpose. Could arguably drop 'using XeLaTeX (default) or pdfLaTeX' redundancy, but it's informative. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 3 parameters at 0% schema description coverage and no output schema, the description should do more. It covers the engine parameter well but leaves latex_code and filename semantics implicit. It doesn't describe error handling, compilation failure behavior, or how logs are structured. Adequate for a straightforward compile task but has gaps given zero annotations and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all three parameters. The description explicitly names the engines (xelatex, pdflatex) matching the schema enum and mentions the default, covering 'engine'. However, 'latex_code' and 'filename' are not explained beyond their names, though they are fairly self-evident. The engine semantic detail adds value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb (Compile), resource (LaTeX resume source), and output (PDF via XeLaTeX/pdfLaTeX). It specifies the compiler engines and return values (paths and logs). It distinguishes from siblings like preview_resume, though it doesn't explicitly say how it differs from compile_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description says it returns paths and logs and specifies default engine choice, but gives no when-to-use guidance versus alternatives. With siblings like compile_template, preview_resume, and export_tex nearby, explicit guidance on when to use this vs those would be helpful, but it's not misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compile_templateC
Render a named resume template with JSON variables and compile the result to PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | ||
| filename | No | ||
| variables | Yes | ||
| template_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not disclose whether this performs a write/mutation (it produces a file), whether compilation is destructive to existing files, what the output (PDF) location or naming behavior is, or what happens on engine failure. The engine parameter (xelatex vs pdflatex) reveals compilation behavior but is not explained in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence with zero filler. It names the core inputs (template, JSON variables) and outcome (PDF). However, given the 4-parameter schema, the brevity borders on under-specification rather than disciplined conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 parameters, 0% schema description coverage, no output schema, and no annotations, this is a moderately complex tool (engine selection, variables object, output file). The one-sentence description is insufficient to cover engine semantics, variables schema, filename behavior, and error handling. The description is not complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the 4 parameters, but it barely does. It mentions that 'variables' holds JSON and 'template_name' selects a template, but gives no guidance on the 'engine' enum values (when to choose xelatex vs pdflatex), the optional 'filename' behavior (default naming? file extension?), or the shape expected within the variables object. With 0% coverage, this is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('render'), resource ('named resume template'), and outcome ('compile to PDF'). It distinguishes from siblings like export_tex (which presumably produces LaTeX, not PDF) and preview_resume. Could be clearer about the 'JSON variables' mechanism, but the core purpose is well expressed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explain when to use this tool versus compile_resume, which appears to be a near-sibling (compiling resumes). No exclusions or alternate-tool references are given. The agent has no guidance on choosing between compile_template and compile_resume beyond the template-focused name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_texC
Save LaTeX resume source as a .tex file in the configured output directory.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | No | ||
| latex_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It mentions writing to an output directory but doesn't state whether an existing file gets overwritten, what happens if the directory doesn't exist, whether the file is committed/persisted in the workspace, or what side effects occur. For a write operation with zero annotation coverage, this is a meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single clear, efficient sentence with zero filler. The core purpose is front-loaded. It's concise but arguably under-specifies given the 0% parameter coverage and absent annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a write tool with no annotations, no output schema, and 0% parameter coverage, the description should provide more context. It doesn't clarify file naming behavior, overwrite semantics, directory existence handling, or whether exports are visible/retrievable afterward. For a tool with two params and no structured supports, this is insufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. However, the description mentions none of the two parameters. 'latex_code' is implied by 'LaTeX resume source,' but 'filename' is entirely undocumented — its default behavior, constraints, or how it relates to the output directory is unclear. The description adds minimal value beyond what a reader might guess.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('Save LaTeX resume source as a .tex file') with a specific destination ('the configured output directory'). While it doesn't explicitly distinguish itself from siblings, the verb 'save/export' clearly differentiates it from compilation, preview, and validation tools in the context. It's specific but lacks explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool vs alternatives like compile_resume or preview_resume. The description doesn't mention whether export requires validation first, whether it works with saved templates, or any prerequisites. No exclusions, alternatives, or contextual cues are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesA
List all installed resume templates and their variables.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'List all installed' conveys a read-only, non-destructive action implicitly. The description tells the agent this returns template names plus their variable listings, which gives a useful preview of the return structure without needing error-path details for a simple listing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with zero waste. It front-loads the verb ('List') and the object ('all installed resume templates') and then expands with the output detail ('and their variables'). Every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter listing tool with no output schema, the description is adequately complete. It tells the agent what the output will cover (templates + variables). Additional details like output format or pagination would be nice but aren't essential for a simple no-arg enumeration tool in the presence of rich sibling names that convey the broader workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so there are no schema details to document. The baseline for 0 params is 4. The description meaningfully states what the output covers (template names and their variables), which supplements the empty schema and gives the agent an accurate expectation of results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and resource 'all installed resume templates and their variables.' This distinguishes it from siblings like compile_template and compile_resume since it's a listing/introspection operation rather than a compilation or export operation. However, it doesn't explicitly differentiate from a hypothetical template-management sibling beyond the listing focus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is a discovery/introspection tool — useful for learning what templates and variable names are available before calling compile/export tools. However, it doesn't explicitly state when to use this versus alternatives, nor does it name sibling tools or explain that it should be called before compiling a resume.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_resumeB
Compile a resume and return preview metadata: page count, PDF size, and compile duration.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | xelatex | |
| latex_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. The description does disclose the compile action and what outputs are produced (metadata), which is adequate. However, it doesn't mention whether compilation is ephemeral, whether any files are persisted, authentication needs, or rate limits. For a tool that performs compilation, this is moderate coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that front-loads the purpose and enumerates the three key metadata outputs. Every word earns its place, with no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no annotations and no output schema, the description is the only source of behavioral information for the agent. It adequately covers purpose and return values but could benefit from stating side effects (does compile persist anything?), whether the compiled PDF is available for download, and how errors are surfaced for invalid latex_code. It's usable but not thorough for an unstructured tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The description adds context that latex_code is the input to compile and engine selects the compilation toolchain. However, it doesn't explain the effect of choosing xelatex vs pdflatex on resulting metadata, or any constraints on latex_code beyond the schema's minLength. The description name-checks the workflow but doesn't add depth beyond what's inferable from parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource ('Compile a resume') and specifies the exact output metadata it returns (page count, PDF size, compile duration). It distinguishes reasonably from siblings like compile_resume and export_tex by focusing on preview metadata rather than producing a file artifact, though it doesn't explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for getting preview metadata (page count, size, duration) rather than producing the actual resume, which suggests when to use it. However, it doesn't explicitly state when NOT to use it or what the alternatives (compile_template, export_tex) are for, leaving the choice among siblings to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_resumeC
Validate LaTeX resume source for structural issues and dangerous constructs before compilation.
| Name | Required | Description | Default |
|---|---|---|---|
| latex_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral transparency. It mentions validating for 'dangerous constructs' and 'structural issues' but doesn't disclose what happens on failure—does it return errors, suggestions, or modifications? Does it reject or just warn? No output format, no side effects, no granularity of validation level is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence that front-loads the verb and resource. No padding or filler. Could arguably be slightly more detailed, but the sentence earns its place and is appropriately compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a validation tool with no annotations, no output schema, and zero schema description coverage, the description does too little. The agent doesn't know what happens when validation fails or passes, what the return shape is, or how validation results are reported. Given the tool's complexity (validation implies rich feedback), this is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter latex_code is straightforward and its name is self-explanatory as requiring the LaTeX source to validate. With 0% schema description coverage, the description doesn't add format details beyond what the schema name suggests, but for a single obviously-named param, minimal elaboration is needed. The baseline is somewhat lowered by zero coverage, yet the param name makes intent clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (validate), resource (LaTeX resume source), and purpose (structural issues and dangerous constructs before compilation). It distinguishes from siblings like compile_resume and preview_resume by focusing on pre-compilation validation. Could be more specific about what 'structural' and 'dangerous' mean, but the core action is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is provided. It doesn't explicitly tell the agent to use this before compile_resume, nor does it describe what makes this preferable to compile_template or other siblings. The phrase 'before compilation' subtly implies ordering with compile_resume, but this is only implied, not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
versionA
Return server version, supported engines, MCP SDK version, and build information.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden. The description states what data is returned (version, engines, SDK version, build info), which adds behavioral context. However, it doesn't disclose whether the tool makes network calls, requires authentication, or whether the data reflects the server or client. For a read-only informational tool with no annotations, the description provides reasonable but not exhaustive transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that covers all return categories. It's efficient and contains no filler or redundancy. It earns a slight deduction from 5 because it could arguably enumerate what 'build information' means, but as written it's appropriately minimal and front-loaded with the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple zero-parameter informational tool with no output schema and no annotations. Given this low complexity, the description specifying the four categories of returned data (version, engines, SDK, build) is reasonably complete. The definition adequately covers what an agent needs to know to decide when to invoke it and what to expect back, though it doesn't detail the return format structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there's nothing the description needs to add about parameter semantics. Per the rubric, 0 params = baseline 4. The description appropriately lists the categories of information returned (version, engines, SDK, build), which is useful context even though no params exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'Return server version, supported engines, MCP SDK version, and build information.' It uses a specific verb (return) with a specific resource (server version/engines/SDK/build). While it doesn't need to differentiate from siblings (none of the siblings are version-related), the purpose is unambiguous and well-scoped.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (retrieve version/info when needed), but doesn't explicitly state when to use this vs alternatives or when not to. Given the sibling tools are all resume-related operations and this is an informational/metadata tool, the usage context is fairly obvious, but there's no explicit guidance about when to call it (e.g., 'call this to verify server compatibility or debug SDK mismatches').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v1.0.0- First observed
compile_resume - First observed
compile_template - First observed
export_tex - First observed
list_templates - First observed
preview_resume - First observed
validate_resume - First observed
version
TDQS
Scored across 7 tools
Most tools are clearly distinct: compilation, validation, preview, export, templates, and version all target different operations. The main confusion is between compile_template and compile_resume—one renders a named template while the other compiles raw LaTeX source, but the distinction (template vs source) is reasonably clear from names.
Tools consistently use a verb_noun pattern throughout (compile_template, compile_resume, preview_resume, export_tex, list_templates, validate_resume). The pattern is mostly regular, though having both compile_template and compile_resume with the same 'compile' verb is a minor deviation from strict one-verb-per-action.
Seven tools is well within the ideal 3-15 range for a resume/pdf generation server. Each tool has a distinct role in the workflow: template management, compilation, validation, preview, export, and metadata.
Core workflows are covered: templates can be listed and compiled, source can be validated, compiled, previewed, and exported. However, there's no obvious update/delete operation for templates, and no tool to manage or inspect output artifacts beyond preview metadata, leaving some minor lifecycle gaps.
Maintenance
Related MCP Connectors
A hosted LaTeX editor your assistant can actually use. Search 1,019 free templates, create and edit projects, and compile them to PDF on a real TeX Live farm, getting back the PDF or the compile log when a build fails. Thirteen tools behind OAuth 2.1, with nothing to install and nothing to run locally.
Generate tailored, ATS-optimized resume PDFs and cover letters from a job description, over MCP.
Build, version and render resumes as PDFs from Claude or any MCP client.
Persistent AI LaTeX workspace: edit and compile multi-file projects, export publication-ready PDFs.
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.11MIT
- AlicenseAqualityDmaintenanceAn MCP server for intelligent LaTeX resume generation with multiple templates, quality scoring, and job description tailoring.11MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that renders LaTeX to PDF via pdflatex, supporting raw LaTeX and Jinja2 templates with artifact generation.11MIT
- AlicenseNot gradedqualityBmaintenanceAn 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.MIT