mnoomnoo/resume-mcp-server

🏢 Workplace & Productivity
0 Views
0 Installs

🐍 🏠 🪟 🐧 - 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

Quick Install

One-Click IDE Configuration
claude_desktop_config.json
{
  "mcpServers": {
    "mnoomnoo-resume-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "mnoomnoo-resume-mcp-server"
      ]
    }
  }
}
Or

Using an AI coding agent (Claude Code, Cursor, etc.)? Copy a ready-made prompt that tells it to fetch the setup instructions and install this server for you.

Documentation Overview

resume-mcp-server

CI License: GPL v3 Python 3.12+ MCP PyPI resume-mcp-server MCP server

An MCP server that gives Claude (or any MCP client) structured, searchable access to your resume collection — resumes, cover letters, and application materials in .docx, .pdf, .md, or .txt format.

Job seekers accumulate document sprawl fast: multiple resume versions tailored to different roles, cover letter drafts, reference sheets. Manually digging through them to draft a new application is tedious. Point this server at your resume folder and Claude can answer questions like "which of my resumes highlights Kubernetes experience?", "what achievements have I listed across my backend roles?", or "draft a cover letter drawing from my work at Acme Corp" — without you pasting anything.

The server parses each document into structured data (contact info, work history, education, skills, side projects) and exposes 19 tools covering full-text search, skill lookup, company and role queries, achievement mining, education search, collection analytics, and more. Files are watched and re-indexed automatically, so edits to your documents are reflected immediately.


Features

  • Multi-format parsing.docx, .pdf, .md, and .txt documents are parsed into structured data: contact info, work history, education, skills, and side projects.
  • Automatic de-duplication — resumes for the same person across multiple files (e.g. a .docx and a .pdf of the same resume) are matched by email or name and collapsed to the richest copy, so search and analytics aren't skewed by duplicates.
  • Automatic hot-reload — a filesystem watcher re-indexes your documents as soon as they change, no server restart needed.
  • Document type inference — files are automatically classified as resume, cover_letter, application_material, or other based on filename patterns, which can be overridden per category via environment variables.
  • Full-text and structured search — search whole documents with search_resumes, or filter any entity type (skills, work experience, achievements, side projects, education) with a scoped query, technology, or competency parameter.
  • Three search modesand, or, and regex matching, available consistently on every tool that accepts a query-like parameter.
  • Uniform pagination — every list-style tool returns the same total_count / items / has_more / next_offset / message envelope, with validated limit/offset and a 200-item cap.
  • Unified error shape — every failure returns {"error": "..."}, so callers only need to check for one shape regardless of which tool they called.
  • Collection analyticsget_collection_stats and get_skill_frequency surface aggregate counts and cross-resume skill popularity.
  • Read-only and safe by construction — every tool is annotated readOnlyHint / idempotentHint / openWorldHint: false; nothing mutates your files or reaches outside the local document collection.
  • Flexible deployment — run over stdio or HTTP, standalone or via Docker/Docker Compose with CORS support, configured through environment variables or a .env file.

See MCP Tools below for the full list of tools this exposes. For best extraction quality, see the Resume Formatting Guide.


Quick Start

Give Claude structured access to your resume collection. The server parses your documents on startup and exposes 19 tools for searching by name, company, skill, education, side project, or full text, plus analytics tools for skill frequency and collection statistics — with automatic hot-reload when files change.

Try it immediately with the included sample resumes:

pip install resume-mcp-server
RESUME_DIR=./sample_resumes resume-mcp-server

Then connect Claude Code:

claude mcp add resume-mcp-server resume-mcp-server -e RESUME_DIR=$(pwd)/sample_resumes

For a persistent setup with Docker or your own documents, see Docker Deploy or Dev Environment.


Docker Deploy

The recommended way to run the server. Docker Compose exposes the server over HTTP so any AI client can connect to it.

1. Set your resume directory

Copy the example env file and set your documents path:

cp .env.example .env
# then edit RESUME_DIR_HOST in .env

2. Sync the image version (optional)

Stamp the image with the current pyproject.toml version:

python scripts/sync_version.py

3. Build and start

docker compose build resume-mcp
docker compose up -d

The server is now available at http://localhost:8001/mcp.

4. Connect your AI client

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "resume-mcp-server": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    }
  }
}

VS Code (.vscode/mcp.json):

{
  "servers": {
    "resume-mcp-server": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    }
  }
}

Claude Code:

claude mcp add resume-mcp-server --transport http http://localhost:8001/mcp

To add it globally across all projects, add the following to ~/.claude.json instead:

{
  "mcpServers": {
    "resume-mcp-server": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    }
  }
}

Stopping

docker compose down

Docker (stdio)

Run the image directly — no Compose needed — for MCP clients that use stdio transport (including Glama.ai and Claude Desktop):

docker run -i --rm -v /path/to/your/resumes:/resumes resume-mcp-server

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "resume-mcp-server": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-v", "/path/to/your/resumes:/resumes", "resume-mcp-server"]
    }
  }
}

Dev Environment

For local development or running the server without Docker.

Prerequisites

Python 3.12+

Install

pip install .
# include test dependencies:
pip install ".[dev]"

Run

resume-mcp-server
# with a custom directory:
RESUME_DIR=/path/to/docs resume-mcp-server

Or create a .env file in the directory you run the server from:

# .env
RESUME_DIR=/path/to/docs
FASTMCP_PORT=8001

Then just run resume-mcp-server — the .env is loaded automatically. Variables already set in your shell or by the MCP client always take precedence over .env values.

Connect your AI client (stdio)

Claude Desktop:

{
  "mcpServers": {
    "resume-mcp-server": {
      "command": "resume-mcp-server",
      "env": {
        "RESUME_DIR": "/path/to/your/resumes"
      }
    }
  }
}

If resume-mcp-server is not on your PATH, use the full path (e.g. ~/.venv/bin/resume-mcp-server).

Claude Code:

claude mcp add resume-mcp-server resume-mcp-server -e RESUME_DIR=/path/to/your/resumes

uvx:

{
  "mcpServers": {
    "resume-mcp-server": {
      "command": "uvx",
      "args": ["resume-mcp-server"],
      "env": {
        "RESUME_DIR": "/path/to/your/resumes"
      }
    }
  }
}

Configuration

Docker Compose (.env):

VariableDescription
RESUME_DIR_HOSTPath on your machine to the documents directory — mounted to /resumes inside the container
FASTMCP_PORTPort the HTTP server listens on (default 8001)
LOG_LEVELLogging verbosity: DEBUG, INFO, WARNING, ERROR (default INFO)

Local run (environment variables or .env):

VariableDefaultDescription
RESUME_DIR~/resumesDirectory scanned for documents
FASTMCP_TRANSPORThttp (local) / stdio (Docker image)Transport protocol (http or stdio)
FASTMCP_HOST0.0.0.0Bind address
FASTMCP_PORT8001Port the HTTP server listens on
DOC_TYPE_PATTERN_RESUMEresumeRegex used to classify a filename as resume
DOC_TYPE_PATTERN_COVER_LETTERcover.?letter|_cl\.|_cl_|coverletterRegex used to classify a filename as cover_letter
DOC_TYPE_PATTERN_APPLICATION_MATERIALinterview|study.?guide|why_|application.?question|job.?descRegex used to classify a filename as application_material

A .env file in the working directory is loaded automatically on startup if present. Shell environment variables and values set by the MCP client always take precedence over .env values.

Each DOC_TYPE_PATTERN_* variable replaces the default regex for that category (filenames are matched in order: resume, then cover letter, then application material, then everything else falls back to other). Leave a variable unset to keep its default; an invalid regex is ignored and the default is used instead.

The server scans RESUME_DIR recursively on startup and reloads automatically when files change.

Document type inference

Types are inferred from filenames:

TypeFilename patterns
resumecontains resume
cover_lettercover letter, _cl., coverletter
application_materialinterview, study guide, why_, application question, job desc
othereverything else

Each of the three regexes can be overridden with DOC_TYPE_PATTERN_RESUME, DOC_TYPE_PATTERN_COVER_LETTER, and DOC_TYPE_PATTERN_APPLICATION_MATERIAL — see Configuration.


Search behavior

Most tools that accept a query (or technology/competency) parameter split it on whitespace and support three match modes via the optional mode parameter:

modeBehavior
"and" (default)All tokens must appear within the same field. "latency throughput" only matches a description that contains both words.
"or"Any token is sufficient. "latency throughput" matches a description that contains either word.
"regex"The query is compiled as-is (not tokenized or escaped) into a case-insensitive regular expression and matched against the field. Use this for grep-style power — alternation, wildcards, anchors, etc., e.g. "eng(ineer)?" or `"aws

Multi-field note: For tools that search several fields (company name, position title, achievement text, etc.), AND mode requires all tokens to co-occur in the same field, not spread across fields. Use OR mode when you want a looser cross-field match. Regex mode also matches per-field.

Single-word queries behave identically in and/or mode.

Every tool that accepts a query-like parameter — including search_resumes, the whole-document keyword search — shares this same "and"/"or"/"regex" vocabulary.

search_resumes_by_skill accepts either a single skill string or a list of skills. For a list, mode does double duty: it also controls whether a resume must match EACH skill in the list ("and") or ANY skill ("or"); "regex" mode combines multiple skills with OR semantics.

An empty query or an empty skill list returns {"error": "..."} rather than an empty result — this distinguishes a caller mistake from a legitimate zero-match search.


Pagination

All list_* tools (and search_resumes/search_resumes_by_skill) accept limit and offset parameters and return a consistent envelope:

{
  "total_count": 247,
  "items": [...],
  "has_more": true,
  "next_offset": 100,
  "message": "100 of 247 results shown. Call again with offset=100 to see more."
}

total_count is the full match count before slicing. has_more and next_offset tell you directly whether to page further — no need to compute offset + len(items) < total_count yourself — and message restates that in plain language, ready to act on. When there's nothing left, has_more is false, next_offset is null, and message reads "All N results shown.".

limit must be greater than 0 and offset must be 0 or greater — otherwise the tool returns {"error": "..."}. An offset beyond the total result count is not an error; it's a valid "past the end" page (items: [], has_more: false).

Cap and defaults. limit is silently capped at 200 regardless of what's requested — if you ask for more, the response still comes back (not an error), but message is prefixed with "Requested limit N capped to 200." so you know it happened. Default limit varies by tool, generally lower for heavier, deeply-nested responses:

ToolDefault limit
list_resumes10 (each item is a fully nested resume)
list_work_experiences, list_side_projects, list_education25
list_achievements50
list_resume_summaries, list_skills, search_resumes, search_resumes_by_skill100
get_skill_frequency20 (not part of the pagination envelope, but shares the same 200 cap)

Error handling

Every tool returns a dict. On failure, the dict is exactly {"error": "<message>"} — this is the only failure shape in the API, so a caller can check for the "error" key regardless of which tool it called. This covers: not-found IDs, a resume_id filter that doesn't match any resume, invalid regex patterns, and invalid limit/offset values. A resume_id filter that does match a resume but simply has zero matching child records (e.g. list_work_experiences(resume_id=<valid>) for someone with no work history) is not an error — it returns an empty items list.

get_resume's success shape is {"text": "..."} so that success and failure are both dicts, distinguishable by key.


MCP Tools

19 tools are exposed, covering full-text search, skill lookup, company and role queries, achievement mining, education search, collection analytics, and more. Every tool is read-only (readOnlyHint: true) — none mutate state or reach outside the local document collection (openWorldHint: false).

ToolDescription
list_resume_summariesLightweight identity records (id, name, email, phone) for orienting before fetching details; optional query filters by name
get_resume_profileA resume's top-level fields (contact info, statement, education) without nested lists
get_resume_fullA resume's complete nested structure (work experiences, skills, side projects, education) in one call
list_resumesList all documents, optionally filtered by type
get_resumeFull extracted text of a document, keyed by path (not resume_id)
search_resumesFull-text search across all documents, sorted by match count
list_skillsList badge skills, optionally scoped to a resume and/or filtered by title
get_badge_skillA single badge skill by ID
search_resumes_by_skillFind which resumes list one or more given badge skills (accepts a string or a list)
get_skill_frequencyBadge skills ranked by how many resumes list them
list_work_experiencesList work experiences, optionally scoped to a resume, current-only, and/or a keyword query
get_work_experienceA single work experience entry with its achievement bullets
list_achievementsList achievement bullets, optionally scoped to a resume and/or a keyword query
get_achievementA single achievement bullet by ID
list_side_projectsList side projects, optionally scoped to a resume and/or matched by keyword or technology
get_side_projectA single side project by ID, including demonstrated technologies
list_educationList education entries, optionally scoped to a resume and/or matched by keyword or competency
get_educationA single education entry by ID, including its competencies
get_collection_statsAggregate counts and averages across the entire loaded collection

See docs/TOOLS.md for full parameter tables and return shapes for every tool.

Related MCP Servers

6figr-com/jobgpt-mcp-server

📇 ☁️ 🏠 🍎 🪟 🐧 - MCP server for JobGPT — search jobs, auto-apply, generate tailored resumes, track applications, and find recruiters from any MCP client. 34 tools for job search, applications, resumes, and outreach.

🏢 Workplace & Productivity0 views
Agentled/mcp-server

📇 ☁️ - AI-native workflow orchestration with long-term memory, 100+ integrations, and unified credits. 32 MCP tools for building and running intelligent business workflows — lead enrichment, content publishing, company research, media production, and more. Knowledge Graph that learns across executions.

🏢 Workplace & Productivity0 views
alex13slem/openproject-codex-plugin

📇 ☁️ 🏠 🍎 🪟 🐧 - Write-capable MCP server for OpenProject API v3 with Community Edition support. Search, create, update, assign, prioritize, and comment on work packages. Published as io.github.alex13slem/openproject in the official MCP Registry and installable with npx -y openproject-codex-plugin.

🏢 Workplace & Productivity0 views
ap311036/ews-meeting-mcp

🐍 🏠 🍎 🪟 🐧 - Safely schedule Outlook meetings on on-prem Exchange EWS. Resolves attendees, discovers rooms, suggests slots, and requires preview-confirmed create/update/cancel writes with local credential handling and audit-friendly lifecycle records.

🏢 Workplace & Productivity0 views

Engagement

Views
0
Installs
0
Upvotes
0

Views and upvotes are unique per visitor network (hashed IP). Installs count copy actions.

Status

Health: Not checked yet

We have not completed a health check for this listing yet.

No check timestamp yet.

Unclaimed listing (imported or pending owner verification). Claim it →
★ Spotlight Slot

Feature Your MCP Server

Get maximum visibility for your server across our directory, search results, and detail pages.

Spotlight Your Server

Own this project?

This directory is pre-filled from public sources. Claim via GitHub README, site badge, or DNS TXT to get the verified badge and attach your website.

Claim this listing

Promote this listing

Optional paid placement. Free listings stay free forever.

Share & Embed

Add our SVG badge (dark/light directory styles) or embeddable widget to your site.