jobscout-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jobscout-mcpFind AI engineer roles in Barcelona and rank them against my Python and LLM skills"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
jobscout-mcp
An MCP server for tech job hunting. Ask your AI assistant for jobs in plain language and it searches several job boards at once, tells you what the market is asking for, and ranks the offers against your own skills.
You: Find AI engineer roles I could apply to from Barcelona.
My skills: Python, FastAPI, LLMs, RAG, Docker, AWS, React, MCP, Claude, TypeScript.
Claude: ⏵ rank_jobs_for_me
Ranked 15 of 19 postings for "ai engineer" in Barcelona.
Missing most often in the best matches: AI agents (10), Next.js (5), Machine learning (5)…
- Senior Product Engineer [hn:49962075]
Revieve Oy | REMOTE [Europe / (GMT+2)] | remote | 14 days ago
skills: TypeScript, AI agents, MCP, Claude, Evals, React
fit 67/100 | you have: TypeScript, MCP, Claude, React | missing: AI agents, Evals
https://news.ycombinator.com/item?id=49962075
...Real output from October 2026. Remote roles open to Europe count as available from Barcelona.
What it can do
Tool | What it does |
| Searches every configured board in parallel and returns the newest matches with company, location, remote status, salary when published, and the skills each posting asks for. |
| Full description of one posting, with its skills and salary text. |
| What a search looks like as a market: most requested skills and how often, remote share, salary ranges (median and middle half), companies with several openings. |
| Scores each posting by how much of what it asks for you already have. Shows matched and missing skills per job, and the skills you're missing most often across the best fits. |
| Which boards are ready and which need a key. |
There is also a job_hunt prompt that chains them: market overview, best five fits, and what to highlight in the top two applications.
Related MCP server: JobSpy MCP Server
Sources
Source | Coverage | Key |
Remote jobs worldwide | None | |
Europe, many remote roles | None | |
This month's thread, startups worldwide | None | |
Spain (or 15+ other countries) with salaries | Free |
Three sources work with no setup. Add the free Adzuna key for on-site and hybrid roles in Spain.
Install
Requires Node.js 18.17 or newer.
git clone https://github.com/ianfloresfdez/jobscout-mcp
cd jobscout-mcp
npm install
npm run buildClaude Desktop
Add this to claude_desktop_config.json (Settings → Developer → Edit config) and restart Claude:
{
"mcpServers": {
"jobscout": {
"command": "node",
"args": ["/absolute/path/to/jobscout-mcp/dist/index.js"],
"env": {
"ADZUNA_APP_ID": "your-id",
"ADZUNA_APP_KEY": "your-key",
"ADZUNA_COUNTRY": "es"
}
}
}
}The env block is optional; leave it out to use only the key-free boards.
Claude Code
claude mcp add jobscout -- node /absolute/path/to/jobscout-mcp/dist/index.jsCursor, Windsurf and other clients
Any MCP client that runs stdio servers works with the same command: node /absolute/path/to/jobscout-mcp/dist/index.js.
Try it
"What do AI engineer roles in Europe ask for right now, and what do they pay?"
"Search remote LLM jobs posted in the last week."
"Rank Python backend jobs in Spain against my CV" (paste your skills)
"Open the second one and tell me what to put first in my cover letter."
How it works
One search, many boards. Sources run in parallel. If one is down or rate-limited, you still get the others, and the result says which one failed and why.
Same shape for every posting. Each board is mapped to one
Jobtype: title, company, location, remote flag, URL, date, salary, tags, and plain-text description.Skills are detected, not guessed. A dictionary of about 80 technologies with their aliases (
react.js,k8s,pgvector,retrieval-augmented…) is matched against each posting. Your own skill list goes through the same aliases, so "LLM" and "large language models" count as the same thing.Fit score. The weighted share of a posting's skills you already have. Skills named in the job title count double. Postings that mention fewer than two known skills are left out of the ranking rather than scored on noise.
Salaries. Read from the structured fields where a board has them (Adzuna), otherwise parsed from the text (
$120k-150k,55.000-65.000 €,€500/day). Ranges are annualised for comparison and reported per currency. Adzuna's predicted salaries are ignored.Location. "Barcelona" also matches remote roles open to Spain, Europe or anywhere. "remote" keeps only postings that say remote.
Caching. Results are cached for 10 minutes, so follow-up questions in a conversation don't refetch.
Development
npm test # unit tests with recorded fixtures, no network
npm run build
npm run inspect # opens the MCP Inspector against the built serverTo add a board, implement the Source interface in src/sources/ and register it in src/search.ts.
Notes
jobscout only reads public listings through each board's official API or public feed, and links to the original posting to apply. Respect each board's terms of use.
License
MIT
Available Tools
5 toolsget_jobGet job detailsARead-only
Full description of a posting returned by search_jobs, rank_jobs_for_me or market_snapshot, with the skills it asks for and its salary text.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Posting id from a previous result, e.g. "remotive:1923456". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that the response includes required skills and salary text, but says nothing about the remaining return shape, error behavior for a stale/unknown id, or rate limits. Adequate given the annotation coverage, but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads what the tool returns, then the provenance of the id, then the notable payload fields. No filler or restated title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description covers purpose, source of the id, and the two most decision-relevant return fields. Only the full response shape and id-miss behavior are unstated, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter at 100% schema description coverage, with the schema itself giving the format and an example ('remotive:1923456'). The description adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (a posting's full description) and the exact payload it returns — skills and salary text. It also names the sibling tools that produce the ids it consumes (search_jobs, rank_jobs_for_me, market_snapshot), which cleanly separates it from those list-level siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
By tying the tool to ids 'returned by search_jobs, rank_jobs_for_me or market_snapshot', it makes the usage context clear: call this after a search to expand a specific posting. It stops short of explicit when-not-to-use guidance or naming an alternative for bulk retrieval, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesList job sourcesARead-only
Which job boards are available and which need configuration (API keys).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, non-open-world operation. The description adds useful behavioral context by stating that the result covers both available job boards and which ones need configuration via API keys, though it does not describe output format in detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single compact fragment with no wasted words. The key information — available sources and configuration status — is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, zero-parameter, read-only listing tool, the description covers the essential output content and is supported by annotations that clarify safety. It could be slightly stronger by indicating the shape of the returned list, but no output schema exists and the description is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool takes zero parameters, so there is no parameter semantics for the description to explain. The baseline for a parameterless tool is 4, and nothing in the description misleads about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the specific resource (job boards/sources) and what information is reported (availability and configuration needs). It is clear but omits an explicit verb and does not directly name or distinguish itself from the sibling job/market tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no exclusions, and no mention of alternative tools. The content implies you call it when you need source availability or API-key configuration status, but the usage condition is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_snapshotJob market snapshotARead-only
Summarise what the market asks for in a search: most requested skills and their share of postings, remote share, salary ranges where postings publish them, and companies with several openings. Good for 'what should I learn' and 'what does this role pay'.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What to look for, e.g. "AI engineer", "python backend", "LLM". All words must appear in the posting. | |
| sources | No | Limit to some boards. Defaults to every board that is configured. | |
| location | No | City, country or "remote", e.g. "Barcelona", "Spain", "Europe". Remote roles open to that place are included. | |
| remote_only | No | Only postings that say they are remote. | |
| max_age_days | No | Ignore postings older than this. Defaults to 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety and external-fetch behaviour are covered. The description adds one genuine data-quality caveat – salary ranges only appear 'where postings publish them' – but says nothing about cost, latency, result limits, or what happens when the query matches nothing. Useful but thin beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the summary contains, followed by a compact use-case cue. Every clause carries information (the enumerated outputs are the reason to pick this tool), though the output list is dense enough that it verges on a spec dump.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly compensates by enumerating the returned aggregates, and it covers the primary call intents. Remaining gaps are minor: no mention of empty-result behaviour or how sources/location interact with the summary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all five parameters, so the input schema already documents query semantics, source selection, location handling, remote filtering, and the default 30-day window. The description adds no format or interaction detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (summarise) and resource (a job-market search), and enumerates the aggregates produced: top skills with share, remote share, salary ranges, repeat hirers. It is clearly distinguishable from the list-oriented siblings (search_jobs, get_job) by implication, but never names them, so sibling differentiation is not explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when-to-use intents – 'what should I learn' and 'what does this role pay' – which tell an agent this is the aggregation tool rather than a posting browser. It offers no exclusions or named alternatives (e.g. 'use search_jobs when you need individual postings'), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rank_jobs_for_meRank jobs against my skillsARead-only
Score postings by how much of what they ask for the candidate already has, best fit first. Each result lists the matched skills and the missing ones, and the summary lists the skills missing most often across the best matches. Pass the skills from the user's CV or profile.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many postings to return. Defaults to 10. | |
| query | Yes | What to look for, e.g. "AI engineer", "python backend", "LLM". All words must appear in the posting. | |
| skills | Yes | The candidate's skills, e.g. ["Python", "FastAPI", "LLMs", "RAG", "Docker", "AWS"]. | |
| sources | No | Limit to some boards. Defaults to every board that is configured. | |
| location | No | City, country or "remote", e.g. "Barcelona", "Spain", "Europe". Remote roles open to that place are included. | |
| remote_only | No | Only postings that say they are remote. | |
| max_age_days | No | Ignore postings older than this. Defaults to 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, openWorldHint), so the bar is lower, and the description adds real behavioral context: results are ranked best-fit-first, each result carries matched and missing skills, and a summary aggregates the most commonly missing skills. With no output schema, this return-shape disclosure is genuinely valuable. It stops short of explaining scoring mechanics, board fan-out, or latency from external sources.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero waste: purpose and ranking rule first, output shape second, input sourcing last. Nothing is repeated from the schema or annotations, and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a seven-parameter, open-world tool with no output schema, the description covers the essentials: what is scored, how results are ordered, and what each result and the summary contain. It leaves out scoring scale/interpretation (e.g. percentage vs ratio), behavior when no posting matches, and cross-board deduplication, which keeps it short of fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters, making 3 the baseline. The description adds only one piece of extra meaning, telling the agent to source the skills array from the user's CV/profile; the query, limit, sources, location, remote_only, and max_age_days semantics come entirely from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (score/rank) and resource (job postings) with the ranking criterion (share of requested skills the candidate already has) and ordering (best fit first). That ranking-by-skill-match semantic is inherently distinct from search_jobs or get_job, so an agent can tell what this tool uniquely does without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing line ('Pass the skills from the user's CV or profile') gives practical guidance on supplying the key input, which implies the usage context: you use this when you have a candidate skill set to match against. However, no alternative sibling (search_jobs, list_sources) is named and no when-not condition is stated, so usage is only implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsSearch tech jobsARead-only
Search tech job postings across Remotive, Arbeitnow, Hacker News 'Who is hiring?' and Adzuna (Spain) at once. Returns the newest matches with company, location, remote status, salary when published, the skills each posting asks for, and an id for get_job.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many postings to return. Defaults to 15. | |
| query | Yes | What to look for, e.g. "AI engineer", "python backend", "LLM". All words must appear in the posting. | |
| sources | No | Limit to some boards. Defaults to every board that is configured. | |
| location | No | City, country or "remote", e.g. "Barcelona", "Spain", "Europe". Remote roles open to that place are included. | |
| remote_only | No | Only postings that say they are remote. | |
| max_age_days | No | Ignore postings older than this. Defaults to 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real value by enumerating returned fields (company, location, remote status, salary when published, skills) and that results are time-ordered newest-first, but omits cross-board de-duplication behavior, pagination, and what happens when a source is unconfigured.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler, front-loaded on scope and sources. The second sentence earns its place because there is no output schema, so the return-field enumeration is the only place an agent can learn the response shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by describing the return payload and ordering, and the fully documented six-parameter schema covers input. Remaining gaps are minor: no statement on de-duplication across the four boards or on behavior when no source matches.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all six parameters, so the schema already carries defaults, bounds and enum values. The description contributes nothing extra about parameter syntax or interaction (e.g. how location interacts with remote_only); baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (tech job postings) with an explicit aggregation scope across four named boards, and links the result to the get_job sibling. It stops short of contrasting itself with rank_jobs_for_me or market_snapshot, which also operate on job data, so an agent still has to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the breadth of the query and the note that results carry 'an id for get_job' hints at the search-then-fetch workflow. There is no explicit when-to-use or when-not-to-use, and no pointer to rank_jobs_for_me for ranked results or list_sources for board configuration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
get_job - First observed
list_sources - First observed
market_snapshot - First observed
rank_jobs_for_me - First observed
search_jobs
TDQS
Scored across 5 tools
Each tool has a clearly distinct role: search_jobs finds postings, get_job retrieves full details by id, market_snapshot aggregates market trends, rank_jobs_for_me scores postings against candidate skills, and list_sources reports board availability. There is no meaningful overlap that would cause misselection.
Four tools follow a verb_noun snake_case pattern (get_job, search_jobs, rank_jobs_for_me, list_sources), but market_snapshot is a noun phrase rather than a verb-led name. This is a minor deviation that does not impair readability.
Five tools is well-scoped for a job search and market analysis server. Each tool covers a distinct stage of the workflow (discover, inspect, analyze, rank, configure) without redundancy.
The surface covers search, detail retrieval, market aggregation, personal ranking, and source configuration, which is a solid lifecycle for job scouting. Minor gaps exist, such as saving/bookmarking postings or tracking applications, but core workflows are fully supported.
Maintenance
Related MCP Connectors
Job platform for AI agents. Track tech jobs from companies that match your stack.
Job alerts for AI agents: describe a role once, get only new postings from 1,500+ tech job boards.
Job search for your AI: save jobs, research companies, keep stories, track applications.
1Job search, application materials, and application tracking for AI assistants.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables natural-language job search and aggregation from multiple recruitment websites with zero configuration, providing filtered results and standardized output for AI assistants.64 npmISC
- FlicenseBqualityBmaintenanceEnables AI assistants to search and filter job listings across multiple platforms like Indeed, LinkedIn, and Glassdoor, returning structured results for easy processing.1-
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to find live job postings from employer career sites and rank them against a user's resume, with each requirement matched and tiered for fit.MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to search job listings and retrieve or update a user's career profile, including work experiences, job summaries, career goals, and technical skills through natural language.-