Skip to main content
Glama
Vishu-ak

resumeforge

by Vishu-ak

ResumeForge MCP

CI License: MIT Glama MCP server

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_check that 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 [N] metrics are blocked

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

start_resume_session

Returns the playbook, the intake checklist, and ATS rules. The AI calls this first.

validate_intake

Hard gate. Requires name, email, phone, location, a LinkedIn /in/ URL, and the current resume. Cross-checks resume ↔ LinkedIn (roles, dates, name), finds skills that are on LinkedIn but missing from the resume, and estimates years of experience and career stage.

analyze_job_description

Weighted keywords (must-have / nice-to-have / contextual) with the exact ATS phrasing to mirror (Amazon Web Services (AWS)), ranked focus points, seniority, years, education, certifications, domain terms, verbs to mirror, and implied expectations.

analyze_gaps

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.

suggest_bridge_projects

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.

score_resume

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.

render_resume

Requires candidate_approved: true and a valid LinkedIn URL, and refuses unfilled [N] placeholders. Outputs DOCX, PDF (auto-fit to 1 page), Markdown, TXT, plus LinkedIn alignment suggestions and the final score.

build_application_kit

Everything needed to actually apply (see below). Saves Application_Pack.md + Cover_Letter.docx next to the resume, and can log the application to applications.csv.

scaffold_bridge_project

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 applications.csv once submitted

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 npx downloads 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 from which npx. Or clone the repo, run npm 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): Deploy to Render

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: /health
  • claude.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:

  1. Name, email, phone, location

  2. LinkedIn URL and profile content. Paste it, or use LinkedIn → More → Save to PDF.

  3. Your current resume

  4. The job description

  5. (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 server

Releasing: 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 output

Contributing

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 tools
analyze_gapsAnalyze candidate vs JD gapsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
companyNoCompany name, if known
jd_textYesFull job description text, including requirements and responsibilities
job_titleNoExact job title, if known (improves title matching)
resume_textYesCandidate's current resume text
career_stageNo
linkedin_textNo
additional_contextNo
years_of_experienceNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 descriptionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
companyNoCompany name, if known
jd_textYesFull job description text, including requirements and responsibilities
job_titleNoExact job title, if known (improves title matching)

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
postedNoWhen it was posted, e.g. '3 days ago' or '2026-09-20'
resumeNoThe final tailored resume (strongly recommended)
companyNoCompany name, if known
jd_textYesFull job description text, including requirements and responsibilities
job_urlNoPosting URL. Used to detect the application portal and tailor tips.
candidateYes
job_titleNoExact job title, if known (improves title matching)
output_dirNo
save_filesNoLocal mode: save Application_Pack.md and Cover_Letter.docx next to the resume
log_applicationNoAppend to applications.csv. Set true only after the candidate confirms they submitted.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 filesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoUsed in the file name
resumeYes
companyNoUsed in the file name
formatsNo
jd_textNoIf provided, includes the final ATS score
max_pagesNo
output_dirNoLocal mode only. Defaults to ~/ResumeForge or $RESUMEFORGE_OUTPUT_DIR
candidate_sourcesNoThe candidate's original materials. Enables truth_check, which flags claims with no evidence.
candidate_approvedYestrue only after the candidate reviewed and approved the final content

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
jd_textNoUsed to name routes after the company's domain
projectYes
languageNoDefaults to the stack's main language
overwriteNo
output_dirNoLocal mode: parent folder. Defaults to ~/ResumeForge/projects
github_usernameNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

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

Usage Guidelines3/5

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)A
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
resumeNoStructured resume (preferred)
companyNoCompany name, if known
jd_textYesFull job description text, including requirements and responsibilities
job_titleNoExact job title, if known (improves title matching)
resume_textNoOr plain resume text, e.g. to score the ORIGINAL resume for a before/after comparison
candidate_sourcesNoThe candidate's original materials. Enables truth_check, which flags claims with no evidence.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 sessionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 projectsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
companyNo
jd_textYes
max_projectsNo
missing_skillsNoSkills to close. Defaults to the JD's must-haves missing from candidate_skills.
candidate_skillsNoSkills the candidate already has

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 intakeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNoProfessional email address
phoneNoPhone number with country code, e.g. +1 415 555 0100
locationNoCity, State/Region, Country — or 'Remote'
full_nameNoCandidate's full name as it should appear on the resume
github_urlNo
target_roleNoRole title the candidate is applying for
career_stageNo
linkedin_urlNoPublic LinkedIn profile URL, e.g. https://www.linkedin.com/in/jane-doe
portfolio_urlNo
additional_contextNoAnything not in the resume: side projects, courses, hackathons, open source, things they can learn quickly
work_authorizationNoe.g. 'US Citizen', 'H-1B transfer', 'Requires sponsorship'
current_resume_textNoFull text of the candidate's current resume (any format, pasted as text)
willing_to_relocateNo
years_of_experienceNo
linkedin_profile_textNoText of the LinkedIn profile (About, Experience, Skills, Education). Paste it, or use LinkedIn 'More → Save to PDF' and paste the text.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 2 tool updatesv0.2.0
    • Addedbuild_application_kit
    • Addedscaffold_bridge_project
  2. 7 tool updatesv0.1.0
    • First observedanalyze_gaps
    • First observedanalyze_job_description
    • First observedrender_resume
    • First observedscore_resume
    • First observedstart_resume_session
    • First observedsuggest_bridge_projects
    • First observedvalidate_intake

TDQS

A4/5.0

Scored across 9 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers