Markdown resume builder that lints your CV and explains why it will not fit two pages. ATS-safe PDF, job-description tailoring, CLI + MCP server for AI agents.
markcv has well-structured tool definitions with clear names, solid descriptions (avg 180 chars), and complete input schemas using Zod. All 7 tools follow verb_noun naming (render_cv, check_fit, lint_cv, tailor_to_jd, list_variants, new_variant, diff_variants). Schemas include proper types, enums, and constraints. However, output schemas are not documented, responses are JSON but the structure is not formally declared. Error handling is basic (file existence checks, fail() helper) but lacks recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles (render_cv and new_variant are WRITE operations). Parameter descriptions are present but some lack format/constraint details (e.g., 'name' in new_variant has regex but description doesn't mention the pattern).
Why the CV does not fit. Separates two very different causes: content that is too long, versus bad page breaks. Returns the overflow, the blocks pushed onto a new page, the pixels wasted, and concrete suggestions.
Compare two CV versions. Which bullets exist on only one side — use it to see what a tailored copy dropped.
Audit CV content. Finds unverifiable self-praise, UNDERSTATED claims relative to the real work, present-tense bullets on finished jobs, skills with no supporting evidence, duplicate bullets, and IC/manager role mismatch.
List CV versions. Every .md file in a folder with its line count, bullet count and section list.
Start a tailored version. Copy a master CV to cv-<name>.md so it can be trimmed for one specific role.
Build a PDF from a markdown CV. Render the CV to PDF (and HTML). Returns the real page count plus layout numbers to verify against.
Output schemas not documented. Tools return JSON via json() helper but response structure (fields, types, nesting) is not formally declared. LLMs cannot plan downstream operations or extract fields reliably.
Missing tool annotations. render_cv and new_variant are destructive (WRITE), but no destructiveHint annotation. check_fit, lint_cv, tailor_to_jd, list_variants, diff_variants are read-only but lack readOnlyHint. Agents cannot distinguish safe from risky operations.
Error handling lacks recovery guidance. fail() returns bare error messages (e.g., 'File not found: <file>'). No suggestions for next steps (e.g., 'Try list_variants() to see available files'). Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Compare the CV against a job description. Points out JD requirements with no evidence, keywords that live only under SKILLS, and unrelated bullets (cut those first, before cutting anything valuable).
Parameter constraint descriptions incomplete. new_variant 'name' param has regex /^[a-z0-9-]+$/ but description does not state the pattern. tailor_to_jd requires 'jd_file OR jd_text' but mutual exclusivity is not documented. LLMs may pass invalid values or both params.
No pagination support. list_variants returns all .md files in a directory with no limit, offset, or total count. Large directories could produce unbounded output, exhausting context window.