CompleteMCP
# CompleteMCP — Self-Contained Resume MCP Server
A fully self-contained MCP server for tailoring resumes to job descriptions. Unlike a bare server, this bundle ships **everything** that drives output quality so results reproduce on any machine:
- The MCP server (scrape JD → tailor → validate → build DOCX)
- The full tailoring **rules** (`rules.md`, served by `get_tailoring_rules`)
- The candidate **base resume** (`base_resume.json`)
- The resume/JD **skills** (`skills/`, served by `list_skills` / `get_skill`)
- Seed **memory** summaries (`memory/`) and golden **examples** (`examples/`)
Requires **Node.js 20+**.
## Setup
```bash
cd CompleteMCP
npm ci # or: npm install
cp .env.example .env # then edit .env and add your Firecrawl API key
```
A Firecrawl API key (https://firecrawl.dev) is only needed for scraping JDs by URL. You can also paste JD text directly via the `text` parameter with no key.
## Register with Cursor
Add to `~/.cursor/mcp.json` (or a project-level `.cursor/mcp.json`):
```json
{
"mcpServers": {
"resumemaker": {
"command": "node",
"args": ["/Users/sriman/Desktop/Code/CompleteMCP/index.js"]
}
}
}
```
### Claude Desktop (`claude_desktop_config.json`)
```json
{
"mcpServers": {
"resumemaker": {
"command": "node",
"args": ["/Users/sriman/Desktop/Code/CompleteMCP/index.js"]
}
}
}
```
### Codex CLI
```bash
codex mcp add resumemaker -- node /Users/sriman/Desktop/Code/CompleteMCP/index.js
```
## Tools (11)
| Tool | Input | Output |
|---|---|---|
| `get_jd` | `{url}` \| `{text}` \| `{file_path}` (+ optional `slug`) | JD content, slug, filter result, output paths |
| `get_base_resume` | `{}` | Base resume + per-job bullet counts |
| `set_base_resume` | `{resume_json}` | Replace the base resume (new source of truth) |
| `get_tailoring_rules` | `{}` | The full ruleset from `rules.md` |
| `list_skills` | `{}` | Bundled skills + short descriptions |
| `get_skill` | `{name}` | Full `SKILL.md` for one skill |
| `save_tailored_resume` | `{slug, resume_json}` | Save JSON to `data/` |
| `validate_resume` | `{json_path}` | Identity / fabrication / hedging / bullet-count check |
| `build_docx` | `{json_path}` | Build the DOCX |
| `list_jds` | `{}` | List saved JDs |
| `list_resumes` | `{}` | List tailored JSONs + DOCXs |
## Agent workflow
```
get_tailoring_rules() → read the rules
get_base_resume() → read base + bullet counts
list_skills() / get_skill() → load technique (esp. resume-tailor-fabricator)
get_jd({url|text|file_path}) → scrape/load + filter the JD
[tailor the resume JSON] → the AI step
save_tailored_resume({...}) → write to data/
validate_resume({json_path}) → must PASS
build_docx({json_path}) → generate DOCX
```
## Layout
```
CompleteMCP/
index.js MCP stdio server (11 tools)
rules.md Full tailoring rules (served by get_tailoring_rules)
base_resume.json Candidate base resume (source of truth)
AGENTS.md Agent startup instructions
lib/ scraper.js, validator.js, builder.js, docx-helpers.js
skills/ Bundled resume/JD skills (each a SKILL.md)
memory/ Seed summaries of past tailorings
examples/ Golden JD + tailored-JSON pairs
jds/ data/ resumes/ Generated output (gitignored, auto-created)
```
All data stays local. `data/`, `jds/`, and `resumes/` are gitignored so every clone starts with empty output folders.
TDQS
Scored across 11 tools
Each tool has a distinct, non-overlapping purpose. For example, get_jd handles JD input, list_jds lists saved JDs, and get_base_resume vs set_base_resume are clearly separate for reading vs writing the base resume.
All tools use a consistent verb_noun snake_case pattern (e.g., get_jd, set_base_resume, validate_resume). Minor plural/singular variations (list_jds vs get_skill) do not detract from overall predictability.
11 tools cover the core resume tailoring workflow without unnecessary extras. The count is well-scoped for the domain, offering enough granularity without being overwhelming.
The tool surface covers the full pipeline from JD acquisition to DOCX generation, with validation and listing. However, a tool to retrieve the content of a saved tailored resume is missing, which may force file-level access.