company-jobs-feed-mcp@1.1.19
CAUTIONPublisher claims: "COMING SOON: indexed search, 8,700+ boards. Apify $5 credit. Free 135-board scan." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Server started and answered tools/list.- Tested
- MCP initialize and tools/list · every tool description, for hidden instructions · every file read, file written and host contacted by what ran
- Not tested
- what the tools do when called with real credentials
Before you give it your token
- It will ask for
APIFY_TOKENConfiguration, not credentials: CF_WORKER, FAIRQUERY_HOSTED- Where it talks to
- getfairquery.com (its own)Also gem.com, apify.com, stripe.com, lever.co, ramp.com, personio.de — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- what the tools do when called with real credentials
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names gem.com, apify.com, stripe.com, lever.co, ramp.com, personio.de as well as its own vendor. The guard injects APIFY_TOKEN only into requests to getfairquery.com (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios) on 2026-11-09 and scored it 78/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Prompting user to enter sensitive credentials. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 26 s · 2 scenarios · 0 deviationsStatic findings
…03/429 (or an HTML block page from an ATS API) stops that host for the session (kill switch, never retried, also for the other free tools): the call does not fail bu…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.… starter list -> the company\'s own website (only for a domain/URL input; robots.txt respected, <= 3 pages, private/internal IPs refused; Personio, Pinpoint and Gem hosts are not crawled) -> at most 6 GETs against the Greenhouse, Lever and…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.return undefined; // tokens never contain whitespace; e.g. "paste your token here"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…ocumented board feed is fetched once and the id is looked up. Personio is robots.txt then /xml. Pinpoint is robots.txt then /postings.json. Gem is GET /job_posts/ only. Pinpoint and Gem description_text stay empty. No apply URL is requeste…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.throw personioFeedError(host, loaded.status, `${host} returned HTML instead of postings.json; host stopped (kill switch).`, 'HOST_BLOCKED', true);Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.throw new HttpError(`${host} answered HTTP ${res.status}; scanning of this host stopped for the run (kill switch).`, 'HOST_BLOCKED', true, res.status, host);Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* and 403 is the kill switch). No API key. Redirects are not followed.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* Per-host politeness + kill switch. At most HOST_CONCURRENCY requests in flight per host and an optionalFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.throw new HttpError(`${host} answered HTTP ${res.status}; scanning of this host stopped for the run (kill switch).`, 'HOST_BLOCKED', true, res.status, host);Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…rtial row. Nothing is stored. Any HTTP 403/429 stops that host for the session (kill switch, HOST_BLOCKED). Lever requests are spaced 1 s apart. Personio accounts sh…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…n_at = now and change = null. Any HTTP 403/429 stops that host for the session (kill switch, HOST_BLOCKED error). A blocked Personio or Pinpoint host does not block …Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…ost only (very large Greenhouse boards: a second, lighter GET). Personio: robots.txt, then GET https://{account}.jobs.personio.de/xml only; all Personio accounts share one lane, one at a time, at least 1.5 s apart. Pinpoint: that tenant\'s…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* Per-host politeness + kill switch. At most HOST_CONCURRENCY requests in flight per host and an optionalFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…etched once and searched for the id (method "board_listing"). Personio is robots.txt then /xml. Pinpoint is robots.txt then /postings.json. Gem is GET /job_posts/ only. No apply URL is requested. "open" means currently published by the emp…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ty countries list, or remote "only". Reads starter boards with the same client, kill switch and rate limits as the other free tools (at most 2 requests in flight per…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.throw new HttpError(`${host} returned HTML instead of JSON; host stopped (kill switch).`, 'HOST_BLOCKED', true, res.status, host);Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.throw personioFeedError(host, loaded.status, `${host} returned HTML instead of the XML feed; host stopped (kill switch).`, 'HOST_BLOCKED', true);Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* This client does not request robots.txt: a 403 is the kill switch and would stopFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.throw personioFeedError(host, loaded.status, `${host} returned HTML instead of job_posts JSON; host stopped (kill switch).`, 'HOST_BLOCKED', true);Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* Fetch one named subdomain's feed: robots.txt, then /postings.json if allowed.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* `io.get` is not called when robots.txt disallows /postings.json or cannot be read.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.const hostOk = path === '/postings.json' ? isPinpointPostingsPath(u.pathname) : got === '/robots.txt';Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.throw new HttpError(`${host} returned HTML instead of JSON; host stopped (kill switch).`, 'HOST_BLOCKED', true, res.status, host);Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* HTTP 403/429 still kill the host and are not retried. A second failure is aFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* `io.get` is not called when robots.txt disallows /postings.json or cannot be read.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* Fetch one named subdomain's feed: robots.txt, then /postings.json if allowed.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.throw new HttpError(`robots.txt on ${host} disallows /postings.json`, 'ROBOTS_DISALLOWED', false, undefined, host);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* HTTP 403/429 still kill the host and are not retried. A second failure is aFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for @fairquery/company-jobs-feed-mcp@1.1.19 as of 5d ago. This is the package itself, not its dependencies.
What would make this Verified
2 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Prompting user to enter sensitive credentials≈ +9 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Unclaimed publisher≈ +8 on the totalClaim fairquery: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Process kill command≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.