A Model Context Protocol (MCP) server that plugs any MCP client — Claude Desktop, Cursor, Claude Code, or your own agent — directly into Remote Jobs API: live, normalized remote-job listings from 5 boards, one keyless endpoint, a skill fit-score, and a live salary band per query.
Most agents can already reach the web, but raw job-board pages are inconsistent, unstructured, and rate-limited. Remote Jobs API normalizes them into one stable JSON schema with parsed salaries and a skill fit-score. The MCP server wraps that endpoint as three clean tools, so an agent can ask — "what do senior Python backend roles pay remote?" — and get a structured answer in one call, no scraping, no key, no signup.
| Tool | What it returns | Example question it answers |
|---|---|---|
search_jobs | Live jobs filtered by skills and a salary floor, ranked by fit-score | "Find senior backend Python roles paying $100k+" |
salary_band | Min / median / max annual salary floor for a skill set | "What does a remote data engineer pay right now?" |
market_stats | Feed health: which boards are live and how many jobs total | "How many remote jobs are on the feed this second?" |
One dependency (the official mcp Python SDK), then point your client at the stdio server:
pip install mcp remote-jobs-api remote-jobs-api-mcp # launches the MCP server over stdio
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"remote-jobs": {
"command": "remote-jobs-api-mcp",
"env": { "RJA_BASE_URL": "https://remote-jobs-api.tten.no" }
}
}
}
Any MCP client that spawns a stdio server (Cursor, Claude Code, OpenRouter harnesses, custom agents) uses the same entry point. Override RJA_BASE_URL to self-host; the default is the free public, keyless instance.
From search_jobs("python,backend", min_salary=100000) — real listings, live at page build time:
[
{"title": "Senior Software Engineer Case Execution", "company": "Pivotal Health", "fit_score": 30, "salary_min": 190000},
{"title": "Staff Software Development Engineer SDM", "company": "Delinea", "fit_score": 15, "salary_min": 150000},
{"title": "Senior Director, Community", "company": "HackerOne", "fit_score": 0, "salary_min": 247000}
]
fit_score is how well a listing matches the skills you passed (0–100); the feed also discloses structured salary_min/salary_max so salary questions are answerable, not guesswork.
GET https://remote-jobs-api.tten.no/v1/jobs?skills=...&min_salary=... — no auth, no quota surprises.remote-jobs-export CLI — so agents, scripts, and humans see identical data.urllib); the only third-party import is the MCP SDK. Self-host the API in one docker compose up if you want it on your own infra.git clone https://github.com/earnnova-dev/remote-jobs-api cd remote-jobs-api docker compose up -d # serves the API RJA_BASE_URL=http://localhost:8000 remote-jobs-api-mcp