
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
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.
Installation
In SourceWeft
- Open Untapped Resume in the dashboard and add it to a workspace.
- 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.
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:
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:
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
0Version history
2- v0.3.1LatestOct 24, 2026
- 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