ATS Jobs

Open jobs read from a company's own careers system: Greenhouse, Ashby, Lever.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
93%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~530Tokens (tool definitions)
~1.1 KBTypical response size
Minimal attention impact (0.41% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "ats-jobs-mcp": {
      "command": "uvx",
      "args": [
        "ats-jobs-mcp"
      ]
    }
  }
}

Runnable packages

pypiats-jobs-mcp1.1.0stdio

Remote endpoints

https://ats-jobs-api.groundtruthtools.workers.dev/mcpstreamable-http

What it can do

Tool inventory

Tools (3)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡find_company_board(company, limit)

Find which applicant-tracking system a company's careers page runs on. Greenhouse, Ashby and Lever all publish open job board APIs, and all of them are unusable unless you already know the company's board name. None publishes a directory of its customers, and none could, since no vendor knows about the others. Use this first when you have a company name rather than a careers URL.

Input Schema

{
  "type": "object",
  "properties": {
    "company": {
      "type": "string",
      "description": "Company name or board name, for example 'anthropic' or '1Password'. Case and punctuation do not matter."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 10,
      "description": "Maximum matches to return."
    }
  },
  "required": [
    "company"
  ]
}
🟢list_open_jobs(company, limit, include_description)

Every open job at one company, read from its own careers system. Returns title, department, location, employment type, workplace type, posted date, a parsed salary range where the employer publishes one, and a verify_url pointing at the employer's own advert. Salaries are refused rather than guessed: an hourly rate, an ambiguous currency, or bands in two currencies all yield no figure, and salary_text keeps whatever the employer wrote.

Input Schema

{
  "type": "object",
  "properties": {
    "company": {
      "type": "string",
      "description": "A board name ('stripe'), a careers URL ('https://jobs.ashbyhq.com/ramp'), or system:name ('ashby:ramp')."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50,
      "description": "Maximum postings to return."
    },
    "include_description": {
      "type": "boolean",
      "default": false,
      "description": "Include the full job description. Off by default because descriptions are long; contact details are removed either way."
    }
  },
  "required": [
    "company"
  ]
}
⚪compare_companies(companies, per_company)

Open jobs across several companies at once, in one schema. This is the thing no single applicant-tracking system can do: each vendor only knows about its own customers. Companies on different systems come back with the same field names. One company failing does not lose the others.

Input Schema

{
  "type": "object",
  "properties": {
    "companies": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "maxItems": 20,
      "description": "Up to 20 company board names or careers URLs."
    },
    "per_company": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 25,
      "description": "Maximum postings per company."
    }
  },
  "required": [
    "companies"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded3 tools
verifiedversion not recorded3 tools
verifiedversion not recorded3 tools