adzuna-mcp
Enables job market analysis by providing salary distributions, trends, regional vacancy counts, and employer leaderboards via the Adzuna API, complementing listings from other sources.
README
adzuna-mcp
⚠️ Moved. This server now lives in the job-hunt monorepo at
job-hunt/connectors/adzuna-mcp. This standalone repo is archived (read-only) and kept only for existing links. Get the current version, docs, and setup there.
A local stdio MCP server wrapping the Adzuna API. Built to sit alongside a listings source like Indeed: Indeed finds ads, Adzuna adds the salary and market data that listings boards don't expose — distributions, trends, regional vacancy counts and employer leaderboards.
Tools
| Tool | What it gives you |
|---|---|
adzuna_search_jobs |
Job ads with salary range, contract type, category, redirect_url |
adzuna_list_categories |
Valid category tags (call before filtering by category) |
adzuna_salary_histogram |
Salary distribution for a role/location — is £45k ambitious or low? |
adzuna_salary_history |
Month-by-month average salary trend |
adzuna_regional_breakdown |
Vacancy counts by sub-region; also how you discover location0/1/2 values |
adzuna_top_companies |
Top 5 employers by vacancy count + their average salary |
adzuna_estimate_salary |
Predicted salary for a title + description (Adzuna Jobsworth) — price a role that states no salary |
All tools are read-only and take country (default gb) and response_format
(markdown for compact reading, json for programmatic use).
Using it with /cv-tailor
The intended loop when tailoring a CV to a target role:
- Find live ads.
adzuna_search_jobswithwhat_phrase(exact role),where+distance, andmax_days_oldto skip stale posts. Sort fresh-first withsort_by=date.adzuna_search_jobs(what_phrase="audio visual technician", where="london", distance=20, max_days_old=30, sort_by="date") - Read the full JD. Each result gives only a snippet — fetch its
redirect_urlfor the complete description, then feed that into/cv-tailoras the job spec.Heads-up: Adzuna's
…/jobs/details/<id>page is JavaScript-rendered, so a plain HTTP fetch returns an empty shell. Read it with a JS-capable fetch (Claude-in-Chrome), or follow the…/jobs/land/ad/<id>redirect variant, which forwards to the employer's ATS where the full JD is usually server-rendered. This is Adzuna's frontend behaviour, not a server bug. - Price a role with no stated salary. Many ads omit pay.
adzuna_estimate_salary(title, description)returns Adzuna's predicted figure so you can set expectations before applying. - Sanity-check your target £.
adzuna_salary_histogram(what=...)shows where a figure sits in the live market;adzuna_salary_historyshows whether pay is trending up or down. - Build an outreach list.
adzuna_top_companies(what=...)surfaces who is hiring at volume for the role — feed acanonical_nameback intoadzuna_search_jobscompanyto see their ads.
Cowork//cv-tailor sessions read and write files under C:\Users\flhso\Claude
(coworkUserFilesPath), so drop JDs and CV drafts there to keep them in view.
The one real limitation
Adzuna returns only a snippet of each job description. Every search result carries a
redirect_url. To get a full JD you fetch that URL yourself. This is why the pairing with a
crawler matters: Adzuna is a fast, filterable, salary-aware index; the full text lives behind
the redirect.
Setup
- Register at https://developer.adzuna.com/signup for a free
app_id/app_key. (Note: this is a separate account from a normal adzuna.co.uk jobseeker login.) - Install:
cd adzuna-mcp
uv venv && uv pip install mcp httpx python-dotenv
# or: python -m venv .venv && .venv/bin/pip install mcp httpx python-dotenv
For local runs (and the mcp-inspector verify step below), copy .env.example to
.env and fill in your app_id / app_key — server.py loads it automatically.
Real env vars still win over .env, so the .mcp.json env block below keeps working.
- Wire it into Claude Code —
.mcp.jsonin your project, orclaude mcp add:
{
"mcpServers": {
"adzuna": {
"command": "python",
"args": ["D:\\soh-workspace\\projects\\adzuna-mcp\\server.py"],
"env": {
"ADZUNA_APP_ID": "your_app_id",
"ADZUNA_APP_KEY": "your_app_key"
}
}
}
}
Use the absolute path to the venv's python (.venv\Scripts\python.exe on Windows) if the
dependencies aren't on your global interpreter.
- Verify before wiring it up:
npx @modelcontextprotocol/inspector python server.py
Country support
gb us at au br ca de fr in nz pl za — annual salaries, local currency.
The server accepts any two-letter code and lets Adzuna's 404 tell you if one isn't served, so
the list staying accurate isn't a hard dependency.
Rate limits
Adzuna's default free/trial limits (per their Terms of Service) are 25 hits/min, 250/day,
1000/week, 2500/month. The server surfaces a 429 with a clear message. Prefer fewer, wider
queries over many narrow ones; adzuna_salary_histogram answers "what does this pay?" in one
call where a paginated search would take several.
Trial-tier data also can't be republished or aggregated into ongoing work beyond the 14-day evaluation without a licence — fine for personal job-hunt research, worth knowing before you build anything public on it.
Notes
- Keyword semantics matter.
whatANDs its words — every word must appear, sowhat="plant science research assistant agronomist"matches almost nothing. Usewhat_orto match ANY of several terms in one call,what_phrasefor an exact phrase, ortitle_onlyto restrict to the job title. There is no cross-field OR, so for genuinely different role titles run one search per variant (or list them in a singlewhat_or). location0/1/2are exact strings, not free text. Get them fromadzuna_regional_breakdown— theareaarray on each result is literally the values to pass back in.where="United Kingdom"narrows to almost nothing — use a city +distance, or omitwhereand rely onlocation0/1/2.where+distanceis the free-text alternative and is usually easier.salary_is_predicted: 1means Adzuna estimated the figure; the ad didn't state it. Don't quote predicted numbers as if the employer published them.- Not implemented:
version. A small addition if wanted.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。