Resume Assistant MCP
An intelligent, zero-cost MCP server that securely parses local resumes and compares them against live job postings for ATS scoring, skill gap analysis, and interview prep.
README
Resume Assistant MCP
<div align="center">
An intelligent, zero-cost MCP server that securely parses local resumes and compares them against live job postings for ATS scoring, skill gap analysis, and interview prep.
</div>
Architecture
System Flow
graph TD
A[User / Agent] -->|Calls Tool| B(MCP Server)
B -->|parse_resume_local| C{Local Parser}
C -->|Reads PDF/DOCX| D[(Local Disk)]
B -->|fetch_job_description| E{Jina Scraper}
E -->|Fetches URL| F((Job Board/LinkedIn))
B -->|Analytical Tools| G[Heuristic Engine]
C --> G
E --> G
G -->|Returns JSON| A
Sequence: Resume → Job URL → ATS Analysis
sequenceDiagram
participant U as User / Agent
participant M as MCP Server
participant FS as File System
participant Web as Job Board
U->>M: parse_resume_local(file_path)
M->>FS: Read PDF/DOCX
FS-->>M: Raw Resume Text
M-->>U: Return Text
U->>M: fetch_job_description(url)
M->>Web: Scrape Job Text
Web-->>M: Raw Job Text
M-->>U: Return Text
U->>M: calculate_ats_match(resume_text, job_text)
M->>M: Compute Keyword Overlap & Score
M-->>U: ATS Match Results & Missing Skills
Features
| Tool | Description |
|---|---|
parse_resume_local |
Extracts raw text securely from a local PDF, DOCX, TXT, or MD file. |
fetch_job_description |
Scrapes the raw text of a job posting from a URL (e.g. LinkedIn, Greenhouse). |
calculate_ats_match |
Calculates keyword overlap and generates a percentage ATS match score. |
generate_interview_questions |
Generates targeted technical and HR interview questions based on match results. |
get_resume_improvements |
Analyzes resume content (length, metrics, action verbs) and provides actionable tips. |
generate_cover_letter |
Generates a targeted cover letter template injecting candidate-specific matches. |
linkedin_profile_optimizer |
Analyzes LinkedIn profile text and suggests formatting and content improvements. |
skill_gap_analysis |
Compares resume against job to identify missing skills and generate a learning roadmap. |
Quick Start
-
Clone the repository:
git clone https://github.com/rajesh-kayal-dev/resume-assistant-mcp.git cd resume-assistant-mcp -
Install dependencies:
npm install -
Start the development server:
npm run dev -
Run tests:
npm test -
Test with MCP Inspector (or MCPize Playground):
npx @modelcontextprotocol/inspector node dist/index.js # Or using MCPize: mcpize dev --playground
Example Prompts
Copy and paste these prompts into your favorite MCP-compatible AI (like Claude Desktop or the MCPize Playground):
- "Parse my resume at
C:\resumes\my_resume.pdf." - "Fetch the job description from
https://www.linkedin.com/jobs/view/12345/." - "Parse my resume at
resume.pdfand compare it againsthttps://example.com/job. Give me the ATS match score." - "Analyze my resume at
resume.pdfand provide improvement tips." - "Read my resume at
resume.pdfand the job athttps://example.com/job, then generate a custom cover letter." - "Run a skill gap analysis for my resume at
resume.pdfagainst the job description athttps://example.com/job." - "Generate 5 technical interview questions based on my missing skills for the job at
https://example.com/jobusing my resumeresume.pdf." - "Optimize my LinkedIn About section text: 'I am a software engineer looking for a job...'"
API Reference
parse_resume_local
Extract raw text from local files. Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
file_path |
string |
Yes | Absolute or relative path to the local resume file. |
Output:
{
"text": "John Doe\nSoftware Engineer..."
}
Note: Uses unpdf and mammoth for local parsing without external API calls.
fetch_job_description
Scrape job postings from URLs. Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
url |
string |
Yes | The full URL of the job posting. |
calculate_ats_match
Compute ATS Match Score. Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
resume_text |
string |
Yes | The raw parsed text of the candidate's resume. |
job_text |
string |
Yes | The raw text of the job description. |
Output:
{
"match_score": 85,
"matched_keywords": ["react", "typescript"],
"missing_keywords": ["docker", "kubernetes"]
}
skill_gap_analysis
Generate a multi-phase learning roadmap. Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
resume_text |
string |
Yes | Raw resume text. |
job_text |
string |
Yes | Raw job text. |
Project Structure
resume-assistant-mcp/
├── src/
│ ├── index.ts # MCP Server entry point and tool registration
│ ├── tools/ # Pure function logic for all 8 tools
│ │ ├── parse-resume-local.ts
│ │ ├── calculate-ats-match.ts
│ │ └── ...
│ └── lib/ # Shared utilities
│ ├── api-client.ts # Cached scraper
│ └── cache.ts # In-memory caching logic
├── tests/ # Vitest unit tests
├── package.json # Dependencies and scripts
├── mcpize.yaml # Deployment configuration
└── test-mcp.sh # Smoke test script
Deployment
Deploy via MCPize
mcpize deploy
Your server will be instantly available on the MCPize Cloud.
Bare Metal / Docker
You can easily containerize this application by building a standard Node.js Docker image, exposing port 8080, and running npm start.
Roadmap
- Short-term: Improve stopword filtering in the ATS matching heuristic.
- Medium-term: Add native PDF generation to export customized cover letters.
- Long-term: Implement local embeddings/RAG for deeper semantic skill matching instead of exact keyword matching.
Use Cases
- Job Seekers: Automatically tailor resumes and cover letters for hundreds of applications.
- Career Changers: Identify exact skill gaps to bridge between current experience and target roles.
- Students: Get actionable formatting feedback on their first professional resumes.
- Recruiters: Batch-analyze candidates against specific job descriptions to rank them by objective ATS criteria.
- Career Coaches: Generate automated reports and interview prep questions for clients.
FAQ
Q: Does this cost money to run? A: No! The server uses a Zero API Cost strategy. All ATS scoring, parsing, and analysis rely on local regex and string manipulation heuristics rather than expensive LLM endpoints.
Q: Is my resume data sent to OpenAI?
A: No. parse_resume_local reads the file locally on your machine. The text is only sent to an LLM if the AI client you connect the server to decides to pass it in a prompt.
Q: Why isn't my PDF parsing correctly?
A: Ensure it is a text-based PDF. Image-based PDFs (scanned documents) are not currently supported by unpdf.
Q: Why does the job scraper fail on some sites? A: The scraper uses the Jina Reader API, which handles JavaScript-heavy sites well, but certain extremely strict bot-protected sites may block it.
Q: Can I run this without MCPize?
A: Absolutely! It is a standard Express-based HTTP server exposing the official @modelcontextprotocol/sdk.
Q: How accurate is the ATS Match score? A: The heuristic engine strips stopwords and matches alphanumeric keywords. It is a highly effective approximation of older ATS systems but lacks deep semantic understanding (e.g., it won't map "Node.js" to "JavaScript" automatically). This limitation is documented and will be addressed in future roadmap updates.
Q: How do I change the port?
A: Set the PORT environment variable before running the server (e.g., PORT=3000 npm run dev).
Q: Can I add my own tools?
A: Yes! Simply create a new file in src/tools/, write a pure TypeScript function, define the Zod schema, and register it in src/index.ts.
Built with MCPize
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。