protogrid

Search / com.headcountlabs/jobs

Headcount Labs

R0· no sign-in

Job postings search: find, count and read open jobs from employer career sites, with pay and links.

v1.2.0 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality84new
Trust100of 100
Uptime, 30 days100%
Latency p50433 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "jobs": {
      "type": "http",
      "url": "https://api.headcountlabs.com/mcp/public"
    }
  }
}
claude mcp add --transport http jobs https://api.headcountlabs.com/mcp/public
[mcp_servers.jobs]
url = "https://api.headcountlabs.com/mcp/public"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "jobs": {
      "type": "remote",
      "url": "https://api.headcountlabs.com/mcp/public",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "jobs": {
      "type": "http",
      "url": "https://api.headcountlabs.com/mcp/public"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=jobs&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vYXBpLmhlYWRjb3VudGxhYnMuY29tL21jcC9wdWJsaWMifQ%3D%3D"
}
{
  "servers": {
    "jobs": {
      "type": "http",
      "url": "https://api.headcountlabs.com/mcp/public"
    }
  }
}
{
  "mcpServers": {
    "jobs": {
      "httpUrl": "https://api.headcountlabs.com/mcp/public"
    }
  }
}
extensions:
  "jobs":
    enabled: true
    name: "jobs"
    type: streamable_http
    uri: "https://api.headcountlabs.com/mcp/public"
    timeout: 300

Quality 84 / 100new

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorization83 · weight 15
  • pass
    auth.prmProtected Resource Metadata (RFC 9728) published
  • pass
    auth.as_metadataauthorization server metadata reachable
  • warn
    auth.cimdonly Dynamic Client Registration, deprecated in 2026-07-28 in favour of CIMD
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene93 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length3 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations6 of 6 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 6,844 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stabilityn/a · weight 15
  • n/a
    stability.changes, stability.rug_pulltool history recorded for 4 of the 7 days needed
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

6 tools, about 6,844 tokens to load them all · tool set dff2f11da3fd · tools last changed 2026-10-19 · checked 2026-10-19 10:52 UTC

Tool changes

  • count_jobschangeddescription, input schema
    before

    Count the current jobs matching the filters, without listing them. No account needed. To answer "which companies are hiring for X", pass group_by: "employer": the answer then also has employers (the top 25 by number of matching jobs, each with employer_name, company_id and jobs), employers_from_jobs (how many matching jobs were grouped, at most 1,000, taken in the default list order), employers_sampled (true when more jobs matched than were grouped, so the counts are from a sample) and employers_unknown_jobs (grouped jobs with no known employer name).

    after · 59% of words in common

    Count the current jobs matching the filters, without listing them. No account needed. To answer "which companies are hiring for X" or "how are these jobs split by ...", pass group_by: employer (company works too), work_arrangement (remote, hybrid or in_person), title, state (US), city (metro works too), country or employment_type. The answer then also has group_by, groups (the top 25 values by number of matching jobs, each with value and jobs), groups_from_jobs (how many matching jobs were grouped, at most 1,000, taken in the default list order), groups_sampled (true when more jobs matched than were grouped, so the counts are from a sample) and groups_unknown_jobs (grouped jobs with no known value). A job with several locations or postings can count under more than one value. group_by employer keeps its own keys: employers (each with employer_name, company_id and jobs), employers_from_jobs, employers_sampled and employers_unknown_jobs. When a filter is too broad to count exactly in time, count is an estimate: the answer then has count_is_estimate: true, count_margin (the 95% range either side of count) and count_note.

  • get_jobchangeddescription, input schemameaning changed
    before

    Get a job by its job_id, including every linked posting and its links. No account needed. Use fields to select top-level job properties; job_id is always included.

    after · 31% of words in common

    Get a job by its job_id. No account needed. By default the answer has the same compact shape search_jobs returns (rank 1, job_id, job_ad, company_id, locations, work_arrangement, pay, posted_at, first_seen_at, posting_url, apply_url) with the whole description in job_ad.description, currentness, stale and last_checked_at (is it still open, and when was it last checked), and every linked posting in postings (status, last_fetched_at, application_check). Pass view: "full" for every field as the REST API returns it. Use fields to select top-level job properties; job_id is always included.

  • search_jobschangeddescription, input schema
    before

    Search current job postings by keyword, title, company, place, pay, date and more. No account needed. Call list_fields (free) to find the filter names. Country and employment_type accept comma-separated values or arrays and match any listed value. Pages return up to 25 jobs (limit, default 10); pass next_cursor as cursor to see the next page. One search shows up to 100 jobs in total, so narrow it with filters to find the right ones; count_jobs tells you how many jobs match without listing them. sort is relevance (best match) or updated (most recently updated). By default each job is a compact summary: rank, job_id, job_ad (the employer-written title, employer and a 200-character snippet of the description), company_id, locations, work_arrangement, pay (min, max, currency, period), posted_at, first_seen_at, posting_url and apply_url. For every field of each job pass view: "full" (descriptions cut to 400 characters, or descriptions: "full" for the whole text), name the top-level properties you need in fields (job_id is always included), or call get_job for one job. For job titles, title matches the words as one phrase in that order, so "senior software engineer" misses "Software Engineer, Senior"; title_advanced matches words in any order with AND, OR and NOT, for example senior AND ("software engineer" OR "software developer"), and usually finds more.

    after · 82% of words in common

    Search current job postings by keyword, title, company, place, pay, date and more. No account needed. Call list_fields (free) to find the filter names. Country and employment_type accept comma-separated values or arrays and match any listed value. Pages return up to 50 jobs (limit, default 10), or up to 10 jobs when descriptions is "full"; a larger limit is refused. Pass next_cursor as cursor to see the next page. One search shows up to 250 jobs in total (the last page is shortened to fit), so narrow it with filters to find the right ones; count_jobs tells you how many jobs match without listing them. sort is relevance (best match) or updated (most recently updated). By default each job is a compact summary: rank, job_id, job_ad (the employer-written title, employer and a 200-character snippet of the description), company_id, locations, work_arrangement, pay (min, max, currency, period), posted_at, first_seen_at, posting_url and apply_url. For every field of each job pass view: "full" (descriptions cut to 400 characters, or descriptions: "full" for the whole text), name the top-level properties you need in fields (job_id is always included), or call get_job for one job. You choose how much description each job gets: descriptions: "snippet" (the default) gives a short preview and allows up to 50 jobs per page; descriptions: "full" gives the whole text but allows only 10 jobs per page. To read the full text of just a few jobs, search with snippets, then call get_job on the ones you want. Leave description out of fields to drop it entirely. For job titles, title matches the words as one phrase in that order, so "senior software engineer" misses "Software Engineer, Senior"; title_advanced matches words in any order with AND, OR and NOT, for example senior AND ("software engineer" OR "software developer"), and usually finds more.

  • search_jobschangeddescription, input schema
    before

    Search current job postings by keyword, title, company, place, pay, date and more. No account needed. Call list_fields (free) to find the filter names. Country and employment_type accept comma-separated values or arrays and match any listed value. Pages return up to 25 jobs (limit, default 10); pass next_cursor as cursor to see the next page. One search shows up to 100 jobs in total, so narrow it with filters to find the right ones; count_jobs tells you how many jobs match without listing them. sort is relevance (best match) or updated (most recently updated). Each job has its employer, title, locations, pay with its period, dates, and the posting link in postings[].posting_url and postings[].application_url. Use fields to select top-level job properties; job_id is always included. Each job's description is cut to its first 400 characters (description_truncated: true); pass descriptions: "full" for the whole text of every job, or call get_job for one job. For job titles, title matches the words as one phrase in that order, so "senior software engineer" misses "Software Engineer, Senior"; title_advanced matches words in any order with AND, OR and NOT, for example senior AND ("software engineer" OR "software developer"), and usually finds more.

    after · 79% of words in common

    Search current job postings by keyword, title, company, place, pay, date and more. No account needed. Call list_fields (free) to find the filter names. Country and employment_type accept comma-separated values or arrays and match any listed value. Pages return up to 25 jobs (limit, default 10); pass next_cursor as cursor to see the next page. One search shows up to 100 jobs in total, so narrow it with filters to find the right ones; count_jobs tells you how many jobs match without listing them. sort is relevance (best match) or updated (most recently updated). By default each job is a compact summary: rank, job_id, job_ad (the employer-written title, employer and a 200-character snippet of the description), company_id, locations, work_arrangement, pay (min, max, currency, period), posted_at, first_seen_at, posting_url and apply_url. For every field of each job pass view: "full" (descriptions cut to 400 characters, or descriptions: "full" for the whole text), name the top-level properties you need in fields (job_id is always included), or call get_job for one job. For job titles, title matches the words as one phrase in that order, so "senior software engineer" misses "Software Engineer, Senior"; title_advanced matches words in any order with AND, OR and NOT, for example senior AND ("software engineer" OR "software developer"), and usually finds more.

  • market_insightschangeddescription, input schema
    before

    Answer common job-market questions (top employers, pay, remote share, top metros, jobs by state, top roles, new postings this week, pay transparency, posting age, employers hiring in the most states) from a precomputed snapshot of current US jobs, rebuilt after each full pass over the job boards and checked by recomputing sample answers a second way. Every answer carries as_of, its open_jobs count, a one-line method, the check result and search filters for search_jobs or count_jobs. A role outside the snapshot's top roles returns available: false with count_jobs filters for a live count. Free.

    after · 51% of words in common

    Answer job-market questions from a precomputed snapshot of current US jobs, rebuilt after each full pass over the job boards and checked by recomputing sample answers a second way. Ten ready-made questions (top employers, pay, remote share, top metros, jobs by state, top roles, new postings this week, pay transparency, posting age, employers hiring in the most states) plus a generic lookup of any metric (job count, pay 10th to 90th percentile, share showing pay, remote/hybrid/in-person shares, posting age, new postings, top employers) by one or two dimensions (title, place, company, seniority, employment type, remote), a breakdown that ranks one dimension, a negotiate question ("what salary should I ask for?" for a title, a place and an optional seniority) and a dimensions call that lists what can be asked. Cells with fewer than 30 jobs, and pay figures from fewer than 30 jobs with pay, are left out; every answer carries its sample size, as_of, a one-line method, the check result and search filters for search_jobs or count_jobs. Free.

  • market_insightsadded

    Answer common job-market questions (top employers, pay, remote share, top metros, jobs by state, top roles, new postings this week, pay transparency, posting age, employers hiring in the most states) from a precomputed snapshot of current US jobs, rebuilt after each full pass over the job boards and checked by recomputing sample answers a second way. Every answer carries as_of, its open_jobs count, a one-line method, the check result and search filters for search_jobs or count_jobs. A role outside the snapshot's top roles returns available: false with count_jobs filters for a live count. Free.

Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 100 / 100

provenance100
liveness100
freshness100
hygiene100

+repository +namespace-matches-repo +dns-namespace +website +reachable +uptime-100% +updated-0d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://api.headcountlabs.com/mcp/public streamable-httpnoneyes100%433 ms2025-11-252026-10-19
https://api.headcountlabs.com/mcp streamable-httpoauth2 AS: https://api.headcountlabs.comyes100%472 ms–2026-10-19

Tools (6)

count_jobsread-onlyCount the current jobs matching the filters, without listing them. No account needed. To answer "which companies are hiring for X" or "how are these jobs split by ...", pass group_by: employer (company works too), work_arrangement (remote, hybrid or in_person), title, state (US), city (metro works too), country or employment_type. The answer then also has group_by, groups (the top 25 values by number of matching jobs, each with value and jobs), groups_from_jobs (how many matching jobs were grouped, at most 1,000, taken in the default list order), groups_sampled (true when more jobs matched than were grouped, so the counts are from a sample) and groups_unknown_jobs (grouped jobs with no known value). A job with several locations or postings can count under more than one value. group_by employer keeps its own keys: employers (each with employer_name, company_id and jobs), employers_from_jobs, employers_sampled and employers_unknown_jobs. When a filter is too broad to count exactly in time, count is an estimate: the answer then has count_is_estimate: true, count_margin (the 95% range either side of count) and count_note.
get_jobread-onlyGet a job by its job_id. No account needed. By default the answer has the same compact shape search_jobs returns (rank 1, job_id, job_ad, company_id, locations, work_arrangement, pay, posted_at, first_seen_at, posting_url, apply_url) with the whole description in job_ad.description, currentness, stale and last_checked_at (is it still open, and when was it last checked), and every linked posting in postings (status, last_fetched_at, application_check). Pass view: "full" for every field as the REST API returns it. Use fields to select top-level job properties; job_id is always included.
list_fieldsread-onlyFind the search_jobs filters and the job fields that match some keywords, with each one's type and a short description. Pass words such as ["pay", "remote"]; no keywords lists everything. kind is filter (pass it in search_jobs filters) or field (a property of each returned job; postings[].x is a property of each linked posting). A field state is an object whose state says whether the source published the value (known), Atlas derived it, the source omitted it, or extraction failed. Free.
market_insightsread-onlyAnswer job-market questions from a precomputed snapshot of current US jobs, rebuilt after each full pass over the job boards and checked by recomputing sample answers a second way. Ten ready-made questions (top employers, pay, remote share, top metros, jobs by state, top roles, new postings this week, pay transparency, posting age, employers hiring in the most states) plus a generic lookup of any metric (job count, pay 10th to 90th percentile, share showing pay, remote/hybrid/in-person shares, posting age, new postings, top employers) by one or two dimensions (title, place, company, seniority, employment type, remote), a breakdown that ranks one dimension, a negotiate question ("what salary should I ask for?" for a title, a place and an optional seniority) and a dimensions call that lists what can be asked. Cells with fewer than 30 jobs, and pay figures from fewer than 30 jobs with pay, are left out; every answer carries its sample size, as_of, a one-line method, the check result and search filters for search_jobs or count_jobs. Free.
search_docsread-onlyAsk a question about Headcount Labs (filters, limits, MCP setup, errors) and get the best-matching sections of the headcountlabs.com docs, each with its URL. Free, and works without an account.
search_jobsread-onlySearch current job postings by keyword, title, company, place, pay, date and more. No account needed. Call list_fields (free) to find the filter names. Country and employment_type accept comma-separated values or arrays and match any listed value. Pages return up to 50 jobs (limit, default 10), or up to 10 jobs when descriptions is "full"; a larger limit is refused. Pass next_cursor as cursor to see the next page. One search shows up to 250 jobs in total (the last page is shortened to fit), so narrow it with filters to find the right ones; count_jobs tells you how many jobs match without listing them. sort is relevance (best match) or updated (most recently updated). By default each job is a compact summary: rank, job_id, job_ad (the employer-written title, employer and a 200-character snippet of the description), company_id, locations, work_arrangement, pay (min, max, currency, period), posted_at, first_seen_at, posting_url and apply_url. For every field of each job pass view: "full" (descriptions cut to 400 characters, or descriptions: "full" for the whole text), name the top-level properties you need in fields (job_id is always included), or call get_job for one job. You choose how much description each job gets: descriptions: "snippet" (the default) gives a short preview and allows up to 50 jobs per page; descriptions: "full" gives the whole text but allows only 10 jobs per page. To read the full text of just a few jobs, search with snippets, then call get_job on the ones you want. Leave description out of fields to drop it entirely. For job titles, title matches the words as one phrase in that order, so "senior software engineer" misses "Software Engineer, Senior"; title_advanced matches words in any order with AND, OR and NOT, for example senior AND ("software engineer" OR "software developer"), and usually finds more.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "com.headcountlabs/jobs",
  "icons": [
    {
      "src": "https://api.headcountlabs.com/icon-512.png",
      "sizes": [
        "512x512"
      ],
      "mimeType": "image/png"
    },
    {
      "src": "https://headcountlabs.com/favicon.svg",
      "sizes": [
        "any"
      ],
      "mimeType": "image/svg+xml"
    }
  ],
  "title": "Headcount Labs",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://api.headcountlabs.com/mcp/public",
      "type": "streamable-http"
    },
    {
      "url": "https://api.headcountlabs.com/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "1.2.0",
  "repository": {
    "id": "1416617654",
    "url": "https://github.com/HeadcountLabs/headcountlabs-mcp",
    "source": "github"
  },
  "websiteUrl": "https://headcountlabs.com/mcp/",
  "description": "Job postings search: find, count and read open jobs from employer career sites, with pay and links."
}