get_api_version
Get the current Adzuna API version.
Returns: API version information
Search jobs and salary data across 12 countries through the Adzuna API — listings with filters, salary distributions, regional comparisons, historical trends and top employers.
LABSCO SUMMARY
Job listings you can find anywhere; a salary histogram, a regional breakdown and a year of history for the same query are what let you answer whether an offer is good rather than whether it exists. Two things will quietly narrow your results: call get_categories first, because valid category tags differ by country, and remember that a salary filter drops every listing that does not publish a salary — which is a lot of them.
An MCP server over the Adzuna Job Search API, covering both sides of a job search: the listings themselves, and the market data around them. Each country is queried by its code, and salaries come back as annual amounts in that country's currency.
search_jobsit-jobs or finance-jobs, which is what makes category filtering work — get_categoriesget_salary_histogramget_geodataget_salary_historyget_top_companiesget_api_versiongb, us, de, fr, au, nz, ca, in, pl, br, at and za, each with its local currencyAn Adzuna developer account, which is free: it gives you an App ID and an App Key, supplied as ADZUNA_APP_ID and ADZUNA_APP_KEY. Python 3.10+. The README names the package adzuna-mcp, which PyPI does not have. The free tier carries Adzuna's usage limits, so batch broad research rather than polling.
Build from source — git clone https://github.com/folathecoder/adzuna-job-search-mcp.git
USE CASES
Pull the salary histogram for that role and location to see the whole distribution, then check how it has moved over the past year.
Compare salaries by region for the same role, so a higher number in one city is read against what the job market there actually pays.
Get the country's category tags, then search that category with your location, salary floor and job type, sorted by date.
List the top employers by open positions for a role and location, and use that as the shortlist rather than applying to postings one at a time.
Run the same role across two country codes and compare volume, salary distribution and top employers side by side.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
get_api_versionGet the current Adzuna API version.
Returns: API version information
get_categoriesGet valid job category tags for a specific country.
PURPOSE: Use this BEFORE search_jobs to get valid 'category' parameter values. Category tags are COUNTRY-SPECIFIC - always use the same country code here as you will in search_jobs.
Args: country: ISO 3166-1 alpha-2 country code. Supported: "gb", "us", "de", "fr", "au", "nz", "ca", "in", "pl", "br", "at", "za"
Returns: dict: Contains "results" array of category objects:
Common category tags (vary by country):
Example response: { "results": [ {"tag": "it-jobs", "label": "IT Jobs"}, {"tag": "engineering-jobs", "label": "Engineering Jobs"}, {"tag": "finance-jobs", "label": "Accounting & Finance Jobs"} ] }
Usage: categories = get_categories("gb") search_jobs(country="gb", category="it-jobs") # Use tag, not label
Errors:
get_geodataGet salary and job count data broken down by geographic region.
PURPOSE: Compare salaries and job availability across areas. Useful for:
Args: country: ISO 3166-1 alpha-2 country code. Supported: "gb", "us", "de", "fr", "au", "nz", "ca", "in", "pl", "br", "at", "za"
keywords: Filter to specific roles (e.g., "software engineer").
location: Focus on a region for sub-area breakdown.
category: Category tag from get_categories (e.g., "it-jobs").
Returns: dict: Contains "locations" array of region objects:
Example response: { "locations": [ { "location": {"display_name": "London", "area": ["UK", "London"]}, "count": 15678, "average_salary": 62000 }, { "location": {"display_name": "Manchester", "area": ["UK", "Manchester"]}, "count": 3456, "average_salary": 48000 } ] }
Notes:
Errors:
get_salary_histogramGet salary distribution histogram for jobs matching search criteria.
PURPOSE: Understand salary ranges in a job market. Useful for:
IMPORTANT: Only includes jobs WITH listed salaries. Many jobs don't list salary.
Args: country: ISO 3166-1 alpha-2 country code. Determines currency. Supported: "gb", "us", "de", "fr", "au", "nz", "ca", "in", "pl", "br", "at", "za"
keywords: Search terms to filter jobs (e.g., "software engineer", "data scientist").
location: Location filter (e.g., "London", "New York").
category: Category tag from get_categories (e.g., "it-jobs").
Returns: dict: Contains "histogram" object with salary buckets:
Example response: { "histogram": { "25000": 89, "30000": 234, "35000": 456, "40000": 567, "45000": 489, "50000": 378, "55000": 245, "60000": 167 } }
How to interpret:
Errors:
get_salary_historyGet historical salary trends over time for matching jobs.
PURPOSE: Analyze how salaries have changed. Useful for:
Args: country: ISO 3166-1 alpha-2 country code. Supported: "gb", "us", "de", "fr", "au", "nz", "ca", "in", "pl", "br", "at", "za"
keywords: Filter to specific roles (e.g., "software engineer").
location: Location filter (e.g., "London").
category: Category tag from get_categories (e.g., "it-jobs").
months: Number of months of history (default 12, max ~24).
Returns: dict: Contains "month" array of data points:
Example response: { "month": [ {"month": "2024-01", "salary": 52000}, {"month": "2024-02", "salary": 52500}, {"month": "2024-03", "salary": 53000} ] }
How to analyze:
Errors:
get_top_companiesGet top employers currently hiring, ranked by number of open positions.
PURPOSE: Identify major employers in a field. Useful for:
NOTE: Shows hiring VOLUME, not company quality. Smaller great companies may not appear.
Args: country: ISO 3166-1 alpha-2 country code. Supported: "gb", "us", "de", "fr", "au", "nz", "ca", "in", "pl", "br", "at", "za"
keywords: Filter to specific roles (e.g., "software engineer", "data scientist").
location: Location filter (e.g., "London" for London-based employers).
category: Category tag from get_categories (e.g., "it-jobs").
Returns: dict: Contains "leaderboard" array of company objects:
Example response: { "leaderboard": [ {"canonical_name": "NHS", "count": 1245, "average_salary": 42000}, {"canonical_name": "Amazon", "count": 567, "average_salary": 65000}, {"canonical_name": "Google", "count": 234, "average_salary": 95000} ] }
Notes:
Errors:
search_jobsSearch for jobs on Adzuna across 12 supported countries.
IMPORTANT: All salary figures are ANNUAL amounts in LOCAL CURRENCY.
Args: country: ISO 3166-1 alpha-2 country code. Determines job market AND currency. Supported: "gb" (UK/GBP), "us" (USA/USD), "de" (Germany/EUR), "fr" (France/EUR), "au" (Australia/AUD), "nz" (New Zealand/NZD), "ca" (Canada/CAD), "in" (India/INR), "pl" (Poland/PLN), "br" (Brazil/BRL), "at" (Austria/EUR), "za" (South Africa/ZAR)
keywords: Space-separated search terms matched against job title and description.
location: Geographic filter with fuzzy matching. Accepts: city names, regions, postal code prefixes. Examples: "London", "Manchester", "SW1" (UK), "New York", "10001" (US) Leave empty for country-wide search. For remote jobs, include "remote" in keywords.
page: Page number for pagination (starts at 1, not 0).
results_per_page: Results per page (default 10, max 50).
salary_min: Minimum ANNUAL salary filter in LOCAL CURRENCY (e.g., 50000 not 50). Note: Jobs without listed salaries are excluded when using this filter.
salary_max: Maximum ANNUAL salary filter in LOCAL CURRENCY.
full_time: Set True to show ONLY full-time jobs.
part_time: Set True to show ONLY part-time jobs.
contract: Set True to show ONLY contract/freelance jobs.
permanent: Set True to show ONLY permanent positions.
category: Job category tag from get_categories tool. Common tags: "it-jobs", "engineering-jobs", "finance-jobs", "sales-jobs" IMPORTANT: Call get_categories(country) first to get valid tags.
sort_by: Sort order - "date" (newest first), "salary" (highest first), "relevance" (best match, default).
max_days_old: Maximum age of listings in days (e.g., 7 for last week).
Returns: dict: Search results containing:
Example response: { "count": 523, "results": [{ "id": "4123456789", "title": "Senior Software Engineer", "company": {"display_name": "Tech Corp"}, "location": {"display_name": "London"}, "salary_min": 70000, "salary_max": 90000, "redirect_url": "https://www.adzuna.co.uk/..." }] }
Errors:
BEFORE YOU INSTALL
7 tools when we connected.
Both documented clients run the server on your machine.
CONTEXT COST
Rated by the size of the 7 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
git clone https://github.com/folathecoder/adzuna-job-search-mcp.git
cd adzuna-job-search-mcp
python3 -m venv venv
source venv/bin/activate
pip install -e .{
"mcpServers": {
"adzuna-jobs": {
"command": "<YOUR_PATH_TO_ADZUNA_JOB_SEARCH_MCP>/venv/bin/python",
"args": [
"<YOUR_PATH_TO_ADZUNA_JOB_SEARCH_MCP>/server.py"
],
"env": {
"ADZUNA_APP_ID": "<YOUR_ADZUNA_APP_ID>",
"ADZUNA_APP_KEY": "<YOUR_ADZUNA_APP_KEY>"
}
}
}
}