Skip to main content
Glama
starnikovoleg

hiringindex-mcp

hiringindex-mcp

MCP server over live job postings. Search roles, aggregate a market slice, and see how long each listing has been sitting open.

Zero dependencies, Node ≥ 18, stdio transport.

Install

npx -y hiringindex-mcp

Claude Desktop / Claude Code:

{
  "mcpServers": {
    "hiringindex": {
      "command": "npx",
      "args": ["-y", "hiringindex-mcp"],
      "env": { "HIRINGINDEX_API_KEY": "your-key" }
    }
  }
}

Related MCP server: JobsPipe MCP Server

Tools

Tool

What it answers

search_jobs

"Show me Python data roles in Amsterdam paying over 80k"

job_market_insights

"What does a data engineer earn in Berlin, and who is hiring?"

posting_age_report

"Are these listings fresh, or have they been open for months?"

get_job

"Give me the full posting for this id"

posting_age_report reports median age, the share posted this week and the share still open after sixty days — the most commonly cited signal that a role is not being actively filled. It reports the numbers; it does not pretend to know the employer's intent.

Where this sits against what exists. A free tool, whenthisjobwasposted.com, resolves the real posting date for one URL at a time and has an MCP server of its own. If that is what you need, use it — it costs nothing. This tool answers a different question: the age distribution of an entire slice of the market, computed alongside pay and demand for the same cohort. One is a lookup, the other is an aggregate.

All four take the same filter shape, so a slice defined once can be searched, aggregated and aged without rewriting the query.

Filters

Exactly what the live index can apply (checked against the marketplace listing on 2026-09-07, board_handle added 2026-09-08). Anything else is not a filter, and the tool schemas are closed so a model cannot invent one.

Field

Meaning

Notes

titles

job titles to match

terms shorter than 3 characters are rejected by the index

keywords

terms mentioned anywhere in the posting (title or description)

any keyword matches; since 2026-09-08 — before that, title only

city

city as employers write it

"Berlin", "New York", "Bengaluru"

country

ISO 3166-1 alpha-2 code or an English name

"US", "Germany"; names are mapped to codes locally

work_arrangement

Remote / In Person

hybrid is not a separate filter upstream

company

one employer by name

board_handle

one ATS board by its handle

take it from the handle field of a posting: "EndeavorITSolution", "walmart:wd504:WalmartExternal"

salary_min / salary_max

advertised salary bounds

only postings that disclose a salary match

posted_within_days

published in the last N days

page / limit

paging, limit up to 100

search_jobs only

Not offered here although the index accepts them: seniority and employment_type — their values are raw vendor strings ("Mid-Senior Level", "FullTime"), so a model would guess spellings and silently get an empty slice; the aggregates still report both as employers write them. Not available upstream at all: region or state, industry.

Configuration

Variable

Default

Meaning

HIRINGINDEX_API_KEY

required; also accepts RAPIDAPI_KEY

HIRINGINDEX_HOST

hiringindex.p.rapidapi.com

marketplace host

HIRINGINDEX_API_BASE

set this to call our backend directly instead of the marketplace

HIRINGINDEX_TIMEOUT_MS

30000

request timeout

Setting HIRINGINDEX_API_BASE switches auth from x-rapidapi-key to x-api-key and skips the marketplace entirely.

Why the handshake is local

The tools call REST endpoints directly instead of proxying a remote /mcp. The marketplace meters every request against the declared path, initialize and tools/list included. Going through this package, the handshake never leaves the machine and only real queries cost anything.

Output

Markdown by default — repeated fields render as tables, which costs fewer tokens than a labelled list and stays readable for a human. Pass format: "json" on any tool for the raw response.

Development

npm test          # 16 protocol checks, no key needed
HIRINGINDEX_API_KEY=... npm test   # 17 — adds live calls through the marketplace

The test drives the server the way a real client does: writes JSON-RPC to stdin, reads from stdout.

Before publishing

  1. Smoke test with a real key: done 2026-09-07 through the marketplace, 17/17 (search, insights, age report, single posting). Re-run before every publish.

  2. git init and add repository to package.json.

  3. The marketplace host is final (hiringindex.p.rapidapi.com, listing public since 2026-09-07), so the default in config.js will not need a major bump.

  4. Submit to the official MCP registry (no gatekeeper), then Docker MCP Registry and the Cline marketplace.

Note on the registry listing

Across 115 job-related servers in the official registry, the description is the only thing a browsing user reads, and the ones that get installed are narrow: a country, an industry, a single job family. "Job search with AI" is indistinguishable from a dozen others. Lead with the number, the source and the tool list — and with the age angle, which nobody else has taken.

Available Tools

4 tools
get_jobFetch one postingA
Read-onlyIdempotent

Full detail for a single posting by its id, including the description and the application link.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPosting id returned by search_jobs.
formatNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and open-world. The description adds useful behavioral detail by specifying that the response includes the full description and application link, which is not visible in annotations or schema.

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, front-loaded sentence conveys the essential purpose and key response contents. There is no filler or redundancy.

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 simple read-only retrieval tool, the description plus annotations provide sufficient context. There is no output schema, but the description names the main fields returned. The optional format parameter's meaning is the only notable gap.

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 50%: the required 'id' parameter is well-described, while 'format' has only an enum without explanation. The description adds little beyond the schema, only restating that retrieval is by id; it does not clarify the meaning or effect of the format parameter.

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?

Description states a specific verb ('get'), a concrete resource ('single posting'), and the key selector ('by its id'). It also identifies what the returned detail includes, making the tool's distinct role clear relative to sibling search_jobs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is used after obtaining a posting id, and the schema reinforces that the id is 'returned by search_jobs.' It does not explicitly name alternatives or state when not to use the tool, but the context is clear enough for basic routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

job_market_insightsAggregate a slice of the job marketA
Read-onlyIdempotent

Counts, salary percentiles by currency, remote share, top employers, seniority and employment-type mix, city and source split for any slice of postings. Accepts the same filters as search_jobs. Use this instead of paging through results when the question is about the market rather than about individual roles.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name as employers write it, e.g. "Berlin", "New York", "Bengaluru".
formatNo
titlesNoJob titles to match, e.g. ["Data Engineer"]. Terms shorter than 3 characters are rejected by the index.
companyNoRestrict to one employer by name.
countryNoCountry as ISO 3166-1 alpha-2 code ("US", "DE") or an English name ("Germany").
keywordsNoTerms mentioned anywhere in the posting — title or description — e.g. ["Kubernetes"]. Any keyword matches. Use titles for the role itself; keywords for a tool, skill or technology the posting talks about.
salary_maxNoHighest advertised salary to include.
salary_minNoLowest advertised salary to include. Only postings that disclose a salary match.
board_handleNoRestrict to one ATS board by its handle, exactly as the `handle` field of a posting reports it, e.g. "EndeavorITSolution" (SmartRecruiters) or "walmart:wd504:WalmartExternal" (Workday). The precise way to pull one employer's postings when names are ambiguous.
work_arrangementNoFilter by how the work is done. Hybrid is not a separate filter upstream.
posted_within_daysNoOnly postings published in the last N days.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, open-world, and idempotent behavior. The description adds useful behavioral context: it returns aggregate market statistics rather than a list of postings, and its filters are identical to search_jobs. This is more than what annotations alone convey, though no deep caveats like rate limits or data freshness are mentioned.

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?

Three sentences, all informative. The output metrics are front-loaded, the filter equivalence is stated compactly, and the usage guidance is one clear sentence. No filler or redundant restating of the tool name.

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?

With no output schema, the description carries the burden of explaining return values, and it does enumerate the main metric categories. It could be more explicit about the shape of the response and how the format parameter affects it, but the listed dimensions give an agent a solid mental model of what to expect.

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 description coverage is 91%, so the schema already explains individual parameters in detail. The description adds the cross-tool point that the tool accepts the same filters as search_jobs, which is helpful, but it does not need to repeat parameter-level semantics. Baseline of 3 is appropriate.

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?

The description names a specific action (aggregate/count) and a clear resource (slice of job postings), and enumerates the exact metrics returned: counts, salary percentiles, remote share, top employers, etc. It also distinguishes itself from paging through individual results, making the purpose obvious relative to siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use this instead of paging through results when the question is about the market rather than individual roles. It also states that it accepts the same filters as search_jobs, giving clear routing guidance against the main sibling tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

posting_age_reportHow long these postings have been openA
Read-onlyIdempotent

Age profile of a slice of postings: median days since publication, share posted in the last week, and share still open after sixty days. A listing that has been open for months is the most commonly cited sign that a role is not being actively filled — this reports the numbers rather than guessing.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name as employers write it, e.g. "Berlin", "New York", "Bengaluru".
formatNo
titlesNoJob titles to match, e.g. ["Data Engineer"]. Terms shorter than 3 characters are rejected by the index.
companyNoRestrict to one employer by name.
countryNoCountry as ISO 3166-1 alpha-2 code ("US", "DE") or an English name ("Germany").
keywordsNoTerms mentioned anywhere in the posting — title or description — e.g. ["Kubernetes"]. Any keyword matches. Use titles for the role itself; keywords for a tool, skill or technology the posting talks about.
salary_maxNoHighest advertised salary to include.
salary_minNoLowest advertised salary to include. Only postings that disclose a salary match.
board_handleNoRestrict to one ATS board by its handle, exactly as the `handle` field of a posting reports it, e.g. "EndeavorITSolution" (SmartRecruiters) or "walmart:wd504:WalmartExternal" (Workday). The precise way to pull one employer's postings when names are ambiguous.
work_arrangementNoFilter by how the work is done. Hybrid is not a separate filter upstream.
posted_within_daysNoOnly postings published in the last N days.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the call as read-only, idempotent, and open-world, so no safety disclosure is needed. The description adds useful behavioral context by naming exactly which statistics are returned and by framing the tool as a factual report ('reports the numbers rather than guessing'). It does not, however, describe edge cases like empty or unfiltered results.

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 sentences deliver the core metrics first and then provide rationale for the report. No filler or repetition; the description is appropriately sized and front-loaded.

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?

Given the rich 11-parameter schema and safety annotations, the description covers the essential output semantics even though there is no output schema. It names the computed metrics but does not specify output structure or behavior when no filters are supplied; these are minor gaps given the strong schema coverage.

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 description coverage is 91%, so the parameters are already well documented and the baseline is 3. The tool description only refers to 'a slice of postings' and does not add meaning to any specific parameter, but it also does not need to because the schema carries that weight.

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?

The description states a clear purpose: it computes an age profile ('median days since publication, share posted in the last week, and share still open after sixty days') for a filtered slice of postings. This is distinct from the sibling search/get tools and from general job_market_insights because it focuses specifically on how long postings have been open.

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 description implies a use case ('a listing that has been open for months is the most commonly cited sign that a role is not being actively filled'), but it never explicitly states when to prefer this over siblings or when not to use it. There is no alternative guidance, so the agent must infer when this aggregate age report is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_jobsSearch job postingsA
Read-onlyIdempotent

Search live job postings read directly from ten applicant tracking systems (Workday, SmartRecruiters, Greenhouse, Workable, Lever, Ashby, Recruitee, Teamtailor, Breezy, Personio). Returns title, employer where the ATS publishes it, location, employment type, advertised salary where disclosed, posting date and the employer's own apply link where the source carries one.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name as employers write it, e.g. "Berlin", "New York", "Bengaluru".
pageNoResult page, starts at 1.
limitNoPostings per page, up to 100.
formatNomarkdown (default) or raw json.
titlesNoJob titles to match, e.g. ["Data Engineer"]. Terms shorter than 3 characters are rejected by the index.
companyNoRestrict to one employer by name.
countryNoCountry as ISO 3166-1 alpha-2 code ("US", "DE") or an English name ("Germany").
keywordsNoTerms mentioned anywhere in the posting — title or description — e.g. ["Kubernetes"]. Any keyword matches. Use titles for the role itself; keywords for a tool, skill or technology the posting talks about.
salary_maxNoHighest advertised salary to include.
salary_minNoLowest advertised salary to include. Only postings that disclose a salary match.
board_handleNoRestrict to one ATS board by its handle, exactly as the `handle` field of a posting reports it, e.g. "EndeavorITSolution" (SmartRecruiters) or "walmart:wd504:WalmartExternal" (Workday). The precise way to pull one employer's postings when names are ambiguous.
work_arrangementNoFilter by how the work is done. Hybrid is not a separate filter upstream.
posted_within_daysNoOnly postings published in the last N days.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/idempotent, so the safety profile is covered. The description adds real value on top: live data sourced directly from ATSs, and conditional-field caveats — 'employer where the ATS publishes it', 'advertised salary where disclosed', 'apply link where the source carries one' — which warn the agent that fields are per-posting optional and not fully normalized.

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 sentences with zero waste: the action verb and scope are front-loaded, the ATS source list is high-value context, and the return-field enumeration earns its place since there is no output schema. Every sentence carries information an agent needs.

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 13-parameter tool with no output schema, this is nearly complete: the description documents the response contract via its return-field list, the schema covers all parameters at 100%, and annotations cover safety and open-world behavior. Minor gaps remain — result ordering, pagination semantics, and default format behavior are not stated — but nothing critical is missing.

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 description coverage is 100%, so the baseline of 3 applies. The description itself adds nothing about the 13 parameters; the schema already documents each one richly (3-character title minimum, hybrid not being a separate filter, board_handle ambiguity guidance, salary disclosure requirement). The description correctly defers to the schema here.

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?

The description pairs a specific verb and resource ('Search live job postings') with concrete detail: ten named ATS sources and the exact return fields (title, employer, location, employment type, salary, posting date, apply link). This clearly positions it against siblings like get_job (single posting) and job_market_insights (market-level analysis) without needing to open the schema.

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 description establishes clear scope ('live job postings read directly from ten applicant tracking systems') and enumerates what results contain, so when an agent wants a live posting search the choice is implied. However, it never names the siblings or states when NOT to use this tool — the selection guidance that does exist (titles vs keywords, board_handle for ambiguous names) lives in the schema, not the description.

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 updatesv0.1.0
    • First observedget_job
    • First observedjob_market_insights
    • First observedposting_age_report
    • First observedsearch_jobs

TDQS

A4.3/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct question: individual postings, aggregate market stats, single-post detail, and posting-age distribution. The overlap between search_jobs and job_market_insights is explicitly addressed in the descriptions, so an agent can reliably select the right tool.

Naming Consistency4/5

Two tools use an imperative verb_noun pattern (search_jobs, get_job), while the other two use descriptive noun phrases (job_market_insights, posting_age_report). This is a minor convention split, but the names are still clear and the pattern is readable.

Tool Count5/5

Four tools is well-scoped for a read-only job-market data server. Each tool covers a distinct and necessary operation without redundancy or bloat.

Completeness5/5

For the stated domain of job posting search and market analysis, the surface is complete: search, detail retrieval, aggregate insights, and posting-age reporting cover the core workflows. No obvious dead ends or missing lifecycle steps exist for this read-only domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    F
    maintenance
    Enables job market analysis by providing salary distributions, trends, regional vacancy counts, and employer leaderboards via the Adzuna API, complementing listings from other sources.
    7
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables searching live, normalized job postings from 30+ ATS feeds and job boards, with tools for job search, source listing, pricing plans, and Upwork jobs.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables users to retrieve live job postings from any iCIMS career site, providing structured data including title, requisition ID, employer, locations, employment type, dates, salary, and apply links.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Enables querying open job postings directly from company applicant-tracking systems (Greenhouse, Ashby, Lever), finding a company's job board, listing and comparing roles, and accessing salary data, all without scraping or API keys.
    3
    MIT