jobscan-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., "@jobscan-mcpany new GRC postings this week?"
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.
jobscan-mcp
An MCP server over my job-scan-automation dataset: the daily market scan behind uae-remote-jobs-daily, exposed as tools that any MCP-capable AI client can call.
MCP (Model Context Protocol) is the open standard for giving AI models controlled access to tools and data. This server is the pattern in miniature and in production: my own dataset, four read-only tools, and a model on the other end that can suddenly answer questions like "any new GRC postings this week?" with real data instead of guesses.
Tools
Tool | What it does |
| Full text of the most recent daily scan |
| Search postings across the last N days of reports, links included |
| Per-day relevant/new counts: the pulse of the niche market |
| Whether the scanner's dedupe memory already knows a posting |
Related MCP server: joblet-mcp-grok
Setup
pipx install jobscan-mcpuvx jobscan-mcp works too if you prefer no install. Hacking on a clone instead:
python3 -m venv .venv
.venv/bin/pip install mcpIt reads ~/aiProjects/aminWork/job-research/scraper. Point JOBSCAN_DATA_DIR at your own data folder if your copy lives somewhere else.
Wire it into Claude Code:
claude mcp add jobscan -- jobscan-mcpRunning from a clone, point it at the venv instead:
claude mcp add jobscan -- /path/to/jobscan-mcp/.venv/bin/python /path/to/jobscan-mcp/jobscan_mcp.pyDemo
What it looks like from Claude Code:
> check the job scan: anything new in IAM in the last week?
⏺ jobscan · search_jobs("IAM", 7)
2 match(es) for 'IAM':
[2026-09-26] - **IAM Engineer** at Falconride Logistics
https://example.com/falconride/iam-engineer
[2026-09-23] - **Identity and Access Analyst** at Northgate Retail
https://example.com/northgate/iam-analyst
⏺ Two IAM roles surfaced this week. Falconride is the Dubai one,
Northgate is remote. Neither was in the scan before Tuesday.The postings above are demo data. The format is exactly what the server returns.
Design notes
Read-only by construction. Every tool reads files, nothing mutates the dataset. Giving a model tools means deciding what it must never be able to do, and here that decision is structural, not a prompt instruction.
Sanitization at the boundary. The underlying reports can carry the operator's personal notes, so the server strips them before anything crosses the protocol. Data boundaries belong in code, not in hope.
Small on purpose. Four tools, one file, standard library plus the
mcpSDK. An MCP server doesnt need to be a platform to be useful. It just needs to expose the right verbs over data you actually maintain.
About
Al Amin Bashir Afara, Dubai · github.com/aminafara123 · linkedin.com/in/aminafara
Available Tools
4 toolsis_seenBRead-onlyIdempotent
Whether the scanner's dedupe memory already contains this company+title posting (i.e. it has been surfaced before).
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| company | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so safety is covered structurally. The description adds the meaningful context that this reads a persistent 'dedupe memory' (not just any job store), which is the key behavioral fact, but says nothing about memory scope, persistence window, or how staleness is handled.
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?
One compact sentence with the lookup subject front-loaded; no filler. Slightly convoluted phrasing ('Whether the scanner's dedupe memory already contains') but nothing wasted.
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?
An output schema exists, so return-value explanation is not required, and the tool is a simple two-parameter predicate. What the description provides is sufficient to call it correctly, with only minor gaps around matching semantics and memory scope.
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 coverage is 0%, so the description must carry the parameter burden. It does name both inputs ('company' and 'title') and frames them as a composite pair, indicating the lookup is a combination key — a useful hint. However, it gives no matching semantics (exact vs fuzzy), so compensation is partial.
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 states precisely what the predicate checks — whether the scanner's dedupe memory contains a given company+title posting — and parenthesizes the plain-language meaning ('has been surfaced before'). It is clear enough that no sibling comparison is needed, since latest_report/search_jobs/market_stats are unrelated operations.
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?
No guidance on when to call this versus not, nor what the caller should do with a true/false answer. The 'surfaced before' gloss hints at dedupe intent, but there is no explicit when-to-use or prerequisite statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
latest_reportARead-onlyIdempotent
Full text of the most recent daily scan report (markdown).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds only the markdown format and the 'most recent' scoping — useful but modest, with no notes on auth, staleness or refresh cadence for a 'most recent' report.
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 compact sentence with zero filler; the format detail is front-loaded and every word earns its place.
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?
An output schema exists, so return value structure need not be explained, and the zero-parameter surface is fully covered. The remaining gap is behavioral context (how fresh the report is, whether it can be absent), which is minor for such a simple tool.
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?
The tool takes no parameters (0 params, 100% coverage), so there is nothing for the description to disambiguate. Baseline of 4 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?
States a specific resource ('most recent daily scan report') and the return format ('full text ... markdown'), which is enough for an agent to distinguish it from search_jobs, market_stats and is_seen. It stops short of an explicit verb ('Returns...') but the meaning is unambiguous.
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?
No when-to-use or when-not-to-use guidance and no alternatives named. The zero-argument, singleton nature makes the intent largely self-evident, but the description itself offers nothing about context of use versus siblings like search_jobs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_statsARead-onlyIdempotent
Per-day counts of relevant and new postings over the last N days, parsed from the reports: a quick pulse of the niche market.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed-world scope, so the safety profile is covered. The description adds useful context that the counts are derived from existing reports and that they cover both relevant and new postings. It says nothing about rate limits, cost, or data freshness/lag beyond the report-parsing note.
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?
One sentence that front-loads the output shape and then characterizes the tool's role. It is efficiently sized with no filler, though "a quick pulse of the niche market" is slightly promotional rather than informative.
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 single-optional-param, read-only aggregation tool, this is close to sufficient; the output schema exists so return values need not be re-explained. What's missing is any indication of how the result is scoped (e.g. which market/niche is being measured), which matters given the description's ambiguity about scope.
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 coverage is 0%, but the single "days" parameter is semantically explained by "over the last N days", which tells the agent the window is a trailing range rather than a calendar range. The 30-day default is only visible in the schema, which is acceptable.
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 output (per-day counts of relevant and new postings) and the source (parsed from the reports), so an agent knows exactly what this tool produces. It doesn't reference any sibling (latest_report, search_jobs, is_seen), so differentiation from nearby tools is left to inference.
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?
"A quick pulse of the niche market" implies a summary/overview use case, which gives some sense of when to reach for it. However, there is no explicit when-to-use vs. when-not, and no routing to alternatives like latest_report or search_jobs for detailed data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsARead-onlyIdempotent
Search postings in the last N days of reports. Case-insensitive substring match over title/company lines; returns each hit with its link and the report date it appeared.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's job is to add context — and it does, disclosing match semantics (case-insensitive substring, title/company lines) and return shape (each hit with link and report date). It does not mention result limits or ordering, a minor gap.
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 compact sentences with the scope front-loaded and no filler; every clause conveys operational detail (time window, matching rule, return contents).
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 two-parameter search tool with an output schema present, the description covers both parameters implicitly and describes what a hit contains. It is essentially complete for correct invocation, missing only minor details like default window and result count/ordering.
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?
With 0% schema description coverage, the description must compensate; 'last N days' gives meaning to the 'days' parameter and 'substring match over title/company lines' explains what 'query' matches against. It does not restate the default of 14, but the parameter intent is clear, which is above the baseline for two undocumented params.
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 (postings), plus the exact scope ('last N days of reports') and matching semantics ('case-insensitive substring match over title/company lines'). This clearly distinguishes it from siblings latest_report, market_stats, and is_seen.
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 scope ('last N days of reports') implies when the tool is applicable and hints at recency-bounded lookup, but there is no explicit when-to-use/when-not guidance or named alternative among the siblings. Usage is inferable rather than stated.
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.
4 tool updates
v1.0.1- First observed
is_seen - First observed
latest_report - First observed
market_stats - First observed
search_jobs
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: latest_report returns raw markdown, search_jobs finds matching postings, market_stats aggregates counts, and is_seen checks dedupe memory. There is no meaningful overlap in agent selection.
All names use snake_case, but the semantic convention is mixed: latest_report is adjective_noun, search_jobs is verb_noun, market_stats is noun_noun, and is_seen is a past-participle boolean check. The names are readable but not predictable as a set.
Four tools are well-scoped for a read-only job scan report server. Each tool earns its place: latest report access, search, aggregate stats, and dedupe lookup.
The surface covers common queries over recent reports but lacks a way to list available report dates or fetch a specific older report by date. search_jobs and market_stats work only over the last N days, leaving a notable gap for historical full-report access.
Maintenance
Related MCP Connectors
Free, read-only access to job listings rated by AI level, from Little AI to Builds AI.
Search AI tools, browse categories and read tool details with source links. Free, read-only access.
Free, read-only data on about 4,900 AI companies, open AI jobs and dated AI news, with source links.
Query professional profiles, search candidates, and get AI-powered summaries and job fit analysis.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI agents to search, rank, and explain job matches through a secure read-only interface that blocks prompt injections and unsafe content.4MIT
- -licenseNot gradedqualityCmaintenanceEnables Grok and any standards-compliant MCP host to search joblet.ai job postings and retrieve full job details, including requirements, responsibilities, salary, and apply links, through read-only tools.-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to crawl, analyze, and query job description (JD) data from recruitment sites via MCP, with tools for searching jobs, viewing statistics and portraits, and running local analysis on privately stored data.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to query, filter, and update job application records, and to analyze skill demand across postings.MIT