Skip to main content
Glama

fecklesspleb-actors-mcp

An MCP server that gives AI agents 14 tools: 10 on by default for SEO audits, page metadata, sitemaps, Hacker News search and job listings, plus 4 opt-in web tools for Markdown crawling, image downloads, screenshots and broken-link checks. Each tool runs one of my public Apify Actors and returns the results in the tool response.

Disclosure: I (fecklesspleb) wrote and maintain this server and every Actor it calls. Runs are billed per result to your own Apify account at the Actors' Store prices, and some of that money comes to me as the Actor developer. This project is not affiliated with or endorsed by Apify, Greenhouse, Lever, Ashby, Workday, Remote OK, We Work Remotely, Jobicy, Hacker News, Y Combinator or Algolia.

Why use this instead of Apify's own MCP server

You don't have to. Apify's official server can run these Actors too:

  • Hosted: https://mcp.apify.com?tools=fecklesspleb/website-seo-audit,fecklesspleb/sitemap-extractor (OAuth, or an Authorization: Bearer <APIFY_TOKEN> header)

  • Local: npx -y @apify/actors-mcp-server --tools fecklesspleb/website-seo-audit,fecklesspleb/sitemap-extractor with APIFY_TOKEN set

This server is a smaller, focused option:

  • The results come back in the tool call. Each call uses Apify's synchronous run-sync-get-dataset-items endpoint, so the agent gets the dataset items directly instead of a run ID to poll.

  • Every call has a dollar cap. maxCostUsd (default $0.25) is sent to Apify as maxTotalChargeUsd. A server-side ceiling (default $5) caps what an agent can ask for.

  • Small defaults. When the agent leaves them out, the server sets limits such as 25 jobs, 50 Hacker News items or 10 pages per site. Job descriptions are left out unless the agent asks for them, which keeps responses short.

  • Input schemas stay current. At startup the server reads each Actor's input schema from its live Apify build, so the tools accept exactly what the Actors accept. If Apify can't be reached, it uses a bundled snapshot.

Related MCP server: web-data-mcp

Tools

Prices are the Apify Store prices when this was written. The live price is on each Actor's page.

core (5 tools, on by default)

Tool

Actor

What it returns

Price

seo_audit_website

website-seo-audit

Crawls a site from startUrls (same host) and returns one record per page: status, score 0-100, issues (title, meta description, H1, canonical, noindex, alt text, thin content, Open Graph, JSON-LD, slow pages)

$0.003 per page + $0.00005 per run start

extract_website_metadata

website-metadata-extractor

For each of urls: title, meta description, canonical, language, Open Graph, Twitter card, JSON-LD, favicon, RSS feeds, hreflang. Rows for URLs that could not be read are free

$0.001 per URL + $0.00005 per run start

extract_sitemap_urls

sitemap-extractor

Every URL in a site's sitemaps (found through robots.txt, or from a sitemap URL you pass) with lastmod, changefreq, priority. Regex and date filters

$0.0002 per URL

search_hacker_news

hacker-news-scraper

mode: "search": HN stories and comments by keyword, points, comments and date (HN Search API by Algolia). mode: "whoIsHiring": job records from the monthly "Ask HN: Who is hiring?" thread

$0.00015 per item

search_remote_jobs

remote-jobs-aggregator

One deduplicated list of remote jobs from the Remote OK, We Work Remotely and Jobicy feeds, with the source on every job. Keyword, location, salary and date filters

$0.001 per job

jobs (5 tools, on by default)

Open jobs from company career sites. Each job has the company, title, location, remote flag, department, employment type, salary (when the posting gives one), posting date and URL.

Tool

Actor

Pass companies as

Price

greenhouse_jobs

greenhouse-jobs-scraper

Greenhouse slugs (airbnb), board URLs or careers pages. Or set searchDirectory: true

$0.001 per job

lever_jobs

lever-jobs-scraper

Lever slugs (palantir), board URLs or careers pages. Or set searchDirectory: true

$0.001 per job

ashby_jobs

ashby-jobs-scraper

Ashby slugs (ramp), board URLs or careers pages. Or set searchDirectory: true

$0.001 per job

workday_jobs

workday-jobs-scraper

Full Workday career site URLs, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite

$0.002 per job

ats_jobs

ats-jobs-scraper

Board URLs or careers pages on Greenhouse, Lever, Ashby, Workday, Workable, Recruitee or Teamtailor (Polymer and HireHive by URL). Use it when you don't know which ATS a company uses

$0.002 per job

web (4 tools, opt-in: FECKLESSPLEB_TOOLSETS=core,jobs,web or all)

Tool

Actor

What it returns

Price

crawl_website_to_markdown

website-to-markdown-crawler

Pages of a site as Markdown or text

$0.0008 per page + $0.00005 per run start

download_images

bulk-image-downloader

Links to images and files saved in your Apify storage, with size, dimensions, alt text, SHA-256

$0.001 per file + $0.00005 per run start

screenshot_website

website-screenshot

Links to PNG/JPEG screenshots (and optional PDFs) saved in your Apify storage

$0.0008 per screenshot + $0.00005 per run start

check_broken_links

broken-link-checker

Broken links and images with the page, link text and status code

$0.003 per broken link ($0.0005 per checked link when onlyBroken is off) + $0.00005 per run start

The "run start" charge is per GB of run memory, once per run.

Every tool also takes maxCostUsd. All other arguments are the Actor's own input fields, described in the tool's input schema.

Setup

You need Node.js 20 or newer and an Apify account. Copy your API token from Apify Console > Settings > API & Integrations.

Claude Desktop, Cursor and other clients that use an mcpServers config:

{
  "mcpServers": {
    "fecklesspleb-actors": {
      "command": "npx",
      "args": ["-y", "fecklesspleb-actors-mcp"],
      "env": { "APIFY_TOKEN": "<your Apify API token>" }
    }
  }
}

Claude Code:

claude mcp add fecklesspleb-actors --env APIFY_TOKEN=<your Apify API token> -- npx -y fecklesspleb-actors-mcp

From source:

git clone https://github.com/fecklesspleb/actors-mcp.git
cd actors-mcp
npm ci && npm run build
APIFY_TOKEN=<your Apify API token> node dist/index.js

Docker:

docker build -t fecklesspleb-actors-mcp .
docker run -i --rm -e APIFY_TOKEN=<your Apify API token> fecklesspleb-actors-mcp

Configuration

Variable

Default

Meaning

APIFY_TOKEN

(required for calls)

Your Apify API token. Tools are still listed without one, but calls return an error.

FECKLESSPLEB_TOOLSETS

core,jobs

Comma-separated: core, jobs, web, or all.

APIFY_MAX_COST_USD

0.25

Cap per call when the agent doesn't pass maxCostUsd. Must be a positive number; 0, negative values and non-numbers stop the server at startup. A value above the ceiling is lowered to the ceiling.

APIFY_MAX_COST_CEILING_USD

5

Highest maxCostUsd an agent can request. Bigger values are lowered to this. Must be a positive number.

APIFY_RUN_TIMEOUT_SECS

280

Run timeout sent to Apify. 0 uses the Actor's own timeout.

MAX_OUTPUT_CHARS

60000

Longest tool response. Longer results are cut short, and the response says how many items were left out.

FECKLESSPLEB_LIVE_SCHEMAS

1

Set to 0 to skip the live schema lookup and use the bundled snapshots.

APIFY_API_BASE_URL

https://api.apify.com/v2

API base URL. Only for testing against a mock API; leave unset. Must be https; plain http is accepted only for localhost, 127.0.0.1 and ::1.

What a call returns

{
  "actor": "fecklesspleb/sitemap-extractor",
  "itemCount": 2,
  "maxCostUsd": 0.25,
  "items": [
    { "url": "https://example.com/blog/a", "lastmod": "2026-10-01", "sitemapUrl": "https://example.com/sitemap.xml" },
    { "url": "https://example.com/blog/b", "lastmod": "2026-10-03", "sitemapUrl": "https://example.com/sitemap.xml" }
  ]
}

items are the Actor's dataset items, unchanged. The fields for each Actor are listed on its Apify Store page.

Limits

  • Apify's synchronous endpoint waits at most 300 seconds. A longer run returns an error, but the run may keep going in your Apify Console. Ask for fewer URLs, pages or companies.

  • Results larger than MAX_OUTPUT_CHARS are cut short. The full dataset stays in your Apify account.

  • Screenshots and downloaded files are returned as links to your Apify storage, not as image data.

Development

Building and running the tests needs Node.js 20.19 or newer (on Node 22, 22.12 or newer), because the test runner (Vitest, on Vite 8) requires it. Running the server still needs only Node.js 20 or newer.

npm ci
npm run build
npm test                  # builds, then runs unit, protocol and token-leak tests against a mocked Apify API, no network
APIFY_TOKEN=<your Apify API token> npm run e2e   # one real call (Hacker News, 5 items, about $0.00075, billed to that account)
npm run snapshot-schemas  # refresh the bundled input schemas from the live Actor builds

License

MIT. Copyright (c) 2026 fecklesspleb.

Available Tools

10 tools
ashby_jobsOpen jobs from Ashby job boardsA
Read-only

Open jobs from companies that hire through Ashby (jobs.ashbyhq.com). Pass companies as Ashby slugs (e.g. 'ramp'), board URLs or careers pages that embed an Ashby board; or set searchDirectory to true to search a built-in directory of boards. Filter with keywords, excludeKeywords, locations, remoteOnly and postedWithinDays. Full descriptions are off by default here to save tokens; set includeDescription to true to get them. Not affiliated with Ashby. Cost, charged to your own Apify account: $0.001 per job returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxTotalJobs=25, includeDescription=false. Runs Apify Actor fecklesspleb/ashby-jobs-scraper (https://apify.com/fecklesspleb/ashby-jobs-scraper).

NameRequiredDescriptionDefault
keywordsNoTitle keywords (any). Keep jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all.
companiesNoAshby companies (slugs, board URLs or careers pages). One entry per company. Accepts an Ashby slug such as 'ramp', a board URL on jobs.ashbyhq.com, or a company careers page that embeds an Ashby board. Leave empty, with the directory off, for a demo run: up to 5 sample jobs from https://jobs.ashbyhq.com/ramp at the normal per-job price. If no entry can be read, the run fails with an error. The form is prefilled with this sample board and 'Max jobs in total' 5, which runs the same small demo (5 x $0.001 = $0.005); replace it with your own boards and clear or raise 'Max jobs in total' for a real run.
locationsNoLocations (any). Keep jobs whose location contains one of these strings, for example 'London', 'United States', 'Remote'.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
remoteOnlyNoRemote jobs only. Keep only jobs marked remote by the ATS or with 'remote' in the location.
departmentsNoDepartments or teams (any). Keep jobs whose department or team contains one of these strings, for example 'Engineering'.
onlyNewJobsNoOnly new jobs (monitoring mode). Return only jobs not returned by a previous run with this option on. State is kept in a named key-value store, so scheduled runs give you a clean feed of new postings and you pay only for new ones.
maxTotalJobsNoMax jobs in total. Stop the whole run after this many jobs. 0 means no limit (the value used when the field is empty). The run also stops at your 'Maximum cost per run'. The form is prefilled with 5 for a cheap sample run (5 x $0.001 = $0.005); clear it or raise it for real runs.
maxConcurrencyNoCompanies in parallel. How many companies to scrape at the same time. Requests to each host are rate limited regardless.
stateStoreNameNoState store name. Named key-value store used by 'Only new jobs'. Use different names for independent monitors.ashby-jobs-scraper-state
excludeKeywordsNoExclude title keywords. Drop jobs whose title contains any of these words, for example 'intern' or 'senior'.
searchDirectoryNoSearch the built-in company directory. Also scrape every board in the built-in directory of 489 verified Ashby boards (startups and tech companies). Combine with keyword, location and date filters to search across companies without listing them yourself.
postedWithinDaysNoPosted within last N days. Keep only jobs first published in the last N days. Empty keeps all.
descriptionFormatNoDescription format. Plain text, HTML, or both. Values: text = Plain text; html = HTML; both = Both.text
maxJobsPerCompanyNoMax jobs per company. Stop after this many matching jobs per company. 0 means no limit.
includeDescriptionNoInclude description. Include the full job description.
includeUndatedJobsNoKeep jobs without a posting date. When 'Posted within last N days' is set, keep jobs whose ATS does not expose a date.
searchInDescriptionNoMatch keywords in description too. Also match 'Title keywords' against the job description. Requires 'Include description'.
maxDirectoryCompaniesNoMax directory companies. Use only the N largest boards from the directory. 0 means all.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the read-only and open-world annotations, it discloses the per-job charge to the caller's own Apify account, the per-call cost cap and its default, server-applied defaults, and the token-saving description behavior. It also identifies the exact external Apify actor and includes a non-affiliation notice.

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?

The purpose is front-loaded, and the remaining sentences cover operating modes, output tradeoffs, pricing, defaults, and implementation. The content is generally useful, but the dense single paragraph and duplication of schema details reduce scannability.

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 complex, paid scraping tool, the description covers the essential source-selection modes, filtering, cost controls, description behavior, and backend, while the schema documents advanced monitoring and concurrency options. Because there is no output schema, it would be more complete with a brief overview of the returned job records or result structure.

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 schema already documents all 19 parameters and the baseline is 3. The description usefully summarizes source selection, filters, includeDescription, maxCostUsd, and defaults, but most of this repeats structured parameter documentation rather than adding new constraints or syntax.

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 that the tool retrieves open jobs from companies using Ashby and identifies the jobs.ashbyhq.com board scope. This clearly distinguishes it from greenhouse_jobs, lever_jobs, workday_jobs, and broader job-search siblings.

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?

It gives concrete invocation paths: supply Ashby slugs, board URLs, or embedding careers pages, or set searchDirectory to true for directory-wide discovery. It also explains when to enable includeDescription, but does not explicitly route non-Ashby or general remote-job requests to sibling tools.

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

ats_jobsOpen jobs from any of 9 applicant tracking systemsA
Read-only

Open jobs from company career pages on Greenhouse, Lever, Ashby, Workday, Workable, Recruitee and Teamtailor (Polymer and HireHive by URL), normalised into one schema. Use it when you have a mix of companies or do not know which ATS a company uses; pass board URLs or careers pages in companies. Also filters by salary, seniority, work arrangement and staffing agencies. Filter with keywords, excludeKeywords, locations, remoteOnly and postedWithinDays. Full descriptions are off by default here to save tokens; set includeDescription to true to get them. Not affiliated with any ATS vendor. Cost, charged to your own Apify account: $0.002 per job returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxTotalJobs=25, includeDescription=false. Runs Apify Actor fecklesspleb/ats-jobs-scraper (https://apify.com/fecklesspleb/ats-jobs-scraper).

NameRequiredDescriptionDefault
dedupeByNoRemove duplicate jobs. Drop duplicates inside this run before they are output, so you never pay for them. None: every job is output (as before). Same job: a job with the same company, title and first location as one already output in this run is dropped (the dedupeKey field). Same company and title (merge locations): jobs of one company with the same title are output as one record whose locations list holds all their locations, with duplicateCount and mergedUids; such records are output when the company's board has been read. Duplicates of jobs output by earlier runs are not affected (use Only new jobs for that). Values: none = None; job = Same job (company + title + location); companyTitle = Same company and title (merge locations).none
keywordsNoTitle keywords (any). Keep jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all.
companiesNoCompanies (career board URLs or slugs). One entry per company. Accepts: a board URL (https://boards.greenhouse.io/airbnb, https://jobs.lever.co/leverdemo, https://jobs.ashbyhq.com/ramp, https://apply.workable.com/huggingface, https://bunq.recruitee.com, https://proxima.teamtailor.com, https://jobs.polymer.co/practice, https://hirehive-testing-account.hirehive.com, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite or https://wd5.myworkdaysite.com/recruiting/qvc/QRG), an explicit 'ats:slug' such as 'greenhouse:airbnb' or 'polymer:practice', a bare slug such as 'stripe' (the Actor tries each ATS except Polymer and HireHive, which need their URL or prefix), or a company careers page that embeds one of these boards. Leave empty, with the directory off, for a demo run: up to 4 sample jobs from https://boards.greenhouse.io/airbnb at the normal per-job price. If no entry can be read, the run fails with an error. The form is prefilled with this sample board and 'Max jobs in total' 4, which runs the same small demo (4 x $0.002 = $0.008); replace it with your own boards and clear or raise 'Max jobs in total' for a real run.
hasSalaryNoOnly jobs with a salary. Return only jobs that state a salary, from the ATS's pay field or a range in the description (any currency or period). Jobs without one are dropped before they are output, so they are never charged.
locationsNoLocations (any). Keep jobs whose location contains one of these strings, for example 'London', 'United States', 'Remote'.
seniorityNoSeniority. Keep jobs with one of these seniority levels (derived from the title). Jobs whose title shows no level are left out when this is set. Empty by default (no change).
timeRangeNoPosted within (fixed window). Optional. Only jobs whose ATS publish or update date falls in this window, as in career-site-jobs-feed. When set it replaces 'Posted within days'; 'Any time' turns the date limit off. Undated jobs follow 'Include undated jobs'. Empty by default (no change). Values: 1h = Last hour; 24h = Last 24 hours; 7d = Last 7 days; 30d = Last 30 days; all = Any time.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
remoteOnlyNoRemote jobs only. Keep only jobs marked remote by the ATS or with 'remote' in the location.
departmentsNoDepartments or teams (any). Keep jobs whose department or team contains one of these strings, for example 'Engineering'. Workday jobs have no department field, so this filter removes all Workday jobs.
onlyNewJobsNoOnly new jobs (monitoring mode). Return only jobs not returned by a previous run with this option on. State is kept in a named key-value store, so scheduled runs give you a clean feed of new postings and you pay only for new ones.
maxTotalJobsNoMax jobs in total. Stop the whole run after this many jobs. 0 means no limit (the value used when the field is empty). The run also stops at your 'Maximum cost per run'. The form is prefilled with 4 for a cheap sample run (4 x $0.002 = $0.008); clear it or raise it for real runs.
includeExpiredNoReport expired jobs. On scheduled runs, add a free record with status 'expired' for each job an earlier run returned that its board no longer lists. Only boards read completely in this run are checked (not when 'Max jobs per company', 'Max total jobs' or the cost limit stopped the read, or when a Workday site has rows past its 2,000-row cap that could not be reached). Job records get status 'active' while this is on. Uses the state store.
maxConcurrencyNoCompanies in parallel. How many companies to scrape at the same time. Requests to each host are rate limited regardless.
redactContactsNoRemove contact details from descriptions. Replace e-mail addresses, phone numbers and 'Your recruiter: ' lines in job descriptions with placeholders. On by default; the Actor never outputs recruiter or hiring-manager fields.
stateStoreNameNoState store name. Named key-value store used by 'Only new jobs'. Use different names for independent monitors.ats-jobs-scraper-state
trackFirstSeenNoTrack first-seen dates. Keep firstSeenAt across runs (in the same named key-value store) without dropping jobs you already got. 'Only new jobs' turns this on automatically.
employmentTypesNoEmployment type. Keep jobs whose normalised employment type is one of these. Jobs whose ATS gives no type are left out when this is set. Empty by default (no change).
excludeAgenciesNoExclude recruiting agencies. Leave out jobs that look like they were posted by a staffing or recruitment agency: the company name (e.g. Randstad, Hays, "… Staffing", "… Recruitment", "Personalberatung") or wording such as "on behalf of our client" or "für unseren Kunden suchen wir" in the description. It is a heuristic, so check the isAgency field before relying on it. Every job carries isAgency whether or not this is on; excluded jobs are never output or charged.
excludeKeywordsNoExclude title keywords. Drop jobs whose title contains any of these words, for example 'intern' or 'senior'.
searchDirectoryNoSearch the built-in company directory. Also scrape every board in the Actor's built-in directory of verified public career boards (startups and tech companies, refreshed with each Actor version). Combine with keyword, location and date filters to search across companies without listing them yourself.
visaSponsorshipNoVisa sponsorship. Filter on visaSponsorship, read from the description text (yes / no / not stated). Pattern-based, not a legal statement by the employer. When on, job details are fetched (slower runs) and visaSponsorship / visaSponsorshipEvidence are added to each record; the description itself is still only output when 'Include description' is on. Values: any = Any; yes = Mentions sponsorship is offered; not_no = Exclude jobs that say no sponsorship.any
workArrangementNoWork arrangement. Keep jobs with one of these arrangements (derived from the ATS field, location and title). Jobs with no detectable arrangement are left out when this is set. Empty by default (no change).
postedWithinDaysNoPosted within last N days. Keep only jobs first published in the last N days. Empty keeps all.
descriptionFormatNoDescription format. Plain text, HTML, or both. Values: text = Plain text; html = HTML; both = Both.text
maxJobsPerCompanyNoMax jobs per company. Stop after this many matching jobs per company. 0 means no limit.
includeDescriptionNoInclude description. Include the full job description. Workday detail pages are always read, so locations, requisition ID and company come back filled in. This setting only controls whether the description text is included.
includeUndatedJobsNoKeep jobs without a posting date. When 'Posted within last N days' is set, keep jobs whose ATS does not expose a date.
maxAnnualSalaryUsdNoMaximum annual salary (USD). Keep jobs whose annual USD salary starts at or below this amount (the bottom of the range, or its only figure). Same conversion and handling of jobs without a convertible salary as the minimum.
maxYearsExperienceNoMax years of experience required. Drop jobs whose description asks for more years than this (e.g. 2 for early-career). Jobs that state no number are kept. When set, job details are fetched (slower runs) and yearsExperienceMin / yearsExperienceMax are added to each record.
minAnnualSalaryUsdNoMinimum annual salary (USD). Keep jobs whose annual salary in US dollars reaches this amount (the top of the range, or its only figure, is at least this). Salaries are annualised (hour x 2,080, day x 260, week x 52, month x 12) and converted with a fixed rate table bundled with the Actor (rough reference rates, see salaryAnnualUsdMin). Jobs whose salary cannot be converted (none given, no pay period, or an unlisted currency) are dropped unless 'Keep jobs without a salary' is on.
searchInDescriptionNoMatch keywords in description too. Also match 'Title keywords' against the job description. Requires 'Include description', except on Workday, where detail pages are always read.
maxDirectoryCompaniesNoMax directory companies. Use only the N largest boards from the directory. 0 means all.
includeJobsWithoutSalaryNoKeep jobs without a salary. With a minimum or maximum annual USD salary set, also keep jobs whose salary is missing or cannot be converted. Ignored when 'Only jobs with a salary' is on (jobs with no salary are dropped) and when no USD bound is set.

TDQS

A4.1/5.0
Behavior4/5

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

With annotations already covering read-only, non-destructive, open-world behavior, the description adds valuable context: per-job cost, a maxCostUsd cap, token-saving defaults, and the upstream Apify Actor. It still does not describe return record shape or rate-limit behavior, so it is strong but not exhaustive.

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?

The description is front-loaded with purpose and usage, then covers filters, defaults, and cost. It is dense for a 34-parameter tool, and although a few filter mentions duplicate schema content, none are seriously wasteful.

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 complex multi-ATS scraping tool, it supplies the key operational context: supported boards, usage condition, cost model, and default limits. It does not explain the output job record, but the annotations and full parameter schema carry much of the remaining burden.

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 input schema already carries the parameter meaning. The description mentions several filters and defaults, but mostly repeats what the schema says rather than adding new semantics.

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 specific verb ('Open jobs') and resource ('company career pages') and enumerates the supported ATS platforms. It also distinguishes the tool from single-ATS siblings by telling the agent to use it when there is a mix of companies or the ATS is unknown.

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?

It gives a clear condition for use: mixed companies or unknown ATS. It implies, but does not explicitly name, the single-ATS alternatives such as greenhouse_jobs or lever_jobs, so the routing guidance is strong but not fully explicit.

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

extract_sitemap_urlsList the URLs in a site's sitemapsA
Read-only

Give a site (sitemaps are discovered through robots.txt) or a direct sitemap.xml URL and get every listed URL with lastmod, changefreq and priority. Follows sitemap indexes and reads .gz files. Filter with includePatterns/excludePatterns (regular expressions) and lastmodAfter or lastmodWithinDays. Use it to map a site's pages or find recently changed ones before crawling. Cost, charged to your own Apify account: $0.0002 per URL returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxTotalUrls=500. Runs Apify Actor fecklesspleb/sitemap-extractor (https://apify.com/fecklesspleb/sitemap-extractor).

NameRequiredDescriptionDefault
startUrlsNoWebsites or sitemap URLs. A site (https://www.nasa.gov) to auto-discover its sitemaps, or a direct sitemap URL. Leave empty, or keep the sample NASA sitemap, for a default-mode run: up to 40 sample URLs from https://www.nasa.gov/wp-sitemap.xml at the normal per-URL price.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
onlyNewUrlsNoOnly new URLs (monitoring). Return only URLs not seen in earlier runs with the same state store.
lastmodAfterNoChanged after (date). Keep URLs whose lastmod is on or after this date, YYYY-MM-DD. URLs with no lastmod are dropped unless you turn on Keep URLs without a lastmod.
maxTotalUrlsNoMax URLs in total. 0 = no limit.
maxUrlsPerSiteNoMax URLs per site. 0 = no limit.
stateStoreNameNoState store name. Named key-value store for monitoring. Use a different name per monitor.sitemap-extractor-state
excludePatternsNoExclude URL patterns (regex). Drop URLs matching any of these regular expressions.
includePatternsNoInclude URL patterns (regex). Keep URLs matching any of these regular expressions, for example /blog/.
keepUndatedUrlsNoKeep URLs without a lastmod. Off by default: when a date filter is set, URLs with no lastmod in the sitemap are dropped, since their age can't be checked. Turn this on to keep them. On sites whose sitemaps have no lastmod, that returns every URL (up to the limits), and each one is billed.
sitemapPatternsNoOnly follow child sitemaps matching (regex). For big sitemap indexes, follow only child sitemaps matching these, for example post-sitemap.
includeAlternatesNoInclude hreflang alternates. Add language alternate URLs listed in the sitemap.
lastmodWithinDaysNoChanged within last N days. Keep URLs whose lastmod is within the last N days. Overrides the date above. URLs with no lastmod are dropped unless you turn on Keep URLs without a lastmod.
maxSitemapsPerSiteNoMax sitemap files per site. Safety cap on sitemap files read per site.

TDQS

A4.1/5.0
Behavior4/5

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

The description adds substantial context beyond the annotations: it discloses robots.txt discovery, sitemap-index traversal, .gz handling, the per-URL price ($0.0002) charged to the user's Apify account, the maxCostUsd cap, the maxTotalUrls=500 server default, and the backing Actor. The remaining gap is that it never mentions the default-mode run against the sample NASA sitemap when startUrls is omitted, which changes what an agent actually gets back.

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?

The opening sentence is front-loaded with the input-to-output contract, and cost/defaults/actor details are packed into short trailing sentences. It is dense for one paragraph but nearly every clause carries operational value; only the explicit Actor URL is arguably redundant.

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 14-parameter, zero-required tool with no output schema, the description covers the return fields, discovery mechanics, filtering, cost model, spend cap and key defaults, which is most of what an agent needs. It is incomplete only around the default startUrls sample run and around how results are returned (list, dataset, pagination).

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 every parameter already carries documentation, including the lastmodWithinDays-overrides-lastmodAfter precedence. The description adds only light reinforcement (regex nature of the patterns, lastmod-based filtering); it introduces no meaning not already in the schema, so the baseline 3 applies.

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?

"Give a site ... or a direct sitemap.xml URL and get every listed URL with lastmod, changefreq and priority" names a specific verb, input form and returned fields. It is clearly distinguishable from sibling tools like extract_website_metadata or seo_audit_website, which operate on pages rather than sitemap discovery.

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?

"Use it to map a site's pages or find recently changed ones before crawling" gives a concrete when-to-use, and the include/exclude plus lastmod filter framing implies when a broader crawl tool would be needed instead. It stops short of naming an alternative sibling tool explicitly, so no exclusion guidance is provided.

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

extract_website_metadataExtract page metadata and Open Graph tagsA
Read-only

Fetch a list of URLs (plain HTTP, no browser) and return each page's title, meta description, canonical URL, language, Open Graph and Twitter card tags, schema.org JSON-LD, favicon, RSS feeds and hreflang links. Use it for link previews, enrichment or quick SEO checks of specific pages. Failed URLs come back as free error rows. Cost, charged to your own Apify account: $0.001 per URL processed; $0.00005 per Actor start (per GB of memory, once per run). Each call is capped at maxCostUsd (default $0.25). Runs Apify Actor fecklesspleb/website-metadata-extractor (https://apify.com/fecklesspleb/website-metadata-extractor).

NameRequiredDescriptionDefault
urlsYesURLs. Pages to read, one row per URL, e.g. ["https://www.python.org/", "https://books.toscrape.com/"]. Plain URL strings or {"url": "..."} objects; duplicates are removed and a URL without http(s):// gets https:// added. Only the given URLs are fetched (no crawling); robots.txt is obeyed. Default ["https://www.python.org/"] alone is a sample run that stops after 15 s.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
maxResultsNoMax results. Maximum rows saved in the run. Default 0 = no cap. Free rows for failed URLs also count. Each row with metadata costs $0.001.
includeJsonLdNoInclude JSON-LD data. If true (default), each row includes jsonLd: the parsed schema.org JSON-LD blocks, with email, telephone, author, creator, contributor, editor and reviewedBy keys removed. Set false for smaller rows; jsonLdTypes and jsonLdErrors are always included.
maxConcurrencyNoMax concurrency. URLs fetched in parallel, 1 to 30. Default 10. Requests to the same host are spaced at least 0.5 s apart (longer if robots.txt sets a crawl delay).
includeFailedUrlsNoInclude failed URLs. Add a row with the error for URLs that fail (HTTP 400 or higher, not an HTML page, DNS or connection errors, timeouts, robots.txt blocks). These rows are free. Turn off to skip them.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld/destructive annotations: it discloses the no-browser fetch method, robots.txt obedience, that failed URLs surface as free error rows, the exact pricing model ($0.001/URL, $0.00005 per Actor start) charged to the caller's Apify account, the default $0.25 cap, and the backing Actor. For a billed, external-network tool this is the information an agent needs before invoking.

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?

Front-loaded with capability and return fields, then usage, then cost — a sensible priority order. It is dense and mostly earns its length, though the trailing Actor URL and the repeated default-charge figure are slightly redundant against the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/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 explicitly enumerates the returned fields and the error-row behavior, so an agent knows what it gets back. Combined with pricing, cost ceiling, and failure handling, nothing material is missing for a six-parameter billed extraction tool.

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 100%, so all six parameters are already documented in the schema; the description's only parameter-touching sentence restates the maxCostUsd cap and default without adding new semantics. Baseline 3 applies since the schema does the parameter work.

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 and resource ("Fetch a list of URLs") plus the exact return payload (title, meta description, canonical, language, OG/Twitter tags, JSON-LD, favicon, RSS, hreflang), and scopes it as plain HTTP with no browser. That is enough to separate it from seo_audit_website (broader audit) and extract_sitemap_urls (discovery) without opening 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 Guidelines4/5

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

Gives concrete use cases — "link previews, enrichment or quick SEO checks of specific pages" — and the inline note that only supplied URLs are fetched (no crawling). It does not name a sibling alternative or state when to prefer seo_audit_website instead, so the routing guidance stops at clear context.

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

greenhouse_jobsOpen jobs from Greenhouse job boardsA
Read-only

Open jobs from companies that hire through Greenhouse. Pass companies as Greenhouse slugs (e.g. 'airbnb'), boards.greenhouse.io URLs, or careers pages that embed a Greenhouse board; or set searchDirectory to true to search a built-in directory of boards. Filter with keywords, excludeKeywords, locations, remoteOnly and postedWithinDays. Full descriptions are off by default here to save tokens; set includeDescription to true to get them. Not affiliated with Greenhouse. Cost, charged to your own Apify account: $0.001 per job returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxTotalJobs=25, includeDescription=false. Runs Apify Actor fecklesspleb/greenhouse-jobs-scraper (https://apify.com/fecklesspleb/greenhouse-jobs-scraper).

NameRequiredDescriptionDefault
keywordsNoTitle keywords (any). Keep jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all.
companiesNoGreenhouse companies (slugs, board URLs or careers pages). One entry per company. Accepts a Greenhouse slug such as 'airbnb', a board URL on boards.greenhouse.io, or a company careers page that embeds a Greenhouse board. Leave empty, with the directory off, for a demo run: up to 5 sample jobs from https://boards.greenhouse.io/airbnb at the normal per-job price. If no entry can be read, the run fails with an error. The form is prefilled with this sample board and 'Max jobs in total' 5, which runs the same small demo (5 x $0.001 = $0.005); replace it with your own boards and clear or raise 'Max jobs in total' for a real run.
locationsNoLocations (any). Keep jobs whose location contains one of these strings, for example 'London', 'United States', 'Remote'.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
remoteOnlyNoRemote jobs only. Keep only jobs marked remote by the ATS or with 'remote' in the location.
departmentsNoDepartments or teams (any). Keep jobs whose department or team contains one of these strings, for example 'Engineering'.
onlyNewJobsNoOnly new jobs (monitoring mode). Return only jobs not returned by a previous run with this option on. State is kept in a named key-value store, so scheduled runs give you a clean feed of new postings and you pay only for new ones.
maxTotalJobsNoMax jobs in total. Stop the whole run after this many jobs. 0 means no limit (the value used when the field is empty). The run also stops at your 'Maximum cost per run'. The form is prefilled with 5 for a cheap sample run (5 x $0.001 = $0.005); clear it or raise it for real runs.
maxConcurrencyNoCompanies in parallel. How many companies to scrape at the same time. Requests to each host are rate limited regardless.
stateStoreNameNoState store name. Named key-value store used by 'Only new jobs'. Use different names for independent monitors.greenhouse-jobs-scraper-state
excludeKeywordsNoExclude title keywords. Drop jobs whose title contains any of these words, for example 'intern' or 'senior'.
searchDirectoryNoSearch the built-in company directory. Also scrape every board in the built-in directory of 147 verified Greenhouse boards (startups and tech companies). Combine with keyword, location and date filters to search across companies without listing them yourself.
postedWithinDaysNoPosted within last N days. Keep only jobs first published in the last N days. Empty keeps all.
descriptionFormatNoDescription format. Plain text, HTML, or both. Values: text = Plain text; html = HTML; both = Both.text
maxJobsPerCompanyNoMax jobs per company. Stop after this many matching jobs per company. 0 means no limit.
includeDescriptionNoInclude description. Include the full job description.
includeUndatedJobsNoKeep jobs without a posting date. When 'Posted within last N days' is set, keep jobs whose ATS does not expose a date.
searchInDescriptionNoMatch keywords in description too. Also match 'Title keywords' against the job description. Requires 'Include description'.
maxDirectoryCompaniesNoMax directory companies. Use only the N largest boards from the directory. 0 means all.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover read-only, open-world, non-destructive and non-idempotent, and the description adds substantial context on top: pricing ($0.001 per job), the maxCostUsd charge cap, server-side defaults (maxTotalJobs=25, includeDescription=false), and an affiliation disclaimer. It also explains the token trade-off behind disabling descriptions, which is genuine behavioral context an agent cannot infer from the 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?

Front-loaded with purpose, then input modes, then filters, then cost and defaults — the ordering matches how an agent needs the information. Dense but every sentence carries operative detail; the only filler is the 'not affiliated with Greenhouse' line and the Actor URL.

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 19-parameter, no-required-parameter scraper with no output schema, the description covers the decision-critical pieces: cost, caps, defaults, demo behavior and mode selection. What it omits is any sense of the shape of a returned job record, which leaves the agent guessing what fields come back without a description included.

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 description coverage is 100%, so the baseline is 3; the description still adds value by surfacing the cost-relevant defaults, the reason includeDescription is off (token savings), and a compact list of the filtering knobs (keywords, excludeKeywords, locations, remoteOnly, postedWithinDays). It does not resolve the mild tension between 'default maxTotalJobs=25' and the schema note that an empty field means 0/no limit.

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 opens with a specific verb+resource (open jobs from Greenhouse boards) and immediately scopes the source to companies hiring through Greenhouse, which cleanly separates it from lever_jobs, ashby_jobs, workday_jobs and search_remote_jobs by ATS. An agent can pick this tool without opening 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 Guidelines4/5

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

It explains the two operating modes explicitly — pass companies (slug, boards.greenhouse.io URL, or careers page) or set searchDirectory=true to use the 147-board directory — plus a documented zero-input demo fallback. It never states when to prefer a sibling ATS tool or when this tool is the wrong choice, so exclusions are missing.

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

lever_jobsOpen jobs from Lever job boardsA
Read-only

Open jobs from companies that hire through Lever (jobs.lever.co, EU boards included). Pass companies as Lever slugs (e.g. 'palantir'), board URLs or careers pages that embed a Lever board; or set searchDirectory to true to search a built-in directory of boards. Filter with keywords, excludeKeywords, locations, remoteOnly and postedWithinDays. Full descriptions are off by default here to save tokens; set includeDescription to true to get them. Not affiliated with Lever. Cost, charged to your own Apify account: $0.001 per job returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxTotalJobs=25, includeDescription=false. Runs Apify Actor fecklesspleb/lever-jobs-scraper (https://apify.com/fecklesspleb/lever-jobs-scraper).

NameRequiredDescriptionDefault
keywordsNoTitle keywords (any). Keep jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all.
companiesNoLever companies (slugs, board URLs or careers pages). One entry per company. Accepts a Lever slug such as 'palantir', a board URL on jobs.lever.co, or a company careers page that embeds a Lever board. Leave empty, with the directory off, for a demo run: up to 5 sample jobs from https://jobs.lever.co/spotify at the normal per-job price. If no entry can be read, the run fails with an error. The form is prefilled with this sample board and 'Max jobs in total' 5, which runs the same small demo (5 x $0.001 = $0.005); replace it with your own boards and clear or raise 'Max jobs in total' for a real run.
locationsNoLocations (any). Keep jobs whose location contains one of these strings, for example 'London', 'United States', 'Remote'.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
remoteOnlyNoRemote jobs only. Keep only jobs marked remote by the ATS or with 'remote' in the location.
departmentsNoDepartments or teams (any). Keep jobs whose department or team contains one of these strings, for example 'Engineering'.
onlyNewJobsNoOnly new jobs (monitoring mode). Return only jobs not returned by a previous run with this option on. State is kept in a named key-value store, so scheduled runs give you a clean feed of new postings and you pay only for new ones.
maxTotalJobsNoMax jobs in total. Stop the whole run after this many jobs. 0 means no limit (the value used when the field is empty). The run also stops at your 'Maximum cost per run'. The form is prefilled with 5 for a cheap sample run (5 x $0.001 = $0.005); clear it or raise it for real runs.
maxConcurrencyNoCompanies in parallel. How many companies to scrape at the same time. Requests to each host are rate limited regardless.
stateStoreNameNoState store name. Named key-value store used by 'Only new jobs'. Use different names for independent monitors.lever-jobs-scraper-state
excludeKeywordsNoExclude title keywords. Drop jobs whose title contains any of these words, for example 'intern' or 'senior'.
searchDirectoryNoSearch the built-in company directory. Also scrape every board in the built-in directory of 58 verified Lever boards (startups and tech companies). Combine with keyword, location and date filters to search across companies without listing them yourself.
postedWithinDaysNoPosted within last N days. Keep only jobs first published in the last N days. Empty keeps all.
descriptionFormatNoDescription format. Plain text, HTML, or both. Values: text = Plain text; html = HTML; both = Both.text
maxJobsPerCompanyNoMax jobs per company. Stop after this many matching jobs per company. 0 means no limit.
includeDescriptionNoInclude description. Include the full job description.
includeUndatedJobsNoKeep jobs without a posting date. When 'Posted within last N days' is set, keep jobs whose ATS does not expose a date.
searchInDescriptionNoMatch keywords in description too. Also match 'Title keywords' against the job description. Requires 'Include description'.
maxDirectoryCompaniesNoMax directory companies. Use only the N largest boards from the directory. 0 means all.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: per-job pricing of $0.001 charged to the caller's Apify account, the maxCostUsd cap, server-side defaults (maxTotalJobs=25, includeDescription=false), the demo-run behavior, and a non-affiliation disclaimer.

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?

Dense but front-loaded: purpose comes first, then input modes, filters, cost, and defaults. Some clauses duplicate schema defaults and the pricing/actor sentences are wordy, but 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 19-parameter, zero-required tool with no output schema, the description covers invocation modes, cost limits, defaults, and directory search well enough to call it correctly. It does not describe the shape of returned job records, which would close the last gap.

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 100%, so the baseline would be 3 even with no parameter info. The description still adds value by tying includeDescription to token savings, explaining that searchDirectory covers 58 verified boards, and repeating the applied defaults for maxTotalJobs and includeDescription.

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 and resource ('Open jobs from companies that hire through Lever') plus source coverage (jobs.lever.co, EU boards). Against siblings like greenhouse_jobs, ashby_jobs, and workday_jobs, the ATS is named explicitly, so the agent can route without opening a schema.

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?

Explains the two input modes (companies list vs searchDirectory=true) and when to use each, plus how to filter and the demo-run fallback when companies is empty. It stops short of naming sibling tools as alternatives, so the when-not-to-use-this-tool guidance relies on the ATS name alone.

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

search_hacker_newsSearch Hacker News or its Who is hiring threadsA
Read-only

mode 'search': search Hacker News stories and comments (including Ask HN and Show HN) by keyword, points, comment count and date through the public HN Search API by Algolia. mode 'whoIsHiring': turn the monthly 'Ask HN: Who is hiring?' thread into job records with company, role, location, remote flag and salary when stated. Emails and phone numbers in post text are redacted by default. Cost, charged to your own Apify account: $0.00015 per item returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxItems=50. Runs Apify Actor fecklesspleb/hacker-news-scraper (https://apify.com/fecklesspleb/hacker-news-scraper).

NameRequiredDescriptionDefault
modeNoMode. "search" (default): stories and comments from the HN Search API by Algolia. "whoIsHiring": parse the top-level posts of the monthly "Ask HN: Who is hiring?" threads into job rows (company, role, location, salary). Search-only and Who-is-hiring-only fields are labelled. Values: search = Search stories and comments; whoIsHiring = Who is hiring? job posts.search
tagsNoItem types. Search mode. Values: story, comment, ask_hn, show_hn, job, poll, front_page. Separate entries must ALL match (AND), e.g. ["story", "front_page"] = front-page stories. For any of several types, put them in one entry separated by commas, e.g. ["story,comment"]. Default ["story"].
queryNoSearch query. Search mode. Full-text Algolia query, e.g. "MCP server". Algolia matches loosely, so use sortBy "relevance" for the best matches; with "date" you get the newest loose matches. Leave empty to list the newest items.
sinceNoFrom date. Search mode. Only items created on or after this date, YYYY-MM-DD (UTC), e.g. "2026-10-01".
untilNoTo date. Search mode. Only items created before this date, YYYY-MM-DD (UTC); the day itself is excluded.
sortByNoSort by. Search mode. "date" (default): newest first, and pages past Algolia's 1,000-hit limit by moving the time window. "relevance": best match first, at most 1,000 results.date
threadsNoWho is hiring: number of monthly threads. Who is hiring mode. How many monthly threads to read, newest first, 1 to 12. Default 1 = the latest month only.
keywordsNoWho is hiring: keywords (any). Who is hiring mode. Keep posts whose text contains any of these strings (case-insensitive substring), e.g. ["python", "rust", "machine learning"].
maxItemsNoMax results. Stop after this many rows. Default 50, also when empty or 0. Each row costs $0.00015, so 50 rows are about $0.0075.
minPointsNoMin points. Search mode. Only items with at least this many points, e.g. 100.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
remoteOnlyNoWho is hiring: remote only. Who is hiring mode. Keep only posts whose first line (the headline) says "remote". Default false.
minCommentsNoMin comments. Search mode. Only items with at least this many comments, e.g. 20.
onlyNewItemsNoOnly new items (monitoring). Skip items returned by earlier runs that used this option and the same state store, for scheduled monitoring. Default false. Seen items are remembered for 120 days.
stateStoreNameNoState store name. Named key-value store that remembers seen items.hacker-news-scraper-state
postedWithinDaysNoPosted within (days). Search mode. Only items from the last N days, e.g. 30. Combined with From date, the later of the two wins.
redactContactDetailsNoRedact emails and phone numbers. Replaces emails and phone numbers in post text.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, it discloses the paid, metered nature of the call ($0.00015 per item, capped at maxCostUsd default $0.25, max $5), that contact details are redacted by default, server-side defaults for omitted params, the 120-day seen-item retention for onlyNewItems, and the 1,000-hit pagination ceiling with its workaround. This is exactly the operational context annotations cannot carry.

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?

Front-loaded with the two modes, then cost and defaults — a sensible priority order for a paid, multi-mode tool. Some redundancy remains, such as repeating maxItems=50 and the maxCostUsd default that the schema already declares.

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 17-parameter, two-mode tool with no output schema, the description covers purpose, cost, defaults, and job-record fields adequately. The search-mode result shape is left vaguer than the job rows, and no rate-limit or latency expectations are given, but nothing critical to correct invocation 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 schema already explains every parameter in detail. The description adds cost math ('50 rows are about $0.0075') and states that maxCostUsd is passed to Apify as maxTotalChargeUsd, but otherwise restates defaults already present in the schema. Baseline 3 applies.

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 two distinct modes with specific verbs and resources: keyword/points/date search over HN stories and comments via the Algolia HN Search API, and parsing of the monthly 'Ask HN: Who is hiring?' thread into job records. It even names the upstream actor and identifies the fields (company, role, location, remote, salary) produced in job mode, so an agent knows exactly what it gets.

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?

Mode selection and fallback behavior are clear ('Leave empty to list the newest items', sortBy tradeoffs, whoIsHiring = latest month by default). However, it offers no guidance against siblings such as search_remote_jobs or the ATS job tools, which overlap with whoIsHiring mode — the agent must infer when HN job posts are preferable to a dedicated job board.

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

search_remote_jobsSearch remote jobs (Remote OK, We Work Remotely, Jobicy)A
Read-only

One deduplicated list of remote job postings from the official public feeds of Remote OK, We Work Remotely and Jobicy, with the source named on every job. Filter by keywords, excludeKeywords, locations (for example 'USA', 'Europe'), requireSalary, minSalaryUsd and postedWithinDays. Set includeDescription to true for full descriptions. Cost, charged to your own Apify account: $0.001 per job returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxTotalJobs=25. Runs Apify Actor fecklesspleb/remote-jobs-aggregator (https://apify.com/fecklesspleb/remote-jobs-aggregator).

NameRequiredDescriptionDefault
dedupeNoMerge duplicates across boards. The same job is often posted on several boards. Keep one record (newest) and list the other copies in 'alsoListedOn'.
sourcesNoSources. Which job boards to include. Leave empty for all.
keywordsNoKeywords (any). Keep jobs whose title, tags or category contain at least one of these words (case-insensitive). Leave empty to keep all.
jobicyGeoNoJobicy region. Optional Jobicy geo filter, for example 'usa', 'europe', 'canada'.
locationsNoLocations (any). Keep jobs whose location or region text contains one of these strings, for example 'USA', 'Europe', 'Anywhere'.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
onlyNewJobsNoOnly new jobs (monitoring mode). Return only jobs not returned by a previous run with this option on, so scheduled runs give a clean feed and you pay only for new jobs.
maxTotalJobsNoMax jobs in total. Stop after this many jobs. Default 8, so a run with no input is small and fast. 0 means no limit. The run also stops at your 'Maximum cost per run'.
minSalaryUsdNoMinimum yearly salary (USD). Keep jobs whose top of range, converted to a rough yearly USD figure, is at least this. Jobs without a salary are dropped when this is set.
requireSalaryNoOnly jobs with a salary. Keep only jobs that state pay (from the board or found in the description).
wwrCategoriesNoWe Work Remotely categories. Limit We Work Remotely to these categories. Empty means all.
jobicyIndustryNoJobicy industry. Optional Jobicy industry filter, for example 'dev', 'marketing', 'design-multimedia'.
stateStoreNameNoState store name. Named key-value store for 'Only new jobs' and the Jobicy hourly limit.remote-jobs-aggregator-state
excludeKeywordsNoExclude title keywords. Drop jobs whose title contains any of these words.
postedWithinDaysNoPosted within last N days. Keep only jobs posted in the last N days. Jobs without a posting date are kept.
descriptionFormatNoDescription format. Plain text, HTML, or both. Values: text = Plain text; html = HTML; both = Both.text
includeDescriptionNoInclude description. Include the full job description. Off by default to keep runs small; turn it on to get descriptionText / descriptionHtml.
searchInDescriptionNoMatch keywords in description too. Also match keywords against the full job description.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already establish read-only, open-world, non-destructive behavior, and the description goes well past them by disclosing metered pricing ($0.001 per job billed to the caller's Apify account), a per-call cost cap (maxCostUsd default $0.25), server-side defaults (maxTotalJobs=25), dedupe with source attribution, and the upstream Actor being run. Those are exactly the operational facts an agent needs before spending the user's money.

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?

Front-loaded with what the tool returns and where it comes from, then filtering, then cost and defaults - a sensible order with no filler sentences. It is dense but every sentence carries information, though the trailing Actor URL is close to boilerplate for an agent choosing a tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter, zero-required aggregator with no output schema, the description covers the essentials: result shape (deduplicated list with source labeled), primary filters, cost model, and defaults, while deep per-parameter detail is fully carried by the schema. The only mild gap is not describing the returned record fields (e.g. alsoListedOn, descriptionText), which the schema only partially implies.

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 100%, so the baseline is 3, and the description adds real value by surfacing the high-signal filters (keywords, excludeKeywords, locations, requireSalary, minSalaryUsd, postedWithinDays, includeDescription) and clarifying the cost-cap semantics of maxCostUsd. It also resolves an internal schema ambiguity by stating the server default of maxTotalJobs=25 where the schema text says 'Default 8'. It does not explain the board-specific filters (wwrCategories, jobicyGeo, jobicyIndustry, stateStoreName), but those are documented in-schema.

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 concrete verb and resource ('deduplicated list of remote job postings') and enumerates the exact sources (Remote OK, We Work Remotely, Jobicy), which functionally separates it from the ATS-specific siblings like greenhouse_jobs and lever_jobs. The sourcing also tells the agent the results come from public aggregator feeds rather than a single employer's board.

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?

Usage context is implied by the filter list and the cost note, but there is no explicit when-to-use/when-not statement and no naming of the ATS siblings as the alternative for company-specific searches. Hints such as turning on includeDescription 'for full descriptions' and onlyNewJobs for scheduled runs exist, but most of that guidance lives in the schema rather than the description.

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

seo_audit_websiteSEO audit of a websiteA
Read-only

Crawl a site from one or more start pages (same host only) and audit every page for on-page SEO problems: missing or overlong titles and meta descriptions, H1s, canonicals, noindex, image alt text, thin content, Open Graph, JSON-LD and slow responses. Returns one record per page with a list of issues and a 0-100 score. Use it to find what to fix on a site; use extract_website_metadata instead when you only need the tags of known URLs. Cost, charged to your own Apify account: $0.003 per page audited; $0.00005 per Actor start (per GB of memory, once per run). Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxPagesPerSite=10. Runs Apify Actor fecklesspleb/website-seo-audit (https://apify.com/fecklesspleb/website-seo-audit).

NameRequiredDescriptionDefault
startUrlsYesWebsites to audit. Start page of each site, usually the home page, e.g. ["https://books.toscrape.com/"]. Plain URL strings or {"url": "..."} objects; a URL without http(s):// gets https:// added. Only links on the same host are crawled (www. and the bare domain count as one host) and robots.txt is obeyed. Default ["https://www.python.org/"] is a sample run: at most 2 pages, stops after 15 s.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
maxResultsNoMax pages in dataset. Maximum rows saved to the dataset in the whole run, across all sites. Default 0 = no cap. Free rows (pages that returned HTTP 400+ or no response) also count. The crawl stops when the cap is reached. Each charged row costs $0.003.
includeJsonLdNoInclude JSON-LD data. If true, each row gets jsonLd: the parsed JSON-LD blocks, with email, telephone, author, creator, contributor, editor and reviewedBy keys removed. Default false. jsonLdTypes (schema.org types found) and jsonLdErrors (blocks that failed to parse) are always included.
excludePatternsNoExclude URL patterns. Regular expressions for links not to crawl, matched case-insensitively anywhere in the full URL, e.g. ["/tag/", "\\?page="]. They apply to links found on pages; the start URL is always audited. Default: none.
maxPagesPerSiteNoMax pages per site. Maximum pages audited per start URL, 1 to 10,000. Default 10. Pages that fail (HTTP 400+ or no response) count; pages blocked by robots.txt, non-HTML files and redirects to another host do not. Example: 200 for a full audit of a small site.
onlyPagesWithIssuesNoOnly pages with issues. If true, pages with no issues are not saved and not charged; only pages with at least one issue are output. Default false: every audited page is output.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses the full cost model ($0.003 per page, per-run Actor start fee), the maxCostUsd cap (default $0.25) and the server-side default maxPagesPerSite=10, plus the fact that only same-host links are crawled. It also states the return shape (one record per page with issues and a 0-100 score), so an agent knows what it will get back and what it will spend.

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?

The description is dense, but it is front-loaded with purpose and the alternative before moving to cost and defaults; almost every clause carries information. It is a single long block, however, and the Actor identifier/URL at the end is provenance rather than something an agent uses to invoke the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a seven-parameter, pay-per-page crawl tool with no output schema, the description covers the crawl scope, defaults, cost ceiling, result granularity, and the sibling alternative. Nothing an agent needs in order to call it correctly, or to predict the bill, is missing.

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 description coverage is already 100%, so the baseline is 3; the description still adds cost meaning to parameters that the schema leaves abstract, tying each charged row to $0.003 and noting which failures still count as pages. The remaining cost and pagination semantics are largely delegated to the schema, so it does not fully earn a 5.

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 verb and resource ('Crawl a site ... and audit every page') and enumerates exactly what is checked (titles, meta descriptions, H1s, canonicals, noindex, alt text, JSON-LD, response time). It also explicitly distinguishes itself from the sibling extract_website_metadata, so an agent can choose without opening either schema.

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?

It gives an explicit when-to-use rule ('use it to find what to fix on a site') paired with the alternative and its selection condition ('use extract_website_metadata instead when you only need the tags of known URLs'). The same-host restriction and robots.txt obedience are also stated up front.

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

workday_jobsOpen jobs from Workday career sitesA
Read-only

Open jobs from a Workday career site. Pass companies as full career site URLs as shown in the browser (for example https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite); bare company names are skipped. Also filters by salary, work arrangement, employment type, seniority and years of experience. Filter with keywords, excludeKeywords, locations, remoteOnly and postedWithinDays. Full descriptions are off by default here to save tokens; set includeDescription to true to get them. Not affiliated with Workday. Cost, charged to your own Apify account: $0.002 per job returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxTotalJobs=25, includeDescription=false. Runs Apify Actor fecklesspleb/workday-jobs-scraper (https://apify.com/fecklesspleb/workday-jobs-scraper).

NameRequiredDescriptionDefault
dedupeByNoRemove duplicate jobs. Drop duplicates inside this run before they are output, so you never pay for them. None: every job is output (as before). Same job: a job with the same company, title and first location as one already output in this run is dropped (the dedupeKey field). Same company and title (merge locations): jobs of one company with the same title are output as one record whose locations list holds all their locations, with duplicateCount and mergedUids; such records are output when the company's board has been read. Duplicates of jobs output by earlier runs are not affected (use Only new jobs for that). Values: none = None; job = Same job (company + title + location); companyTitle = Same company and title (merge locations).none
keywordsNoTitle keywords (any). Keep jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all.
companiesNoWorkday career site URLs. One Workday career site URL per line, as shown in your browser, for example https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite or https://wd5.myworkdaysite.com/recruiting/qvc/QRG. A company careers page that links to or embeds a Workday site also works. The tenant, data center (wd1, wd3, wd5...) and site name are read from the URL. Bare company names and non-Workday URLs are skipped with a message, and the run fails if no entry is a valid Workday career site. Leave empty for a demo run: up to 4 sample jobs from https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite at the normal per-job price. The form is prefilled with this sample board and 'Max jobs in total' 4, which runs the same small demo (4 x $0.002 = $0.008); replace it with your own boards and clear or raise 'Max jobs in total' for a real run.
hasSalaryNoOnly jobs with a salary. Return only jobs that state a salary, from the ATS's pay field or a range in the description (any currency or period). Jobs without one are dropped before they are output, so they are never charged.
locationsNoLocations (any). Keep jobs whose location contains one of these strings, for example 'London', 'United States', 'Remote'.
seniorityNoSeniority. Keep jobs with one of these seniority levels (derived from the title). Jobs whose title shows no level are left out when this is set. Empty by default (no change).
timeRangeNoPosted within (fixed window). Optional. Only jobs whose ATS publish or update date falls in this window, as in career-site-jobs-feed. When set it replaces 'Posted within days'; 'Any time' turns the date limit off. Undated jobs follow 'Include undated jobs'. Empty by default (no change). Values: 1h = Last hour; 24h = Last 24 hours; 7d = Last 7 days; 30d = Last 30 days; all = Any time.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
remoteOnlyNoRemote jobs only. Keep only jobs marked remote by the ATS or with 'remote' in the location.
onlyNewJobsNoOnly new jobs (monitoring mode). Return only jobs not returned by a previous run with this option on. State is kept in a named key-value store, so scheduled runs give you a clean feed of new postings and you pay only for new ones.
maxTotalJobsNoMax jobs in total. Stop the whole run after this many jobs. 0 means no limit (the value used when the field is empty). The run also stops at your 'Maximum cost per run'. The form is prefilled with 4 for a cheap sample run (4 x $0.002 = $0.008); clear it or raise it for real runs.
includeExpiredNoReport expired jobs. On scheduled runs, add a free record with status 'expired' for each job an earlier run returned that its career site no longer lists. Only sites read completely in this run are checked (not when 'Max jobs per company', 'Max total jobs' or the cost limit stopped the read, or when the site has rows past Workday's 2,000-row cap that could not be reached). Job records get status 'active' while this is on. Uses the state store.
maxConcurrencyNoCompanies in parallel. How many companies to scrape at the same time. Requests to each host are rate limited regardless.
stateStoreNameNoState store name. Named key-value store used by 'Only new jobs'. Use different names for independent monitors.workday-jobs-scraper-state
employmentTypesNoEmployment type. Keep jobs whose normalised employment type is one of these. Jobs whose ATS gives no type are left out when this is set. Empty by default (no change).
excludeKeywordsNoExclude title keywords. Drop jobs whose title contains any of these words, for example 'intern' or 'senior'.
visaSponsorshipNoVisa sponsorship. Filter on visaSponsorship, read from the description text (yes / no / not stated). Pattern-based, not a legal statement by the employer. When on, job details are fetched (slower runs) and visaSponsorship / visaSponsorshipEvidence are added to each record; the description itself is still only output when 'Include description' is on. Values: any = Any; yes = Mentions sponsorship is offered; not_no = Exclude jobs that say no sponsorship.any
workArrangementNoWork arrangement. Keep jobs with one of these arrangements (derived from the ATS field, location and title). Jobs with no detectable arrangement are left out when this is set. Empty by default (no change).
postedWithinDaysNoPosted within last N days. Keep only jobs first published in the last N days. Empty keeps all.
descriptionFormatNoDescription format. Plain text, HTML, or both. Values: text = Plain text; html = HTML; both = Both.text
maxJobsPerCompanyNoMax jobs per company. Stop after this many matching jobs per company. 0 means no limit.
includeDescriptionNoInclude description. Include the full job description. Workday detail pages are always read, so locations, requisition ID and company come back filled in. This setting only controls whether the description text is included.
includeUndatedJobsNoKeep jobs without a posting date. When 'Posted within last N days' is set, keep jobs whose ATS does not expose a date.
maxAnnualSalaryUsdNoMaximum annual salary (USD). Keep jobs whose annual USD salary starts at or below this amount (the bottom of the range, or its only figure). Same conversion and handling of jobs without a convertible salary as the minimum.
maxYearsExperienceNoMax years of experience required. Drop jobs whose description asks for more years than this (e.g. 2 for early-career). Jobs that state no number are kept. When set, job details are fetched (slower runs) and yearsExperienceMin / yearsExperienceMax are added to each record.
minAnnualSalaryUsdNoMinimum annual salary (USD). Keep jobs whose annual salary in US dollars reaches this amount (the top of the range, or its only figure, is at least this). Salaries are annualised (hour x 2,080, day x 260, week x 52, month x 12) and converted with a fixed rate table bundled with the Actor (rough reference rates, see salaryAnnualUsdMin). Jobs whose salary cannot be converted (none given, no pay period, or an unlisted currency) are dropped unless 'Keep jobs without a salary' is on.
searchInDescriptionNoMatch keywords in description too. Also match 'Title keywords' against the job description. Works with 'Include description' on or off, because Workday detail pages are always read.
includeJobsWithoutSalaryNoKeep jobs without a salary. With a minimum or maximum annual USD salary set, also keep jobs whose salary is missing or cannot be converted. Ignored when 'Only jobs with a salary' is on (jobs with no salary are dropped) and when no USD bound is set.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnly/openWorld/idempotent=false, but the description adds substantial context beyond them: per-job pricing ($0.002), a maxCostUsd cap, server-applied defaults (maxTotalJobs=25, includeDescription=false), external Actor provenance, and a non-affiliation disclaimer. However, it does not describe the returned record shape despite there being no output schema, so it does not reach a 4 or 5.

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?

Front-loaded with purpose and the URL requirement, then filters, then cost/defaults. Dense but each sentence carries information; slightly long for a single paragraph yet not padded.

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 28 parameters and no output schema, the description is fairly complete: it covers cost model, defaults, demo behavior, and state store usage. The main gap is that it does not describe the shape of returned job records.

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 100%, so parameters are already documented. The description reinforces a few (keywords, excludeKeywords, locations, remoteOnly, postedWithinDays, includeDescription, maxCostUsd) and states defaults, but does not add meaning beyond the schema for the 28 parameters.

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 specific verb and resource ('Open jobs from a Workday career site') and clarifies the URL-based input requirement with an example. It is distinguishable from greenhouse_jobs/lever_jobs/ashby_jobs by the Workday scope, though it never explicitly routes to those siblings.

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?

Explains key usage conditions: pass full career site URLs, bare names are skipped, empty companies triggers a demo run, and descriptions are off by default. No explicit when-to-use-versus-alternative guidance for the sibling ATS tools, which keeps it from a 5.

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. 10 tool updatesv0.1.0
    • First observedashby_jobs
    • First observedats_jobs
    • First observedextract_sitemap_urls
    • First observedextract_website_metadata
    • First observedgreenhouse_jobs
    • First observedlever_jobs
    • First observedsearch_hacker_news
    • First observedsearch_remote_jobs
    • First observedseo_audit_website
    • First observedworkday_jobs

TDQS

A4/5.0

Scored across 10 tools

Disambiguation4/5

The SEO trio (audit vs. metadata extract vs. sitemap) is clearly delineated, with descriptions explicitly cross-referencing each other ('use extract_website_metadata instead when you only need the tags'). The job family is murkier: ats_jobs overlaps directly with greenhouse_jobs, lever_jobs, ashby_jobs and workday_jobs, and only the 'use it when you have a mix of companies or do not know which ATS' phrasing keeps the boundary inferable. search_hacker_news also bundles two unrelated modes (keyword search vs. whoIsHiring job parsing) into one tool.

Naming Consistency3/5

Two patterns coexist: verb_noun for the web tools (seo_audit_website, extract_website_metadata, extract_sitemap_urls) and search_* for two more, but the job tools are bare noun phrases (greenhouse_jobs, lever_jobs, workday_jobs, ats_jobs) with no verb. Names are readable and snake_case throughout, but the verb-first vs. resource-first split is inconsistent. The server name 'actors-mcp' also signals nothing about the SEO/jobs split.

Tool Count5/5

Ten tools is a well-scoped set, and each one maps to a concrete Apify Actor with a real purpose rather than filler. The per-vendor job scrapers are redundant-ish but each targets a genuinely different source API.

Completeness4/5

The SEO side covers discovery (sitemap), diagnosis (audit) and per-URL metadata extraction, which is a coherent lifecycle with no obvious dead end. The jobs side covers major ATS vendors plus an aggregator and remote feeds, but has no follow-up tool to fetch a single job's full detail later (you must re-run with includeDescription) and no cross-tool aggregation of the vendor results.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    MCP server that exposes 300+ AI agents as tools via a single API key. Supports listing agents, invoking any agent with chat-completion style messages, checking agent health, and retrieving platform statistics.
    5
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Seven remote MCP servers exposing 51 published Apify scrapers as agent tools: company diligence, social listening, recruiting, real estate, lead generation, e-commerce and academic research. Billed per result, and a call that returns nothing is never charged.
    1
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    MCP server exposing 35 web scraping and SERP tools for general scraping, Google services, e-commerce sites, social media, and search engines. Enables MCP clients like Claude to scrape web pages and search results via natural language.
    35
    36 npm
    MIT