Untapped Resume

io.github.CTF-MaxPublished by GitHub account CTF-Maxv0.3.1Updated Oct 24, 2026

Tailor a resume and portfolio to one job, with evidence

Overview

AI-generated overview

A local MCP server that tailors a resume, portfolio and LinkedIn kit to one job posting, using only evidence from files you supply.

What you can do
Scan a folder of evidence (Markdown, text, README, DOCX, best-effort PDF, git metadata, LinkedIn export ZIPs) into source-linked excerpts with dates and notes, and read a job posting from pasted text or a URL to extract must-haves, nice-to-haves and employer terms. Render a resume as DOCX, PDF or TXT with a private source map, and render a self-contained portfolio HTML page with scored projects. Run an ATS-style check on the PDF against the job and sources, flagging coverage and provenance or layout issues. The bundled skill guides the agent to write the LinkedIn kit, cover letter, match table and a 1–4 week gap plan locally.
When to use it
Use it when applying to a specific job and you want a resume and portfolio grounded in evidence you already have, with missing qualifications left as explicit gaps rather than invented. Suited to people who keep project notes, READMEs or a LinkedIn export and want source-checked output they review and upload themselves.
Requirements
Runs locally over stdio as a Python 3.10+ process (standard library only); Python must be on the host PATH. Install from the Untapped Plugins marketplace in Codex or Claude Code, or point a local MCP configuration at server/resume_server.py. No account, key, quota or payment; no environment variables or credentials. Only the job-posting fetch uses the network.
Before you install
Output files have fixed names and are replaced in the chosen directory, so use a separate output folder per job. The portfolio HTML and source maps contain local paths and evidence; keep source maps private and upload only the reviewed index.html. Citations are not proof, so check attribution, dates, metrics and ownership yourself. PDF output is limited to Windows-1252 text, and PDF reading is best effort without OCR.

Installation

In SourceWeft

  1. Open Untapped Resume in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Untapped Resume

Build a resume, portfolio and LinkedIn kit for one job using evidence you already have. Tailored, never invented: missing qualifications stay no evidence yet and go into a practical gap plan.

Free, local, Python 3.10 or newer, standard library only. No account, licence key, monthly quota or payment. The plugin cannot post to LinkedIn; paste + upload takes about 2 minutes. It does not guarantee interviews.

No promotion in your documents

Everything it writes for you (resume, portfolio page, LinkedIn kit, cover letter, gap plan) contains only your own evidence and the job's wording. It adds no ads, no affiliate links, no links to us and no "made by" or credit line, for Find Untapped Growth or anyone else. Find Untapped Growth is named only in this README and the plugin listing, as the maker.

Install and use

Install untapped-resume from the Untapped Plugins marketplace in Codex or Claude Code. Both host manifests and the shared tailor-resume skill are included. Python must be on the host's PATH. The MCPB contains the five tools; plugin installation also includes the guided skill.

For a standalone local MCP configuration, run python with the absolute path to server/resume_server.py as its argument. No environment variables or credentials are required. The server speaks JSON-RPC on stdio; do not launch it as a web server. You can try: “Tailor my resume to this job using this project folder.”

Give the agent one job posting, a folder of selected evidence, and an output folder for this job. Supported evidence includes Markdown, text, README files, DOCX, best-effort PDF text, git metadata and LinkedIn export ZIPs containing Positions, Education, Skills, Certifications or Projects CSV files. No repository code is executed. Commit metadata does not prove the applicant's contribution or proficiency.

ToolResult
scan_evidence(folder, max_files=500)Source-linked excerpts, explicit dates and reader notes
read_job(text=...) or read_job(url=...)Stated title/company, must-haves, nice-to-haves and employer terms
render_resume(resume_json, out_dir, formats=["docx","pdf","txt"])Resume files and private sources.json
render_portfolio(portfolio_json, out_dir)Self-contained index.html and private source map
ats_check(pdf_path, job_json, sources_path)Extracted text, coverage and provenance/layout flags

Only read_job can access the network, to fetch the HTTPS posting you supply (20-second request timeout). The other tools operate on local files. The skill guides the agent to write the LinkedIn kit, cover letter, match table and a 1–4 week gap plan locally. See the workflow and JSON contracts. Directory workflows set directory_build=true, which disables the optional internship suggestion.

Source-backed output

Every factual input line has this shape:

json
{  "text": "Built a Python inventory tool.",  "source": {    "source_path": "/absolute/path/project/README.md",    "quote": "Built a Python inventory tool."  }}

resume_json contains a sourced name, optional sourced contact array and a sections object. Section keys are Summary, Experience, Projects, Education, Skills and Certifications; each holds an array of sourced lines. Experience and Projects default to bullets; set bullet:false for a role/date label. The renderer refuses missing sources on any factual line, not just bullets. The source map records wrapped lines and output hashes. The checker reads sources again and flags missing quotes and unsupported words. A citation is not proof: the agent must still check attribution, meaning, dates, metrics and ownership.

portfolio_json has sourced name, optional sourced intro, and projects. Each project has a sourced title, sourced bullets, a numeric fit_score from 0–100, and optional sourced fit_reason. The three highest scores lead, with fewer if there are fewer evidenced projects. The score is supplied by the agent for ordering. The HTML has no scripts, linked resources or branding footer. Upload only the reviewed index.html to GitHub Pages or Cloudflare Pages; keep source maps and local paths private.

Limits that stay visible

  • Resume files use a single column, standard Courier fonts and real text. More than one page triggers a warning; content is not silently removed. DOCX pagination can vary with the viewer's font metrics.
  • Built-in PDF output supports Windows-1252 text, including common Western accents. For other scripts it refuses PDF output without replacing characters; use DOCX/TXT and export from Word or LibreOffice.
  • General PDF reading is best effort: no OCR, encrypted text or custom font-map support. Hidden text, images and tagged tables are flagged when detected; arbitrary graphics and untagged tables require review.
  • Coverage uses literal terms found in both the resume and quoted local evidence, not a hiring prediction. Paraphrases may need manual review. Missing input, unknown ownership or an unreadable source is not proof.
  • Input reads are bounded. Large documents/archives and unsupported files may be skipped with notes. Keep job evidence in a small dedicated folder. The scanner never substitutes file times for stated dates.
  • Output files have fixed names and are replaced in the chosen directory. Use a separate directory per job.

Development checks

From the repository root:

text
python -m unittest discover -s plugins/untapped-resume/testspython plugins/tools/sync_shared.py --checkpython plugins/tools/manifests.py --checkclaude plugin validate --strict plugins/untapped-resumepython plugins/tools/build_mcpb.py untapped-resume

Tests use local fixtures and an injected job-page transport; they make no network requests. The vendored MCP transport comes from plugins/shared/mcp_stdio.py via plugins/tools/sync_shared.py.

By Find Untapped Growth · Homepage · MIT licence · Privacy

Source: untapped-resume/README.md at commit 9f1aabb

Tools

0
SourceWeft started this package once in an isolated sandbox, without credentials, to list its tools. That failed: the package type cannot run in the sandbox.

Version history

2
  1. v0.3.1LatestOct 24, 2026
  2. v0.3.0Oct 22, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts