# mnoomnoo/resume-mcp-server [Health: Active]

**Category:** 🏢 Workplace & Productivity  
**Repository:** https://github.com/mnoomnoo/resume-mcp-server  
**GitHub Stars:** 1  
**Views:** 3  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/mnoomnoo-resume-mcp-server

## Description
MCP server for searching and retrieving structured information from local resume and job application documents (.docx, .pdf, .md, .txt) with auto hot-reload. 21 tools for full-text search and filtering by skill, company, and education, plus structured extraction of work experience, achievements, badge skills, and side projects. pip install resume-mcp-server

## Tools
Capabilities this server exposes over MCP:

- **list_resume_summaries** — List resumes as lightweight identity records — id, name, email, phone only.
Use this to orient and pick a resume_id before fetching details with other tools.
Much more token-efficient than list_resumes when you only need to identify who is present.
Pass query to filter by first or last name (absorbs the old search_resumes_by_name tool).
Response includes total_count and items for pagination.
- **get_resume_profile** — Get a resume's top-level fields (contact info, professional statement, education)
without the nested work experience and badge skill lists.
See also: get_resume_full for everything about this resume in one call.
Returns {"error": ...} if resume_id is not found.
- **get_resume_full** — Get a resume's complete nested structure in one call: profile fields plus all
work experiences (with achievements), badge skills, side projects (with technologies),
and education entries (with competencies).
Prefer get_resume_profile plus the scoped list_* tools (list_work_experiences,
list_skills, list_side_projects, list_education) when you only need part of this —
it's more token-efficient. Use get_resume_full when you need the whole picture at once.
Returns {"error": ...} if resume_id is not found.
- **list_resumes** — List all documents. When doc_type is 'resume' (or omitted), structured resume data
is returned if available; otherwise flat file metadata is returned.
Response includes total_count and items for pagination.
See also: list_resume_summaries for a lighter-weight, more token-efficient listing;
get_resume_full for one resume's full nested structure by resume_id.
- **get_resume** — Return the full extracted text of a document, as {"text": "..."}.
Note: takes a file path (see list_resumes), not a resume_id — use get_resume_profile
or list_resumes to fetch structured data by resume_id instead.
Returns {"error": ...} if path is not found.
- **search_resumes** — Search across all documents for a keyword or phrase.
Response includes total_count, items, has_more, next_offset, and message for pagination.
- **search_resumes_by_skill** — Find which resumes list one or more given badge skills. Returns resume identity and matched
skill names only — more token-efficient than list_resumes when filtering by skill.
Accepts either a single skill string or a list of skills to filter by multiple at once.

Each result includes: id, first_name, last_name, matched_skills.
Response includes total_count, items, has_more, next_offset, and message for pagination.
- **list_work_experiences** — List work experiences, optionally filtered to a specific resume, only current roles,
and/or a keyword query matched against company name, position title, or achievement
descriptions (absorbs the old search_work_experiences tool).
Each result includes a resume_id field identifying which resume the experience belongs to.
Response includes total_count and items for pagination.
Returns {"error": ...} if resume_id is given but not found.
- **get_work_experience** — Get a single work experience entry with its achievements.
Returns {"error": ...} if id is not found.
- **list_achievements** — List achievements (resume bullet points), optionally filtered to a specific resume
and/or a keyword query matched against the achievement text (absorbs the old
search_achievements tool).

Response shape depends on the arguments given, to keep the common case cheap:
- resume_id given, query omitted: bare {id, desc} per item (cheapest — you already
  know which resume these belong to).
- query given, and/or resume_id omitted: each item also includes company_name,
  position_title, work_experience_id, and resume_id, since that context would
  otherwise be unrecoverable from the achievement alone.
Response includes total_count and items for pagination.
Returns {"error": ...} if resume_id is given but not found.
- **get_achievement** — Get a single achievement (phrase skill) by ID.
Returns {"error": ...} if id is not found.
- **list_skills** — List badge skills (technologies, tools, languages), optionally filtered to a resume
and/or a keyword query matched against the skill title (absorbs the old search_skills tool).
Note: badge skills are deduplicated and shared across resumes by title, so — unlike
work experiences, side projects, and education — items here do not carry a resume_id.
Response includes total_count and items for pagination.
Returns {"error": ...} if resume_id is given but not found.
- **get_badge_skill** — Get a single badge skill by ID.
Returns {"error": ...} if id is not found.
- **list_side_projects** — List side projects (personal/portfolio projects, distinct from work experience),
optionally filtered to a resume and/or matched by keyword or technology
(absorbs the old search_side_projects and search_side_projects_by_technology tools).

- If technology is given, projects are matched against technology names only, and each
  result uses a lighter shape: id, name, description, matched_technologies, resume_id.
- Else if query is given, projects are matched against name, description, or technology
  names, and each result includes the full nested structure plus resume_id.
- If both are given, technology takes precedence and query is ignored.
- If neither is given, today's plain listing behavior applies.
Response includes total_count and items for pagination.
Returns {"error": ...} if resume_id is given but not found.
- **get_side_project** — Get a single side project by ID, including the technologies it demonstrates.
Returns {"error": ...} if id is not found.
- **list_education** — List education entries (degree, institution, year, and relevant coursework/competencies),
optionally filtered to a resume and/or matched by keyword or competency
(absorbs the old search_education and search_education_by_competency tools).

- If competency is given, entries are matched against competency names only, and each
  result uses a lighter shape: id, institution, degree, year, matched_competencies, resume_id.
- Else if query is given, entries are matched against institution, degree, or competency
  names, and each result includes the full nested structure plus resume_id.
- If both are given, competency takes precedence and query is ignored.
- If neither is given, today's plain listing behavior applies.
Response includes total_count and items for pagination.
Returns {"error": ...} if resume_id is given but not found.
- **get_education** — Get a single education entry by ID, including its competencies.
Returns {"error": ...} if id is not found.
- **get_collection_stats** — Return aggregate counts and averages across the entire loaded resume collection.

Returns total_resumes, total_work_experiences, total_unique_skills, total_side_projects,
total_education_entries, total_achievements, avg_skills_per_resume,
avg_work_experiences_per_resume.
Example: get_collection_stats()
- **get_skill_frequency** — Return badge skills ranked by how many resumes list them, in descending order.

Useful for identifying the most common technologies across all candidates.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `uvx` (confidence: high):

```json
"mcpServers": {
  "resume-mcp-server": {
    "command": "uvx",
    "args": ["resume-mcp-server"]
  }
}
```

## Documentation

## What mnoomnoo/resume-mcp-server MCP server does

The mnoomnoo/resume-mcp-server MCP server turns a local directory of resume and job-application documents into searchable MCP resources. It accepts `.docx`, `.pdf`, `.md`, and `.txt` files, extracts resume-oriented fields, and preserves both document text and structured records where available. Extracted data includes contact details, professional statements, work experience, achievements, badge skills, side projects, education, and related competencies.

The server is suited to collections containing multiple resume versions, cover letters, reference material, and other application documents. It can identify resumes by lightweight identity fields, retrieve complete or partial profiles, search document text, and filter structured entities by terms such as skill, company, role, technology, competency, or education. It also provides aggregate collection counts, average values, and skill-frequency rankings.

## How it works

On startup, the server scans the configured document directory and builds an in-memory collection. A filesystem watcher re-indexes files when they change, so edits can be reflected without restarting the process. Files are classified as resumes, cover letters, application materials, or other documents using filename patterns; the README states that these classifications can be overridden through environment variables.

The mnoomnoo/resume-mcp-server MCP server uses resume IDs for structured lookups and file paths for full extracted-text retrieval. List operations return pagination metadata, including total counts and offsets where applicable. Query-style tools support consistent matching modes described by the project as `and`, `or`, and regular-expression matching. Responses use a common error object when a requested ID, path, or resume cannot be found.

Duplicate versions for the same person are matched by email or name and reduced to the richest available copy. Tools are read-only and are described as operating only on the local document collection; they do not modify source files.

## Setup and configuration

Install the package with `pip install resume-mcp-server`, then run the `resume-mcp-server` executable. The quick-start configuration sets `RESUME_DIR` to the directory containing documents. If it is not supplied, the documented local default is `~/resumes`.

The server can communicate over stdio or HTTP. `FASTMCP_TRANSPORT` selects the transport, while `FASTMCP_HOST` and `FASTMCP_PORT` configure HTTP binding and port. The README documents `FASTMCP_PORT` as defaulting to `8001`. A `.env` file may provide configuration, with shell or MCP-client values taking precedence. Docker Compose can mount a host directory and expose the HTTP endpoint at `/mcp`.

## Tools and capabilities

The mnoomnoo/resume-mcp-server MCP server includes tools for:

- Listing lightweight resume identities or complete document metadata.
- Retrieving profile-only, full nested, or raw extracted-text results.
- Searching all documents with keywords or phrases.
- Finding resumes by badge skill.
- Listing and retrieving work experiences and achievements.
- Listing and retrieving skills, side projects, and education entries.
- Filtering projects by technology and education by competency.
- Reporting collection statistics and skill frequency.

Scoped list tools can return smaller result shapes when only identifiers or matching fields are needed, which helps limit response size for agent workflows.

## Limitations and notes

The server depends on the quality and structure of the source documents. The README points to a resume-formatting guide for better extraction results. Structured lookup and raw text retrieval use different identifiers, so callers should first inspect the listing or profile response before requesting details. The project requires Python 3.12 or newer for local development and execution.

_Full upstream README: https://allmcps.com/mcp/mnoomnoo-resume-mcp-server/readme_

