job-mcp
# job-mcp
A FastMCP server (stdio transport) with:
- **Resource** `cv://profile` — your CV/resume as JSON, for the LLM client to read.
- **Tool** `send_email` — sends an email over SMTP using [Red Mail](https://red-mail.readthedocs.io/).
Workflow: you give the MCP client a job post + the recruiter's email in chat → the client
reads `cv://profile` → drafts a tailored application email → calls `send_email` to send it.
## 1. Install
```bash
cd job-mcp
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
```
## 2. Configure SMTP credentials
```bash
cp .env.example .env
```
Edit `.env` with your SMTP host/credentials. For Gmail, use an
[App Password](https://myaccount.google.com/apppasswords) (not your normal login password),
and enable 2-Step Verification first.
## 3. Fill in your CV
Edit `src/job_mcp/data/cv.json` with your real details (contact info, skills, experience,
education, projects, certifications). The resource just reads this file as-is.
## 4. Run the server standalone (sanity check)
```bash
python -m job_mcp.server
```
It will sit waiting for MCP JSON-RPC messages on stdin/stdout (this is normal — it's
meant to be launched by an MCP client, not used interactively).
You can also inspect it with the MCP dev inspector:
```bash
mcp dev src/job_mcp/server.py
```
## 5. Connect it to an MCP client
Example config for a client that launches servers over stdio (e.g. Claude Desktop's
`claude_desktop_config.json`):
```json
{
"mcpServers": {
"job-mcp": {
"command": "/absolute/path/to/job-mcp/.venv/bin/python",
"args": ["-m", "job_mcp.server"],
"env": {
"SMTP_HOST": "smtp.gmail.com",
"SMTP_PORT": "587",
"SMTP_USERNAME": "you@gmail.com",
"SMTP_PASSWORD": "your-app-password",
"SMTP_SENDER_EMAIL": "you@gmail.com",
"SMTP_SENDER_NAME": "Your Name"
}
}
}
}
```
(You can put credentials in `env` here instead of `.env` — either works, since
`config.py` reads from `os.environ` either way.)
## 6. Use it
In the client, paste something like:
> Here's a job post and the recruiter's email. Read my CV resource, then draft and
> send a tailored application email.
>
> Job post: <paste text>
> Recruiter email: hr@company.com
The client should call `cv://profile`, draft the email using both pieces of context,
and call `send_email(to=..., subject=..., body_html=..., body_text=...)`.
## Notes / things to harden later
- `send_email` currently has no confirmation step baked into the server itself — if you
want a "review before sending" guardrail enforced server-side (not just client-side),
add a two-step flow (e.g. a `draft_email` tool that returns a preview + an id, and a
`confirm_send` tool that actually sends it).
- Consider rate-limiting or logging sent emails to avoid accidental duplicate sends.
- `cv.json` is read fresh on every resource call, so you can edit it without restarting
the server.
TDQS
Scored across 1 tool
With only one tool, there is no possibility of ambiguity or misselection. The tool's purpose is clearly distinct simply because it is the only tool.
A single tool name cannot be inconsistent with itself. 'send_email' follows a clear verb_noun convention, and there are no other names to compare against.
One tool feels too thin for a server named 'job-mcp', which implies a broader job-application workflow. While sending an email is a concrete task, the server likely needs supporting tools for content generation or attachment handling to be useful.
The surface is severely limited: it only sends an email. Missing operations include email preview, attachment support, and any integration with job-application data, leaving obvious gaps for real-world workflows.