Skip to main content
Glama
Asma-Amin
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.