resume-tailor-mcp-server
by Asma-Amin
README.md
# resume-tailor-mcp-server
An MCP server that helps job seekers tailor their resume and generate cover letters against a specific job posting — powered by Claude.
## What it does
Three tools, all backed by the Claude API:
| Tool | Purpose |
|---|---|
| `resume_tailor_analyze_match` | Scores how well a resume fits a job description (0-100), lists matched/missing keywords, strengths, and gaps. Read-only. |
| `resume_tailor_tailor_resume` | Rewrites/reorders an existing resume to better match a job posting — **never invents experience**, only reworks real content. |
| `resume_tailor_generate_cover_letter` | Generates a cover letter from the resume + job description, with adjustable tone. |
## Requirements
- Node.js 18+
- An Anthropic API key (get one at [console.anthropic.com](https://console.anthropic.com))
## Setup
```bash
npm install
npm run build
```
Set your API key:
```bash
export ANTHROPIC_API_KEY="sk-ant-..."
```
## Running
**stdio (for local MCP clients like Claude Desktop, Claude Code):**
```bash
npm start
```
**Streamable HTTP (for remote hosting):**
```bash
TRANSPORT=http PORT=3000 npm start
```
The HTTP server listens on `POST /mcp`.
## Connecting to Claude Desktop / Claude Code
Add to your MCP client config:
```json
{
"mcpServers": {
"resume-tailor": {
"command": "node",
"args": ["/absolute/path/to/resume-tailor-mcp-server/dist/index.js"],
"env": {
"ANTHROPIC_API_KEY": "sk-ant-..."
}
}
}
}
```
## Deploying to Netlify (for a live public endpoint)
The repo already includes `netlify/functions/mcp.ts` and `netlify.toml`, so this is mostly point-and-click.
1. Push this repo to GitHub (e.g. via GitHub Desktop).
2. In Netlify: **Add new site → Import an existing project → GitHub** → select the repo.
3. Build settings: leave the build command empty (nothing to build — Netlify's esbuild bundler compiles the function directly). Publish directory: `public`.
4. In **Site settings → Environment variables**, add `ANTHROPIC_API_KEY` with your key. Never commit this to the repo.
5. Deploy. Your MCP endpoint will be live at:
```
https://<your-site-name>.netlify.app/mcp
```
6. Sanity check it's alive: `https://<your-site-name>.netlify.app/health` should return `{"status":"ok",...}`.
**Known limitation:** Netlify's free-tier synchronous functions time out after 10 seconds. `resume_tailor_tailor_resume` (max 4096 output tokens) can occasionally run longer than that on a slow response. If you hit timeouts in production, either upgrade your Netlify plan (26s+ function timeout) or move to a host without a hard timeout (Render, Fly.io, a small VPS).
Use the MCP Inspector to poke at it without a full client:
```bash
npx @modelcontextprotocol/inspector node dist/index.js
```
Or from the CLI directly:
```bash
npx @modelcontextprotocol/inspector --cli node dist/index.js \
--method tools/call \
--tool-name resume_tailor_analyze_match \
--tool-arg resume_text="..." \
--tool-arg job_description="..."
```
## Design notes
- **No fabrication guardrail**: the tailoring and cover-letter prompts explicitly instruct Claude to never invent experience, employers, or achievements — only rework what's already true in the source resume.
- **Stateless HTTP transport**: each HTTP request gets a fresh server + transport instance, so it scales horizontally without session affinity.
- **Character limits**: resume/JD inputs are capped at 20,000 characters and tool output at 15,000 characters to keep cost and context usage predictable.
## License
MIT — do whatever you want with it.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessSyncing