An MCP server for managing resume versions, analyzing job descriptions, and generating resume PDFs with AI-powered tailoring and semantic search capabilities.
The Resume MCP Server has 22 tools with comprehensive naming and input schemas. Tool names follow the verb_noun pattern (list_, load_, get_, update_, create_, delete_, search_) which is strong. Most tools have clear, descriptive names (list_resume_versions_tool, load_complete_resume_tool, get_resume_section_tool). However, descriptions are inconsistent in quality and depth. Many are terse (under 50 chars), some lack implementation details about what fields are returned, and error handling guidance is minimal. Input schemas use proper JSON Schema with typed parameters and descriptions, which is solid. Output schemas are not explicitly documented in the visible code, making it difficult to verify what downstream tools can chain. The tool set is well-organized functionally (read/write/delete operations clearly separated), but several tools have minimal descriptions that don't explain WHEN to use them vs. similar tools (e.g., load_complete_resume_tool vs. get_resume_section_tool distinction is unclear). Parameter descriptions are present but sometimes generic (e.g., 'Resume version name' repeated across many tools without context about valid values).
Analyzes job description text to extract key information including job title, company, responsibilities, required skills, experience, and educational requirements.
Build a semantic search vector index for resume entries.
Compile LaTeX content to a PDF file.
Copy one resume version to create another.
Create a new resume version from the current main resume.
Delete one exact text snippet from a resume text view.
Delete a resume version.
Output schemas not explicitly documented in visible code. Tool descriptions do not specify what fields/structure are returned, making it unclear what downstream tools can expect and forcing LLMs to infer structure.
Descriptions for many tools are terse and do not explain WHEN to use them vs. related tools. For example, load_complete_resume_tool, get_resume_section_tool, and read_resume_text_tool all read resume content but the distinction is unclear from descriptions alone.
Destructive tools (delete_resume_text_tool, delete_resume_version_tool) lack confirmation or dry-run guidance in their descriptions. Agents invoking these should be warned about irreversible consequences.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 60 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 39 | - | v1 |
Get the current layout and styling configuration of a resume version.
Load the Markdown content of a resume section.
Get the status of the semantic search vector index.
Insert text into a resume text view using a semantic position or anchor.
List all modules/sections available in a resume version.
Return the available resume versions as a JSON payload.
Load the complete resume YAML content for a specific version.
Read editable markdown text for a whole resume view or one section.
Render a resume version to LaTeX format.
Replace one exact text snippet in a resume text view.
Perform semantic search on resume entries.
Set the display order of resume sections.
Set whether a section is visible or hidden in the resume.
Update the main resume YAML file with new content.
Updates the Markdown content of a resume section.
No error handling guidance in tool descriptions. None specify what happens on invalid input (e.g., non-existent version_name, mismatched text in replace/delete operations) or how to recover. For example, replace_resume_text_tool requires 'exact match' but doesn't explain what happens if match fails.
Parameter 'anchor_text' in insert_resume_text_tool is nullable (type: string | None) but the description says 'Required when position is before or after', this conditional dependency is not formalized in the schema and LLMs may omit it despite the requirement.
Parameter descriptions lack specificity about format and constraints. For example, 'version_name' is described as 'Resume version name WITHOUT .yaml extension' but doesn't specify allowed characters, length, or regex pattern. Similarly, 'section_id' has examples (header, summary, skills, experience) but no exhaustive enum.
Tools that modify state (update, create, delete, write operations) do not document their idempotency or side effects. Agents retrying on failure need to know if calling the same tool twice will succeed, fail, or corrupt data.
'position' parameter in insert_resume_text_tool accepts string values ('start', 'end', 'before', 'after') but is defined as a free-form string type rather than an enum. LLMs may hallucinate invalid positions like 'middle', 'top', 'bottom'.
search_resume_entries_tool accepts 'entry_type' and 'chunk_level' as free-form strings rather than enums. Descriptions hint at valid values ('experience', 'projects', 'all' for entry_type; 'entry', 'bullet' for chunk_level) but constraint is not formalized.