ATS Resume Review
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ATS Resume ReviewAnalyze my resume for a backend engineer role and tell me how to improve my ATS score."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ATS Resume Review — MCP Server
An MCP (Model Context Protocol) server for AI-powered resume review and ATS (Applicant Tracking System) scoring, built as a Cloudflare Worker. Designed for LLM-only access — there is no public web UI, no human-facing page, and no accounts. An AI agent (Claude, or any MCP-compatible client) connects, uploads a resume, and receives a structured ATS score and improvement suggestions.
Tags: mcp-server model-context-protocol ats-score resume-parser
resume-analyzer applicant-tracking-system cloudflare-workers typescript
llm-tools ai-agent-tools groq resume-checker job-application-tools
What it does
A single MCP tool, analyze_resume(resume_base64, mime_type?, target_role?, target_location?):
Parses the uploaded resume — PDF (via
unpdf), DOCX (viamammoth), or plain text — capped at 2MB.Scores it deterministically (
src/score.ts): ATS parseability (tables, columns, icon-font glyphs that break real parsers), standard section coverage (experience/education/skills/summary), contact-info detectability, and keyword overlap against the target role. No LLM in this half of the score, so it's reproducible and free to run.Adds qualitative feedback via the Groq API (
openai/gpt-oss-120b) — strengths, specific improvement suggestions, and a short summary. This call is fully decoupled from the score above; if it fails, the score still returns.Persists the submission (parsed text, score breakdown, suggestions) to Cloudflare D1.
Related MCP server: Batcave-MCP
Why MCP, and why LLM-only
This isn't a SaaS product with a landing page — it's infrastructure meant to be
discovered and called by AI agents, the same way a REST API is discovered and
called by other software. MCP is the emerging standard for that: a typed tool
contract an LLM client can introspect (tools/list) and invoke (tools/call)
over a documented transport (Streamable HTTP), without scraping a UI or parsing
HTML. Building this as an MCP server rather than a REST endpoint with a Swagger
page is a deliberate bet on how AI agents will source capabilities going forward.
Architecture
MCP client (AI agent)
│ POST /mcp — JSON-RPC 2.0 over Streamable HTTP
▼
Cloudflare Worker (this repo)
│ shared-secret auth → D1-backed rate limit (5 req/min/IP)
▼
parse (PDF/DOCX/text) → deterministic score → Groq qualitative pass → D1Reached in production only through a same-origin Cloudflare Pages service
binding on a separate site — no public workers.dev URL is exposed. That's a
deployment detail, not a requirement of the code here: point any MCP-compatible
transport at POST /mcp and it works.
Security & reliability engineering
Built as a tool that must survive untrusted third-party input read by an LLM — the resume itself is attacker-reachable content, not a trusted API payload.
Prompt-injection resistant by construction. The resume text is framed strictly as data to evaluate, never as instructions, inside the Groq system prompt — wrapped in explicit delimiters, with an instruction to flag rather than obey anything that looks like a directive. Tool selection and control flow never depend on resume content; only one tool exists. Output is constrained to a
zod-validated JSON schema, so even a successful injection can only emit text that still has to fit{summary, strengths[], suggestions[]}. A secondary heuristic pass (src/injection.ts) flags suspected attempts for audit visibility — defense in depth, not the primary defense.Rate limiting. D1-backed fixed-window counter per client IP, layered under zone-level Cloudflare rate-limiting rules.
Shared-secret auth on top of the network-level access restriction (no public URL), so the tool is authenticated even if network exposure ever changes.
Bounded input. 2MB file-size cap, 50,000-character cap on extracted text, 15-second timeout on the LLM call — all sized to make cost and abuse predictable regardless of what's uploaded.
Deterministic core. The ATS score itself never depends on an LLM call succeeding, being available, or being non-deterministic — only the qualitative suggestions layer does.
Stack
Cloudflare Workers · TypeScript · @modelcontextprotocol/sdk (Streamable HTTP
transport) · Cloudflare D1 · Groq API · zod · unpdf · mammoth
Local development
npm install
npx wrangler devSecrets (never committed):
npx wrangler secret put GROQ_API_KEY # https://console.groq.com
npx wrangler secret put ATS_SHARED_SECRET # any caller must present this
# in X-ATS-Shared-SecretDatabase
npx wrangler d1 create ats-db
npx wrangler d1 execute ats-db --remote --file=migrations/0001_ats_schema.sqlTwo tables: ats_submissions (every analysis) and ats_rate_limits
(fixed-window counters).
Deploy
npx wrangler deployProject layout
src/
index.ts Worker entrypoint — auth, rate limiting, MCP transport wiring
mcp.ts MCP server + the analyze_resume tool definition
parse.ts PDF/DOCX/text extraction
score.ts Deterministic ATS scoring
groq.ts Qualitative suggestions via Groq, injection-safe prompt framing
injection.ts Heuristic prompt-injection detection (audit flag, not a gate)
db.ts D1 writes
ratelimit.ts D1-backed fixed-window rate limiter
migrations/ D1 schemaThis server cannot be deployed
Maintenance
Related MCP Connectors
Score and tailor your CV/resume against a job posting — for AI agents and humans, no-login trial.
Free ATS resume score and job-match checker: scores a resume against a job description.
Agent-readiness scanner (0-5 score), robots.txt + llms.txt generators, managed agent enablement.
Lint, match, and tailor resumes against real job postings, and save them to your Zelume account.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAnalyzes resume text against job descriptions to provide ATS fit scores, missing keywords, and suggestions.MIT
- AlicenseNot gradedqualityBmaintenanceEnables resume review against job descriptions through a three-stage pipeline: match scoring, experience rewriting, and ATS optimization. Supports text or document uploads.1 npmMIT
- AlicenseAqualityCmaintenanceEnables MCP clients to analyze resumes for ATS compatibility, parse job descriptions, get optimization and roast-style critiques, and generate tailored resumes with shareable preview links.641 npmMIT
- FlicenseAqualityCmaintenanceEnables local ATS-style resume scanning against job postings, providing match rates, missing keywords, and edit suggestions through Claude Desktop.5-