resumeforge
This server turns any AI assistant into a resume-tailoring engine for job applications, handling the full workflow from intake to application kit.
Start a resume session: Get the playbook, intake checklist, and ATS formatting rules.
Validate candidate intake: Hard-gate that collects name, email, phone, location, LinkedIn profile, and current resume; cross-checks resume vs LinkedIn.
Analyze job descriptions: Decode weighted keywords, focus points, seniority, years required, education, domain terms, and verbs to mirror.
Analyze gaps: Compare candidate materials to the JD, assign strategies (surface, reframe, ask, bridge project, quick-learn), map evidence, propose bridge projects, certifications, and a resume plan.
Suggest bridge projects: Generate company-themed portfolio projects with stacks, day-by-day build plans, bullet templates, and talking points.
Score resumes: Run a deterministic 0–100 ATS simulation with weighted keyword match, bullet quality, structure, length, integrity, and truth-check for unverified claims.
Render final resumes: Produce ATS-safe DOCX, PDF (auto-fit to one page), Markdown, and TXT, requiring candidate approval and refusing placeholders.
Build an application kit: Generate an apply-today checklist, auto-reject check, copy-paste form answers, cover letter, referral/outreach messages, LinkedIn updates, interview prep, and a tracker.
Scaffold bridge project repos: Generate runnable starter code (Go, Python, TypeScript, or Java) with tests, CI, docker-compose, README, and build log.
Provides portal-specific application guidance for Greenhouse job postings, including submission tips, copy-paste form answers, and apply-today/checklist support.
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., "@resumeforgeTailor my resume to this Senior Backend Engineer JD and score the match."
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.
ResumeForge MCP
An open-source connector that turns any AI assistant into a resume engine tailored to each job description and built to pass ATS screens.
Works with Claude, ChatGPT, Cursor, VS Code Copilot, Windsurf, Gemini CLI, Codex, and any other client that supports the Model Context Protocol. No API keys, and it's stateless: nothing about the candidate is stored.
Built primarily for software engineering and technical roles, and it handles any job description (marketing, finance, ops, healthcare, design…).
Original resume vs. Senior Backend Engineer JD → 56/100 (C) "Borderline, likely filtered by ATS"
After ResumeForge (no fabricated claims) → 88/100 (A) "Strong match"Real output from the bundled example in examples/. Run npm test to reproduce it.
Why this exists
Getting past the first screen is the hardest part of a job search. Most resumes are rejected by keyword-ranking ATS systems or a 7-second recruiter skim, before a human ever judges whether the candidate could do the job. Meanwhile, much of what a JD asks for can be learned and demonstrated in days.
ResumeForge closes that gap aggressively but truthfully:
Most "AI resume" tools | ResumeForge |
Stuff keywords everywhere | Weights keywords by where the JD puts them (title > requirements > responsibilities > nice-to-have) and caps repetition |
Invent experience to match | Maps every JD focus point to the candidate's real evidence, then rewrites it in the JD's language |
Leave gaps as gaps | Turns each gap into a strategy: surface (it's on LinkedIn), reframe (adjacent tool), ask, bridge project (build it this week), or quick-learn |
Generic "build a todo app" advice | Bridge projects themed to the company's domain (a Go+Kafka payments pipeline for a fintech JD), with a day-by-day plan and bullet templates |
Ignore LinkedIn | Requires the LinkedIn profile before drafting and cross-checks titles, companies and dates (recruiters open it right after the resume) |
Pretty but unparseable PDFs | Single-column DOCX + text-based PDF that Workday, Greenhouse, Lever, iCIMS and Taleo parse cleanly |
The one rule: the resume should be the strongest true version of the candidate. A resume that gets the interview but falls apart in it wastes everyone's time. The tool enforces this with a
truth_checkthat flags any claim not traceable to the resume, LinkedIn, the candidate's answers, or a bridge project.
Related MCP server: ResumeMCP
Why not just a prompt?
A good prompt gets you part of the way. The repo even ships one (prompts/universal-prompt.md). The connector adds what a prompt can't guarantee:
With only a prompt | With the ResumeForge connector |
The AI grades its own work, generously, and differently every run | Deterministic 0–100 score. Same resume + JD = same score, with every point explained |
"Please collect LinkedIn / check claims / get approval" is a request the model can drift from | Enforced gates. No files until intake is complete and the candidate approves. Leftover |
Loose keyword matching | Literal, alias-aware matching like real ATS: 320+ skills and 570+ spellings, telling you exactly where to write "PostgreSQL" vs "Postgres" |
Can't reliably check its own claims | truth_check compares every skill on the new resume against the original resume, LinkedIn and the candidate's answers |
Text you paste into Word and reformat | ATS-safe DOCX and a one-page PDF, generated directly |
Results vary by model | Same analysis in Claude, ChatGPT, Cursor or Gemini, because the tool does the analysis, not the model |
How it works
flowchart LR
A[start_resume_session] --> B{validate_intake}
B -- missing details / no LinkedIn --> A2[Ask candidate] --> B
B -- ready --> C[analyze_job_description]
C --> D[analyze_gaps]
D --> E[Ask candidate: confirm skills, pick bridge projects]
E --> F[AI drafts structured resume]
F --> G[score_resume + truth_check]
G -- score < 85 or unverified claims --> F
G -- approved by candidate --> H[render_resume → DOCX / PDF]
H --> K[build_application_kit → form answers, cover letter, referrals, interview prep]
K --> S[scaffold_bridge_project → starter repo to close gaps]The AI you're already using does the writing. ResumeForge supplies the deterministic parts: JD decoding, weighting, gap strategy, evidence mapping, ATS scoring, integrity checks and file rendering. That keeps results consistent across models.
Tools
Tool | What it does |
| Returns the playbook, the intake checklist, and ATS rules. The AI calls this first. |
| Hard gate. Requires name, email, phone, location, a LinkedIn |
| Weighted keywords (must-have / nice-to-have / contextual) with the exact ATS phrasing to mirror ( |
| A strategy per gap, an evidence map from each focus point to the candidate's best lines, bridge projects, quick-win certifications, and a resume plan: headline, section order (student / new grad / career switcher / senior), a drop-in Skills section with a "Familiar with" tier, job-title translation ("Member of Technical Staff" → "Software Engineer (MTS)"), and buried experience to promote (internships, freelance, open source, TA, hackathons). Plus batched questions for the candidate. |
| Company-themed projects across 14 archetypes (backend API, event-driven, cloud/IaC, frontend, LLM/RAG, data pipeline, ML to production, mobile, SRE, security, test automation, systems, OSS, business case), each with stack, build plan, bullet templates and talking points. |
| 0–100 ATS simulation: weighted keyword match (45), keywords backed by bullets (10), title alignment (8), bullet quality (15), structure (10), length (5), integrity (7). Returns blockers, top fixes, and a truth_check. Also scores plain text, which is useful for before/after. |
| Requires |
| Everything needed to actually apply (see below). Saves |
| Generates a runnable starter repo for a bridge project: a Go, Python (FastAPI) or TypeScript service with a passing test, CI, a docker-compose for its databases and brokers, and a README carrying the build plan, results table and resume-bullet templates. |
Paste a JD, get the whole application
After the resume, build_application_kit gives the candidate:
What's inside | |
Apply-today checklist | Timing based on posting age, the right file format, and portal-specific tips detected from the job URL (Workday, Greenhouse, Lever, Ashby, iCIMS, Taleo, SmartRecruiters, LinkedIn Easy Apply) |
Auto-reject check | Years, degree, visa sponsorship, location and must-have coverage, each marked ✅ / ⚠️ / ❓ with what to do |
Copy-paste form answers | Contact fields, "Why us?", "Why you?", a project you're proud of, salary script, notice period, and "Years of experience with X", computed honestly from dated roles, with the basis shown |
Cover letter | Under 250 words, built from the strongest real achievements, attributed to the right employer |
Referrals and outreach | LinkedIn people-search links (team members, recruiters, managers, alumni from your school), a referral request, a connection note that fits LinkedIn's limit, a recruiter email, and follow-up (dated) and thank-you emails |
LinkedIn updates | Headline, About section, skills to add, Open-to-Work titles |
Interview prep | Elevator pitch, likely questions (technical, system design themed to the company's domain, behavioral, "you haven't used X"), and "defend every bullet" |
Tracker | Applied date plus follow-up dates, appended to |
See a full example: examples/sample-application-pack.md.
Every draft is filled from the candidate's real materials. The kit never claims experience from an in-progress project, and the test suite enforces that.
Also exposed: the prompt tailor_resume and the resources resumeforge://guide/playbook and resumeforge://guide/ats-rules.
Install
Requires Node.js 20+.
The first launch takes about a minute while
npxdownloads and builds the connector from GitHub. After that it starts instantly.Troubleshooting: if your app reports
spawn npx ENOENT(common with nvm or Volta, because desktop apps don't load your shell's PATH), replace"npx"with the full path fromwhich npx. Or clone the repo, runnpm install, and use"command": "<output of which node>"with"args": ["/absolute/path/to/resumeforge-mcp/dist/index.js"].
Settings → Developer → Edit Config (claude_desktop_config.json):
{
"mcpServers": {
"resumeforge": { "command": "npx", "args": ["-y", "github:Vishu-ak/resumeforge-mcp"] }
}
}claude mcp add resumeforge -- npx -y github:Vishu-ak/resumeforge-mcp{
"mcpServers": {
"resumeforge": { "command": "npx", "args": ["-y", "github:Vishu-ak/resumeforge-mcp"] }
}
}{
"servers": {
"resumeforge": { "type": "stdio", "command": "npx", "args": ["-y", "github:Vishu-ak/resumeforge-mcp"] }
}
}[mcp_servers.resumeforge]
command = "npx"
args = ["-y", "github:Vishu-ak/resumeforge-mcp"]Web apps need a hosted HTTPS endpoint.
One click (free tier):
Or run the prebuilt image anywhere (Railway, Fly.io, Cloud Run, a VPS…). Every push to main publishes it:
docker run -p 3333:3333 ghcr.io/vishu-ak/resumeforge-mcp:latest
# MCP endpoint: https://<your-host>/mcp health check: /healthclaude.ai: Settings → Connectors → Add custom connector → paste
https://<your-host>/mcp.ChatGPT: enable Developer mode under Settings → Connectors / Apps, then create a connector with
https://<your-host>/mcp.
In remote mode, files come back inline (as embedded PDF/DOCX resources) and nothing is written to the server's disk. Set RESUMEFORGE_API_KEY to require a bearer token (for clients that support custom headers), and RESUMEFORGE_ALLOWED_ORIGINS to restrict CORS.
Use prompts/universal-prompt.md as a Custom GPT / Gem / Project instruction, or paste it into any chat. It carries the same method (intake gate, JD weighting, gap strategies, bridge projects, scoring rubric, truth check) for the AI to follow by hand.
Use it
Just ask your AI:
"Tailor my resume for this job" (and paste the JD)
The connector's instructions make the AI start the session, collect your details and LinkedIn, and walk through the flow. You'll be asked for:
Name, email, phone, location
LinkedIn URL and profile content. Paste it, or use LinkedIn → More → Save to PDF.
Your current resume
The job description
(Optional) GitHub, side projects, courses, anything not on your resume yet
Files are saved to ~/ResumeForge/ (change with RESUMEFORGE_OUTPUT_DIR) as Firstname_Lastname_Company_Role_Resume.docx/.pdf.
Example: what the connector sees
Input: examples/sample-jd.txt (Senior Backend Engineer, payments), sample-resume.txt, sample-linkedin.txt.
analyze_gaps (excerpt)
Go must_have surface (learning) "Your LinkedIn says you're learning Go. A bridge project in Go
turns 'learning' into a shipped, listable skill."
Apache Kafka must_have reframe "You have RabbitMQ, which transfers directly…"
PostgreSQL must_have surface "Already on your LinkedIn but missing from the resume."
gRPC must_have bridge_project
Terraform nice_to_have quick_learn "~8–20 hours to working proficiency"
Bridge project → "Event-Driven Payments Processing Pipeline"
stack: Apache Kafka, Go, Kubernetes, gRPC, … closes: Kafka, Go, gRPC, Concurrency, Observability…
Day 1: Define the payment event schemas and run the broker locally…Evidence map: the focus point "Experience with Docker, Kubernetes and CI/CD pipelines" is matched to the candidate's real line "Created Jenkins pipelines for automated build and deployment to AWS EC2", which becomes the bullet to rewrite.
Result: examples/sample-tailored-resume.json scores 88/100 with zero unverified claims. The Go/Kafka project renders as "(In Progress)" until it's built. Rendered output: examples/sample-output.pdf.
Privacy
Stateless. No database, no sessions, no telemetry. The HTTP server creates a fresh instance per request.
In local (stdio) mode, everything runs on your machine; files are written only to your output folder.
The server never fetches LinkedIn (scraping violates LinkedIn's terms and is blocked anyway). You paste your own profile.
Development
npm install
npm test # 54 tests: skills, JD parsing, intake, gaps, scoring, rendering, kit, scaffolds, MCP end-to-end
npm run smoke:scaffold # generate every bridge-project skeleton and run its own tests (needs go, python3)
npm run dev # stdio server via tsx
npm run dev:http # HTTP server on :3333
npm run inspect # open the MCP Inspector against the built serverReleasing: push a tag like v0.1.1 (matching package.json). The Release workflow tests the code, publishes to npm (requires an NPM_TOKEN repo secret), and pushes a versioned Docker image to GHCR.
Project layout:
src/
server.ts MCP tools, prompts, resources
index.ts CLI: stdio (default) or --http
schemas.ts Candidate profile + Resume schema (with evidence sources)
workflow.ts The playbook the AI follows
core/ jd · intake · gap · bridge · score · skills · dates · resumeParse · resumeText
data/ skills taxonomy (320+ skills, 570+ aliases) · action verbs · bridge-project archetypes
render/ docx · pdf (auto-fit) · markdown/txt
prompts/universal-prompt.md for AIs without MCP
examples/ sample JD, resume, LinkedIn, tailored outputContributing
The biggest quality levers are data: skill aliases, domain themes, bridge-project archetypes, and non-tech role coverage. See CONTRIBUTING.md.
License
MIT
Available Tools
9 toolsanalyze_gapsAnalyze candidate vs JD gapsARead-only
Compares the candidate (resume, LinkedIn, extra context) to the JD. For every missing requirement, assigns a strategy (surface, reframe, ask_candidate, bridge_project, quick_learn). Also maps each JD focus point to the candidate's best existing evidence, proposes JD-themed bridge projects, suggests quick-win certifications, and returns a resume plan: headline, section order, summary formula, a drop-in Skills section with a 'Familiar with' tier, job-title translations (e.g. 'Member of Technical Staff' → 'Software Engineer (MTS)'), and buried experience worth promoting (internships, freelance, open source). Also returns questions to ask the candidate.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Company name, if known | |
| jd_text | Yes | Full job description text, including requirements and responsibilities | |
| job_title | No | Exact job title, if known (improves title matching) | |
| resume_text | Yes | Candidate's current resume text | |
| career_stage | No | ||
| linkedin_text | No | ||
| additional_context | No | ||
| years_of_experience | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description does not contradict that. The description adds substantial behavioral detail about what the tool produces, including strategies, resume plan components, and candidate questions, which helps the agent predict the tool's behavior accurately.
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 long but information-dense and every major clause adds a distinct output category. It front-loads the core comparison and gap-strategy assignment before the resume-plan details, though bullet formatting would improve scannability.
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 complex analysis tool with no output schema, the description is unusually thorough in enumerating return values: strategies, JD-to-evidence mapping, bridge projects, certifications, resume plan elements, and candidate questions. It falls slightly short by not addressing how optional parameters like career_stage or years_of_experience influence the analysis.
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 exactly 50%, so the description must partially compensate. It clarifies that resume_text, linkedin_text, and additional_context are candidate inputs, but it does not explain company, job_title, career_stage, or years_of_experience, leaving those optional parameters undocumented.
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 opens with a specific verb and resource: 'Compares the candidate (resume, LinkedIn, extra context) to the JD.' It then enumerates distinctive outputs like gap strategies, bridge projects, resume plan, and candidate questions, which clearly separates this tool from siblings like score_resume or render_resume.
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 usage context is implied by the detailed description: use this when you need a full candidate-versus-JD gap analysis and actionable resume strategy. However, it never explicitly states when to choose this over siblings like analyze_job_description, suggest_bridge_projects, or score_resume, nor does it mention any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_job_descriptionAnalyze job descriptionARead-only
Decodes a job description into weighted keywords (must-have vs nice-to-have, with exact ATS phrasing), ranked focus points, seniority, years required, education/certifications, domain terms, action verbs to mirror, and implied expectations.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | Company name, if known | |
| jd_text | Yes | Full job description text, including requirements and responsibilities | |
| job_title | No | Exact job title, if known (improves title matching) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, and the description adds useful behavioral detail about what the tool returns (weighted keywords, seniority, years, etc.) without contradicting the annotation. It does not mention limitations or edge cases, but with annotations present this is a minor 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 dense sentence that front-loads the verb and resource before listing outputs. The list is long but every element adds information; slightly more structure would improve scannability.
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 no output schema, the description compensates by enumerating the major output categories an agent should expect. It is complete for the core call, though it lacks guidance on ordering relative to sibling resume tools.
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 100%, so the parameters are already fully documented. The description adds no extra parameter-level meaning, which is acceptable; baseline 3 applies.
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 uses the specific verb 'decodes' and identifies the resource (job description), then enumerates a detailed set of outputs that distinguish it from siblings like analyze_gaps or score_resume. An agent can tell exactly what this tool produces.
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 use case is implied: call this when a raw job description needs to be parsed into structured resume-matching inputs. However, it never states when not to use it or names alternatives such as analyze_gaps/score_resume, so the agent must infer routing from sibling names and the output list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_application_kitBuild the application kitA
Everything needed to actually apply, generated from the JD and the candidate's materials: an apply-today checklist with portal-specific tips (Workday, Greenhouse, Lever…), an auto-reject check (years, degree, sponsorship, location, must-haves), copy-paste answers to application form questions (including honest 'years with X' computed from role dates), a cover letter, referral and recruiter messages with LinkedIn search links, a LinkedIn connection note, follow-up and thank-you emails, LinkedIn headline/About/skills updates, interview prep (elevator pitch, likely questions, 'defend every bullet'), and a tracker entry. Call it after render_resume, passing the final resume.
| Name | Required | Description | Default |
|---|---|---|---|
| posted | No | When it was posted, e.g. '3 days ago' or '2026-09-20' | |
| resume | No | The final tailored resume (strongly recommended) | |
| company | No | Company name, if known | |
| jd_text | Yes | Full job description text, including requirements and responsibilities | |
| job_url | No | Posting URL. Used to detect the application portal and tailor tips. | |
| candidate | Yes | ||
| job_title | No | Exact job title, if known (improves title matching) | |
| output_dir | No | ||
| save_files | No | Local mode: save Application_Pack.md and Cover_Letter.docx next to the resume | |
| log_application | No | Append to applications.csv. Set true only after the candidate confirms they submitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the sparse annotations, notably that 'years with X' answers are computed honestly from role dates and that portal-specific tips depend on the application portal. It aligns with readOnlyHint=false by describing a content-generation operation, but it does not disclose file-output or logging side effects such as save_files or applications.csv.
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 information-dense, front-loads the purpose with 'Everything needed to actually apply,' and ends with a crisp sequencing instruction. It is a single long run-on that would be easier to scan as bullets, but every clause carries useful content and there is minimal filler.
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?
Because there is no output schema, the description carries the burden of explaining what the agent gets, and it lists the major artifacts clearly. It also covers the main input source and the required sequencing. Remaining gaps like save_files and log_application behavior are delegated to the schema rather than described, which is acceptable but not exhaustive.
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?
With 80% schema coverage, the schema already documents most parameters, and the description adds real meaning on top: the resume is framed as the output from render_resume, job_url implicitly matters for portal-specific tips, and the honest-years note explains how role dates in the resume feed generated answers. It does not enrich every parameter, but it goes well beyond restating 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?
The description names a specific action and resource: building the application kit from the JD and candidate materials. It enumerates concrete deliverables (checklist, auto-reject check, cover letter, messages, interview prep, tracker entry) and distinguishes the tool from upstream siblings like analyze_job_description and render_resume by framing it as the final packaging step.
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?
It gives an explicit workflow instruction: 'Call it after render_resume, passing the final resume,' which tells the agent when to invoke the tool and what input to provide. It does not spell out when not to use it or compare against sibling tools beyond that sequencing note, so it falls just short of full usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_resumeRender final resume filesAIdempotent
Renders the approved resume to ATS-safe DOCX / PDF / Markdown / TXT. Requires candidate_approved=true and a valid LinkedIn URL. Refuses if placeholder metrics like [N] remain. Also returns LinkedIn alignment suggestions and, if jd_text is given, the final ATS score.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Used in the file name | |
| resume | Yes | ||
| company | No | Used in the file name | |
| formats | No | ||
| jd_text | No | If provided, includes the final ATS score | |
| max_pages | No | ||
| output_dir | No | Local mode only. Defaults to ~/ResumeForge or $RESUMEFORGE_OUTPUT_DIR | |
| candidate_sources | No | The candidate's original materials. Enables truth_check, which flags claims with no evidence. | |
| candidate_approved | Yes | true only after the candidate reviewed and approved the final content |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: it reveals the validation gate, the refusal condition for placeholders, and the extra return payload (LinkedIn alignment suggestions and optional ATS score). Since the annotations only indicate readOnly=false, idempotent=true, destructive=false, this behavioral detail is valuable and non-contradictory.
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?
Three tight sentences with no filler. The main action is front-loaded, followed by prerequisites, refusal behavior, and return value. Every sentence adds operational information.
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 tool with complex nested inputs and no output schema, the description covers purpose, prerequisites, failure conditions, and return content. It could mention file naming, output_dir behavior, or the default formats, but those are already present in the schema and not essential for correct selection and invocation.
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?
With 67% schema coverage, the schema already documents most parameters, but the description adds important semantics: candidate_approved is a required gate, jd_text triggers the final ATS score, and a 'valid LinkedIn URL' imposes a stricter requirement than the schema's plain string type. This goes beyond what the input schema alone conveys.
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 uses a specific verb ('Renders') with a specific resource ('the approved resume') and clearly names the output formats (DOCX / PDF / Markdown / TXT). This makes the tool's role obvious and distinguishes it from sibling analysis/scoring tools like score_resume or analyze_gaps, which do not produce final files.
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 gives clear usage context by stating the hard prerequisites: candidate_approved=true, a valid LinkedIn URL, and no placeholder metrics like [N]. It does not explicitly name alternatives or say 'use this instead of X,' but the 'approved' and 'final' framing strongly implies this is the last step after other tools have prepared the resume.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scaffold_bridge_projectScaffold a bridge project repoB
Generates a runnable starter repository for a bridge project: a Go, Python (FastAPI) or TypeScript service with a /health endpoint and a passing test, CI, a docker-compose for the stack's databases and brokers, a README carrying the build plan, results table and resume-bullet templates, and a BUILD_LOG. Java gets a Spring Initializr command. Pass a project from analyze_gaps or suggest_bridge_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| jd_text | No | Used to name routes after the company's domain | |
| project | Yes | ||
| language | No | Defaults to the stack's main language | |
| overwrite | No | ||
| output_dir | No | Local mode: parent folder. Defaults to ~/ResumeForge/projects | |
| github_username | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide no strong safety profile beyond false hints, so the description must carry behavioral context. It usefully discloses generated artifacts (health endpoint, CI, docker-compose, README, BUILD_LOG) and the Java Spring Initializr special case. It does not mention side effects such as file creation/overwrite behavior, output location, or whether github_username triggers remote repository creation, so transparency is only partial.
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 information-dense sentence with a clear leading verb and resource, followed by a compact list of generated components and a brief Java exception. Every clause adds relevant detail, though the long enumeration makes it slightly less scannable than ideal.
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's complexity (nested project object, six parameters, multiple language paths, no output schema), the description is reasonably complete about what gets generated and where the project input comes from. It lacks key invocation details such as overwrite semantics, output directory behavior, GitHub interaction, and what the tool returns after scaffolding, leaving meaningful gaps for an agent.
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 50%, and the description adds meaningful context by stating that the project object comes from analyze_gaps or suggest_bridge_projects and that Java is handled via Spring Initializr. However, it does not explain jd_text, overwrite, output_dir, or github_username beyond what the schema already provides, so it only partially compensates for the uncovered parameters.
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 and resource: it generates a runnable starter repository for a bridge project, and enumerates concrete artifacts. It also orients the agent by saying the project should come from analyze_gaps or suggest_bridge_projects, but it does not explicitly distinguish itself from sibling build_application_kit, so it stops just short of a 5.
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?
It implies when to use the tool by instructing 'Pass a project from analyze_gaps or suggest_bridge_projects,' which indicates a prerequisite and likely sequencing. However, it does not state when NOT to use this tool or name an alternative for similar scaffolding tasks, leaving some usage decisions to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_resumeScore resume against JD (ATS simulation)ARead-only
Scores a resume 0–100 against a JD the way keyword-ranking ATS and recruiters do: weighted keyword match, keywords backed by bullets, title alignment, bullet quality (verbs, metrics), structure/parseability, length, and integrity (placeholders, stuffing). Pass candidate_sources to get a truth_check of unverified claims. Accepts a structured resume or plain text.
| Name | Required | Description | Default |
|---|---|---|---|
| resume | No | Structured resume (preferred) | |
| company | No | Company name, if known | |
| jd_text | Yes | Full job description text, including requirements and responsibilities | |
| job_title | No | Exact job title, if known (improves title matching) | |
| resume_text | No | Or plain resume text, e.g. to score the ORIGINAL resume for a before/after comparison | |
| candidate_sources | No | The candidate's original materials. Enables truth_check, which flags claims with no evidence. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true secretarial, so no safety contradiction. The description adds useful behavioral context beyond that: it reveals how scoring works (weighted keywords, title alignment, bullet quality, integrity checks) and discloses the optional truth_check behavior when candidate_sources is provided.
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 front-loaded sentences. The first begins with the action and enumerates concrete scoring factors; the second covers the optional truth_check mode and the two supported input forms. No word is wasted, and each sentence 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 complex tool with nested schemas and no output schema, the description gives the score range and key inputs, and mentions the extra truth_check result. It does not describe the full output structure or breakdown, but an agent has enough information to invoke the tool correctly with jd_text plus either resume or resume_text.
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 100%, and the schema already documents candidate_sources as enabling truth_check and resume_text as supporting plain text. The description mostly restates these facts; it does not add meaningful parameter semantics beyond what the schema provides, so the baseline of 3 applies.
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 opens with a specific action and resource: 'Scores a resume 0–100 against a JD.' It then names the exact scoring dimensions, making the tool's function unambiguous and differentiating it from siblings like analyze_job_description or analyze_gaps, which address different parts of the workflow.
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?
Usage is implied by the purpose statement: you use this when you need an ATS-style resume score against a JD. It provides one conditional instruction ('Pass candidate_sources to get a truth_check') and input format flexibility, but it never explicitly says when not to use it or how to select it over sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_resume_sessionStart resume sessionARead-only
Call this FIRST whenever a user wants a resume built, tailored or checked against a job. Returns the step-by-step playbook, the intake checklist (what to collect from the candidate, including the LinkedIn profile), and ATS formatting rules.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds useful behavioral context by listing the returned artifacts: the step-by-step playbook, intake checklist (including LinkedIn profile), and ATS formatting rules. This is valuable because there is no output schema. No contradiction with annotations.
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, front-loaded with the critical usage instruction ('Call this FIRST') and followed by a compact list of what the tool returns. Every sentence earns its place with no 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?
For a zero-parameter entry-point tool, the description is complete: it states when to call it, what it returns, and what the agent should collect from the candidate. The absence of an output schema is mitigated by the description's explicit enumeration of return contents.
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 and 100% schema coverage, so the baseline is 4. The description appropriately avoids parameter explanation since none exist; there is nothing missing for an agent to call it correctly.
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 uses a specific verb and resource: 'Call this FIRST whenever a user wants a resume built, tailored or checked against a job.' It clearly positions this tool as the resume-session entry point and distinguishes it from the sibling analysis steps by stating what it returns (playbook, checklist, ATS rules).
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?
It explicitly states when to use the tool ('Call this FIRST whenever...') and covers all resume-related intents. It does not explicitly name sibling tools as the alternatives for subsequent steps, but the 'FIRST' framing and the mention of a step-by-step playbook strongly imply the usage flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_bridge_projectsSuggest bridge projectsARead-only
Designs realistic, company-themed portfolio projects that close specific skill gaps in days. Each comes with a stack, a day-by-day build plan, resume bullet templates (fill with real measured numbers), and interview talking points. Use it for more or different project ideas than analyze_gaps returned.
| Name | Required | Description | Default |
|---|---|---|---|
| company | No | ||
| jd_text | Yes | ||
| max_projects | No | ||
| missing_skills | No | Skills to close. Defaults to the JD's must-haves missing from candidate_skills. | |
| candidate_skills | No | Skills the candidate already has |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows this is a safe read-only operation. The description adds no additional behavioral context beyond describing the output (stack, plan, resume bullets, talking points). It does not discuss limitations, side effects, or external dependencies. Since annotations cover the read-only aspect, the description is adequate but not rich, so a 3 is appropriate.
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 concise and front-loaded, stating the core purpose in the first sentence. The second sentence explains the output components and usage context. No wasted words; every sentence 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?
The tool has 5 parameters, 1 required, and no output schema. The description explains the output format (stack, day-by-day plan, resume bullet templates, interview talking points) but does not explain how parameters like company or max_projects influence the output, nor does it clarify the meaning of 'jd_text' or 'missing_skills' beyond what the schema partially covers. The description is adequate for a basic call but lacks detail on parameter usage and return 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?
Schema description coverage is only 40% (only missing_skills and candidate_skills have descriptions). The tool description does not explain parameters like company, jd_text, or max_projects, nor does it clarify how they affect output. With low schema coverage, the description should compensate by explaining parameters, but it does not, leaving 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 tool's purpose: designing realistic portfolio projects that close skill gaps. It specifies the resource (projects), the action (designs), and the context (company-themed, bridging gaps). It also differentiates from sibling analyze_gaps by noting it provides more or different project ideas, making it easy for an agent to distinguish.
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 gives explicit guidance on when to use this tool: for more or different project ideas than analyze_gaps returned. It provides a clear context and references the sibling tool. However, it does not mention when NOT to use it or list other alternatives, so it lacks full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_intakeValidate candidate intakeARead-only
Validates that all primary candidate details are collected (name, email, phone, location, LinkedIn URL, current resume) and cross-checks the resume against the LinkedIn profile text. Returns ready=true only when resume generation may proceed.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Professional email address | ||
| phone | No | Phone number with country code, e.g. +1 415 555 0100 | |
| location | No | City, State/Region, Country — or 'Remote' | |
| full_name | No | Candidate's full name as it should appear on the resume | |
| github_url | No | ||
| target_role | No | Role title the candidate is applying for | |
| career_stage | No | ||
| linkedin_url | No | Public LinkedIn profile URL, e.g. https://www.linkedin.com/in/jane-doe | |
| portfolio_url | No | ||
| additional_context | No | Anything not in the resume: side projects, courses, hackathons, open source, things they can learn quickly | |
| work_authorization | No | e.g. 'US Citizen', 'H-1B transfer', 'Requires sponsorship' | |
| current_resume_text | No | Full text of the candidate's current resume (any format, pasted as text) | |
| willing_to_relocate | No | ||
| years_of_experience | No | ||
| linkedin_profile_text | No | Text of the LinkedIn profile (About, Experience, Skills, Education). Paste it, or use LinkedIn 'More → Save to PDF' and paste the text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, the description adds real behavior: it cross-checks current_resume_text against linkedin_profile_text and withholds ready=true until the primary fields are present. It doesn't describe the failure-mode return, but the annotations already cover side-effect safety.
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 with no filler. The validation behavior and the readiness condition are front-loaded, and every clause contributes meaning.
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 15-parameter validation tool with no output schema, it states what is validated, how the cross-check works, and what ready=true means for the broader workflow. It omits the failure return shape, but the explicit ready=true condition covers the essential contract.
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?
With schema coverage at 67%, the description adds selection logic by identifying which parameters are 'primary' (name, email, phone, location, LinkedIn URL, current resume) and which two fields feed the cross-check. It doesn't clarify the remaining optional parameters, but the schema already documents most of them.
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 opens with a concrete verb and resource: 'Validates that all primary candidate details are collected' and lists the exact checked fields. It also defines the success signal ('Returns ready=true') and ties it to the resume-generation flow, which clearly separates this validation gate from the sibling tools.
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 gives clear context that this is a pre-flight gate before resume generation ('Returns ready=true only when resume generation may proceed'). It doesn't explicitly name alternatives or say when to skip it, but the intended position in the workflow is clear.
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.
2 tool updates
v0.2.0- Added
build_application_kit - Added
scaffold_bridge_project
7 tool updates
v0.1.0- First observed
analyze_gaps - First observed
analyze_job_description - First observed
render_resume - First observed
score_resume - First observed
start_resume_session - First observed
suggest_bridge_projects - First observed
validate_intake
TDQS
Scored across 9 tools
Each tool maps to a distinct stage in the resume workflow: intake, JD analysis, gap analysis, scoring, rendering, and application kit assembly. The only slight overlap is analyze_gaps and suggest_bridge_projects both proposing bridge projects, but their roles are differentiated enough in the descriptions.
All tool names follow a consistent verb-first snake_case pattern with clear action nouns like analyze, render, score, start, build, scaffold, suggest, and validate. Minor singular/plural variation in bridge_project vs bridge_projects is trivial and does not harm predictability.
Nine tools is well within the optimal range and each one earns its place by covering a distinct phase of the resume tailoring and application process. The set feels intentional rather than padded, and the overall scope is coherent.
The surface covers nearly the full lifecycle: session onboarding, intake validation, job description parsing, gap analysis, project ideation/scaffolding, scoring, rendering, and application kit generation. The main gap is the lack of an explicit tool for editing/updating resume content between gap analysis and rendering, which likely depends on external state.
Maintenance
Related MCP Connectors
Lint, match, and tailor resumes against real job postings, and save them to your Zelume account.
Resume builder with native MCP — create and edit resumes from your AI assistant.
AI resume triage for recruiters. Query your candidate pool from Claude or ChatGPT.
Build an ATS-friendly resume and check it against a job description, fully offline.
131
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables AI clients to manage resumes, match job descriptions, and generate tailored PDF resumes.3-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to fetch a master resume, tailor it to a job description, and generate a polished PDF resume using headless Chromium.-
- FlicenseNot gradedqualityDmaintenanceAutomates ATS resume scanning via Jobscan, enabling AI to iteratively scan, analyze gaps, optimize, and rescan resumes against job descriptions to improve match rates.3-
- FlicenseAqualityCmaintenanceEnables tailoring resumes to job descriptions by scraping JDs, applying rules, and generating optimized DOCX resumes.11-