Skip to main content
Glama
aminafara123

jobscan-mcp

by aminafara123

jobscan-mcp

M8ven Score

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

latest_report()

Full text of the most recent daily scan

search_jobs(query, days)

Search postings across the last N days of reports, links included

market_stats(days)

Per-day relevant/new counts: the pulse of the niche market

is_seen(company, title)

Whether the scanner's dedupe memory already knows a posting

Related MCP server: joblet-mcp-grok

Setup

pipx install jobscan-mcp

uvx jobscan-mcp works too if you prefer no install. Hacking on a clone instead:

python3 -m venv .venv
.venv/bin/pip install mcp

It 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-mcp

Running 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.py

Demo

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 mcp SDK. 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 tools
is_seenB
Read-onlyIdempotent

Whether the scanner's dedupe memory already contains this company+title posting (i.e. it has been surfaced before).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
companyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_reportA
Read-onlyIdempotent

Full text of the most recent daily scan report (markdown).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_statsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_jobsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 4 tool updatesv1.0.1
    • First observedis_seen
    • First observedlatest_report
    • First observedmarket_stats
    • First observedsearch_jobs

TDQS

A3.6/5.0

Scored across 4 tools

Disambiguation5/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to search, rank, and explain job matches through a secure read-only interface that blocks prompt injections and unsafe content.
    4
    MIT
  • -
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to query, filter, and update job application records, and to analyze skill demand across postings.
    MIT