Skip to main content
Glama

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_resume

Compile LaTeX → PDF (XeLaTeX or pdfLaTeX)

validate_resume

Check LaTeX before compile (structure + safety)

preview_resume

Page count, PDF size, compile duration

export_tex

Save .tex into the output folder

list_templates

List built-in resume templates

compile_template

Fill a template with JSON variables → PDF

version

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.

  1. Install Node.js 20+ and a LaTeX engine (pdflatex and/or xelatex) — see Requirements

  2. Clone the repo and run npm install then npm run build — see Clone and install

  3. Confirm build output exists: dist/index.js and dist/templates/ must be present

  4. Note your absolute paths: Node binary + clone folder — see What you must change after cloning

  5. Configure your MCP host (pick one):

  6. Replace every example path in the config with your paths (Windows: use \\ in JSON)

  7. Do not leave npm start running — Claude/Cursor start the server themselves

  8. Fully quit and reopen the host app (Claude: tray → Quit, not just close the window)

  9. Verify the server is running (Claude: Settings → Developer → resume-pdf = running)

  10. Use Chat mode (Claude Desktop) — Cowork/Code may ignore this MCP server

  11. Smoke-test in chat: ask Claude/Cursor to call the version tool

  12. Optional: run npm run test:tools locally to confirm TeX works without an MCP host

After you change code later: npm run build → quit/reopen the MCP host again.


Requirements

  1. Node.js 20+ (22 LTS recommended)

  2. 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 --version

Clone and install (do this first)

git clone https://github.com/shashimehta03/mcp-resume.git
cd mcp-resume
npm install
npm run build

Confirm the build:

# Windows PowerShell
Test-Path .\dist\index.js
Test-Path .\dist\templates\index.json

# macOS / Linux
ls dist/index.js dist/templates/index.json

Optional local env file (MCP hosts do not auto-load .env — still set env in their JSON):

cp .env.example .env

You 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

E:\\mcp_resume / /Users/YOU/mcp-resume

Where you cloned the repo

args entrypoint

.../dist/index.js

<your-clone>/dist/index.js (after npm run build)

OUTPUT_DIR

./output or example absolute path

<your-clone>/output (use absolute in MCP hosts)

TEMP_DIR

./temp

<your-clone>/temp

TEMPLATES_DIR

dist/templates

<your-clone>/dist/templates (or leave unset)

command (Node)

node or C:\\Program Files\\nodejs\\node.exe

Full path to node (Claude Desktop usually needs the full path)

DEFAULT_ENGINE

xelatex in .env.example, pdflatex in some examples

Whichever engine you installed

cwd (optional)

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 build

2) 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?

command

Yes → your node.exe / node absolute path

args[0]

Yes → your clone’s dist/index.js

cwd

Yes → your clone folder

OUTPUT_DIR / TEMP_DIR / TEMPLATES_DIR

Yes → folders under your clone

DEFAULT_ENGINE

If needed → pdflatex or xelatex

LOG_LEVEL / NODE_ENV

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

  1. Settings → Developer → Local MCP servers

  2. Select resume-pdf

  3. Status should be running (not failed / disconnected)

  4. If failed: open View Logs on that server

  5. Start a new Chat (not Cowork, not Code)

  6. 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:claude

Then 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.jsonuser_config.*.default

  • mcpb/server/index.js → fallback RESUME_PDF_MCP_ROOT


Configure Cursor

  1. Open Cursor MCP settings (or project .cursor/mcp.json / global MCP config, depending on your Cursor version).

  2. 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

OUTPUT_DIR

./output

Prefer absolute path in MCP host env

TEMP_DIR

./temp

Per-request workspaces

DEFAULT_ENGINE

xelatex

Use pdflatex if XeLaTeX isn’t installed

MAX_LATEX_SIZE

512000

Max LaTeX source bytes

COMPILE_TIMEOUT

60000

Compile timeout (ms)

MAX_MEMORY_MB

1024

Soft memory guidance

LOG_LEVEL

info

silent | error | warn | info | debug

TEMPLATES_DIR

dist/templates (runtime)

Override if you move templates

KEEP_TEMP_ON_FAILURE

false

Set true to debug failed compiles

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 once

Docker

docker compose build
docker compose run --rm resume-pdf-mcp

Image 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/pdfLaTeX

Troubleshooting

Problem

Fix

Tool not in Claude

Use Chat mode; fully Quit/reopen; confirm Developer shows running

Config saved but ignored (Windows)

Edit the MSIX LocalCache\Roaming\Claude\claude_desktop_config.json path

ENGINE_NOT_FOUND

Install MiKTeX/TeX Live; put pdflatex/xelatex on PATH; set DEFAULT_ENGINE

Server disconnected

Rebuild (npm run build); use full node path; set cwd; Quit Claude and reopen

Claude compiles in sandbox instead

Server not connected — fix Developer status; instruct Claude to use compile_resume

Wrong output folder

Set absolute OUTPUT_DIR in the MCP env block

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 helper

License

MIT — see LICENSE.


Available Tools

7 tools
compile_resumeA

Compile LaTeX resume source into a PDF using XeLaTeX (default) or pdfLaTeX. Returns paths and logs.

ParametersJSON Schema
NameRequiredDescriptionDefault
engineNoxelatex
filenameNo
latex_codeYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
engineNo
filenameNo
variablesYes
template_nameYes

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameNo
latex_codeYes

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
engineNoxelatex
latex_codeYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latex_codeYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 7 tool updatesv1.0.0
    • First observedcompile_resume
    • First observedcompile_template
    • First observedexport_tex
    • First observedlist_templates
    • First observedpreview_resume
    • First observedvalidate_resume
    • First observedversion

TDQS

B3.3/5.0

Scored across 7 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers