entra-mcp
Summary: This server lets an AI search, rank, and prepare applications for thousands of verified AI & tech jobs on ENTRA — read-only, with the human applying.
Search live jobs —
search_jobswith free-text query plus filters for remote/onsite/hybrid, country, company, annual salary minimum, experience level, and recency; rank by date, salary, or fit; returns total count and roles with salary bands and apply URLs.Get full role details —
get_jobreturns description, requirements, skills, salary band, company, and apply link for a given job id.Explore employers —
list_companiesshows who's hiring (OpenAI, Anthropic, SpaceX, Stripe +300 more) with open-role counts and profile links.AI-style job matching —
match_jobstakes resume text (≤8000 chars) or a skills list plus optional target role, remote-only, country, and minimum salary; extracts skills/role/seniority, runs multiple searches, and returns ranked matches with explainable fit scores, reasons, matched skills, gaps, and an interview-chance hint.Legacy matching alias —
match_profiledoes the same fromskills[]with an optional role hint.Salary benchmarking —
salary_statsreports count, min/p25/median/p75/max per currency and top companies, using only roles that publish a band (no estimates).Company hiring breakdown —
companies_hiringaggregates results for a role into companies with open counts, sample titles, latest post dates, and verified flags.Human-in-the-loop application prep —
prepare_applicationreturns the direct apply link and a checklist; nothing is submitted automatically.Safe by design — all tools are read-only, open-world lookups with no ability to modify data or apply on your behalf; no API key needed for these candidate tools.
(Note: the schema covers candidate mode only — the README also describes 8 employer tools enabled with an ENTRA_API_KEY.)
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@entra-mcp Find remote ML engineer jobs paying $150K+ and prepare the best fit."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ENTRA MCP — the first agent-ready job platform
Let your AI find your job. This MCP server connects Claude, ChatGPT, Cursor, Windsurf or any MCP client — locally via npx or hosted at https://mcp.entracareers.com/mcp — to ENTRA — thousands of verified AI & tech jobs aggregated straight from company hiring systems (OpenAI, Anthropic, SpaceX, Stripe + 300 more). Zero ghost jobs.
Agents search, match, rank and prepare. Humans decide and apply — no spam, no auto-submission.
Install
Claude Code
claude mcp add entra -- npx -y entra-mcpClaude Desktop — one-click extension (.mcpb)
Download entra-mcp.mcpb and open it with Claude Desktop (Settings → Extensions → Install from file). No Node install needed. Employers can paste their API key in the extension settings.
Claude Desktop (claude_desktop_config.json), Cursor (.cursor/mcp.json), Windsurf (~/.codeium/windsurf/mcp_config.json)
{
"mcpServers": {
"entra": { "command": "npx", "args": ["-y", "entra-mcp"] }
}
}From source:
npm install && npm run build
claude mcp add entra -- node "/path/to/entra-mcp/dist/index.js"Requires Node 18+. No API key needed for candidate tools — they are read-only against the public ENTRA API. Employers add one env var, see Employer mode.
Then just ask: "Find me remote ML engineer roles paying $200K+, tell me which companies are hiring most, and prepare an application for the best fit."
Related MCP server: HireHouse Jobs MCP server
Hosted endpoint (no install)
The same server runs at https://mcp.entracareers.com/mcp (MCP Streamable HTTP). Nothing to install, no account for candidate tools.
Client | How |
ChatGPT | Settings → Connectors → Create → MCP Server URL |
claude.ai | Settings → Connectors → Add custom connector → URL |
Cursor ( |
|
Claude Code |
|
Gemini CLI / Smithery / any Streamable HTTP client | point it at the URL above |
Employer mode over HTTP: send your key on every request as Authorization: Bearer entra_live_… and the 8 employer tools appear for that request (Cursor: add "headers": { "Authorization": "Bearer entra_live_…" } next to url). ChatGPT and claude.ai connectors cannot send custom headers today, so there you get candidate mode — employers use the local npx setup with ENTRA_API_KEY (Employer mode).
How the hosted server behaves:
Stateless: every request stands alone (no sessions, no
Mcp-Session-Id), so it scales and redeploys without breaking clients.GET /mcpandDELETE /mcpanswer405as the spec allows.The
Authorizationheader is used for that one request and is neither stored nor logged. No key is read from the server's environment.Rate limit 120 requests/minute per client IP on
/mcp; request bodies up to 1 MB; CORS open for browser-based agents. Health:GET /healthz.Same honesty rules as below — the hosted server is just another transport for the identical tools.
Tools
Tool | What it does | Example call |
| Search live verified jobs. Filters: |
|
| Full role details: description, requirements, skills, salary band, apply link |
|
| Who's hiring on ENTRA, with open-role counts and profile links |
|
| AI matching, live. Pass |
|
| Backward-compatible alias of |
|
| Salary stats for a role from listings that publish a band: |
|
| Which companies are hiring for a role right now: open-role counts, sample titles, latest post date, verified flag, profile URLs |
|
| Human-in-the-loop apply link + checklist |
|
Every job in every response carries verified: true, a salary band when the company lists one, and an apply URL of the form https://entracareers.com/{country}/vacancies/{id}?utm_source=agent&utm_medium=mcp — we welcome agent traffic.
Sample: match_jobs
{
"source": "ENTRA — verified roles aggregated from company ATSs. Finds and ranks; you apply.",
"profile": { "skills_used": ["machine learning", "python", "rag", "llm", "pytorch", "aws"], "target_role": "machine learning engineer", "seniority": "6+ yrs (7+ years mentioned)" },
"queries_run": ["machine learning engineer", "python", "rag", "llm"],
"candidates_considered": 142,
"matches": [
{
"title": "Machine Learning Engineer, Inference",
"company": "OpenAI",
"location": "San Francisco, United States",
"work_location": "remote",
"salary": "$295K–555K/yr",
"url": "https://entracareers.com/us/vacancies/…?utm_source=agent&utm_medium=mcp",
"fit_score": 88,
"interview_chance_hint": "high",
"why": [
"Skills: 5/6 matched (machine learning, python, llm, pytorch, aws)",
"Title match: \"Machine Learning Engineer, Inference\" fits \"machine learning engineer\"",
"Seniority: job asks 6+ yrs, you read as 6+ yrs — match",
"Remote role (as requested)",
"Salary band listed: $295K–555K/yr"
],
"skill_gaps": ["rag"]
}
]
}Honesty note
Matching is deterministic — a keyword dictionary plus rules, no LLM in the loop.
fit_scoreis explainable, not a prediction;interview_chance_hintis derived fromfit_scoreonly (never a made-up percentage).salary_statsuses listed bands only — roles without a published band are excluded, and nothing is estimated.search_jobsrank_by: "salary"returns salaried listings only;posted_within_daysis applied client-side over the most recent 500 matches.Nothing is submitted on your behalf.
prepare_applicationreturns a link and a checklist; the human applies.
Employer mode (API key)
Same package, one env var: with ENTRA_API_KEY set, the 8 candidate tools stay and 8 employer tools are added — post jobs, manage listings, read applications, search and match candidates for your company.
Create a key at entracareers.com/employer/profile?tab=api-keys (pick the scopes you need; the key is shown once).
Connect:
Claude Code
export ENTRA_API_KEY="entra_live_…"
claude mcp add entra -e ENTRA_API_KEY=$ENTRA_API_KEY -- npx -y entra-mcp --employerClaude Desktop / Cursor / Windsurf
{
"mcpServers": {
"entra": {
"command": "npx",
"args": ["-y", "entra-mcp", "--employer"],
"env": { "ENTRA_API_KEY": "entra_live_…" }
}
}
}Then ask: "Post a Senior Sales Manager job in Dubai — hybrid, 15–22K AED/month, 45 days — then show me the 5 best candidates for it and who has already applied."
How it behaves:
The key is read from the environment only (never from arguments). Without a key the employer tools are not registered;
--employeralone just prints a hint on stderr.Nothing is called at startup. The first employer call resolves your company and scopes via
GET /employer/api-keys/meand caches them.Only employer endpoints receive the bearer header; public lookups (countries, cities, specializations, job details) are made anonymously.
Rate limit is 120 requests/minute per key; a
429is retried once afterretry-after.
Employer tools
Tool | Scope | What it does | Example call |
| any | Company, key name/prefix, granted scopes, which tools are usable |
|
|
| Publish a job. Human-friendly input: |
|
|
| Your company's jobs: |
|
|
| Change a subset of fields: title, description, requirements, employment/work location, experience, salary, benefits, |
|
|
| Unpublish a job. Without |
|
|
| Applications to one job ( |
|
|
| Published resumes: |
|
|
| Rank candidates for |
|
Structured outcomes (no surprises)
Situation | What you get |
Key invalid / revoked |
|
Key lacks a scope |
|
No free vacancy slot |
|
Resume database needs a plan |
|
Rate limited | retried once, then |
Validation failed |
|
Honesty notes (employer)
match_candidatesis deterministic keyword scoring (skills overlap, headline vs role, seniority, location/remote) — explainable, not a prediction. Review profiles before contacting anyone.Contact details (email, phone, WhatsApp, LinkedIn, portfolio) are shown only when ENTRA returns them — i.e. the candidate applied to your job or accepted your invitation. Nothing is inferred or scraped.
post_jobreports every guess it made: city / specialization match quality, a detected or defaultedexperience_level(1_3_yearsif undetectable), andsalary_perioddefaulting to monthly (the ENTRA default — pass"yearly"for annual figures).Nothing is deleted:
close_jobsetsisActive:falseand can be undone withupdate_job {is_active:true}. Application status changes are not available through API keys — use the employer dashboard.
Why ENTRA is agent-ready (and others aren't)
LinkedIn bans agents. Indeed's MCP is search-only. Tools that scrape break on CAPTCHAs.
ENTRA owns the inventory — verified jobs from company ATSs — so agents get clean, legal, structured access with consented apply links.
Every listing:
verified: true+ salary bands +utm_source=agent(we welcome agent traffic).
AI matching is live via match_jobs — connect your profile at entracareers.com.
Roadmap
Application status changes and invitations through API keys (today: read-only applications).
OAuth on the hosted endpoint, so ChatGPT / claude.ai connectors can use employer mode without a local install.
Employers: entracareers.com/pricing — Job Posting $19 for 90 days; Hiring Autopilot from $290/role/month.
Links
Developers: entracareers.com/developers
For AI agents: entracareers.com/ai-agents
Development
npm run build # tsc → dist/
npm run selftest # calls the live API directly, no MCP client (candidate tools)
npm run smoke # spawns the server over stdio with the MCP SDK client and exercises every candidate tool (live API)
npm run smoke:employer # employer mode against an in-process mock of the employer API (no network, no real key)
npm run smoke:http # starts dist/http.js on a random port and drives it with the SDK's Streamable HTTP client (live API + fake employer key)
npm run start:http # hosted transport locally: http://localhost:8080/mcp (PORT, HOST, RATE_LIMIT_PER_MINUTE, TRUST_PROXY, MCP_ALLOWED_HOSTS)
npm run bundle # builds dist-bundle/entra-mcp.mcpb (Claude Desktop extension / Smithery local bundle) from manifest.json
docker build -t entra-mcp . && docker run -p 8080:8080 entra-mcp # the image the hosted endpoint runs (node:22-alpine, dist/http.js)Layout: src/server.ts builds the server (createServer({ apiKey? }) — tools + per-request key context), src/index.ts is the stdio entry (npx entra-mcp), src/http.ts the hosted Streamable HTTP entry.
Environment: ENTRA_API_KEY (stdio only — enables employer mode), ENTRA_API_URL (default https://entracareers.com/api), ENTRA_SITE_URL (default https://entracareers.com).
MIT © ENTRA
Privacy Policy
This server sends only your tool inputs to the public ENTRA API (https://entracareers.com/api). No telemetry, no third-party services. Locally (npx entra-mcp) employer mode uses your API key from the ENTRA_API_KEY environment variable; on the hosted endpoint (https://mcp.entracareers.com/mcp) the key comes from the Authorization header of each request, is forwarded only to ENTRA employer endpoints, and is never stored or logged. The hosted server keeps no sessions or request history beyond a short access log (method, tool name, status, timing). Full policy: https://entracareers.com/privacy-policy
Available Tools
8 toolscompanies_hiringCompanies hiring for a roleARead-onlyIdempotentInspect
Which companies are hiring for a role right now: aggregates ENTRA search results (up to 300 most recent roles) into companies with open-role counts, sample titles, latest post date, verified flag and profile URLs.
Inputs: query (required), limit, country, remote_only.
get_jobGet job detailsARead-onlyIdempotentInspect
Full details of one ENTRA job by id: description, requirements, skills, salary band, company, apply link.
Inputs: job_id (required).
list_companiesList companies on ENTRAARead-onlyIdempotentInspect
List companies hiring on ENTRA (OpenAI, Anthropic, SpaceX, Stripe and 300+ more) with open-role counts and profile links.
Inputs: limit, query.
match_jobsMatch a candidate to jobsARead-onlyIdempotentInspect
AI matching, live: pass resume_text (free text) or skills[] plus optional target_role / remote_only / country / min_salary. Extracts skills, role and seniority deterministically, runs 2–4 searches, dedupes and ranks with an explainable fit_score (0–100), why[], matched_skills, skill_gaps, salary and a qualitative interview_chance_hint. ENTRA finds and ranks; the human applies.
Inputs: limit, skills, country, min_salary, +3 more.
match_profileMatch profile (alias of match_jobs)ARead-onlyIdempotentInspect
Backward-compatible alias of match_jobs: skills[] (+ role_hint, remote_only, limit) → ranked verified roles with fit explanation.
Inputs: skills (required), limit, role_hint, remote_only.
prepare_applicationPrepare a human-in-the-loop applicationARead-onlyIdempotentInspect
Prepare an application for an ENTRA job: returns the direct apply link and a short checklist. The human reviews and applies — no auto-submission.
Inputs: job_id (required).
salary_statsSalary stats for a roleARead-onlyIdempotentInspect
Salary statistics for a role query from ENTRA listings that publish a band (up to 150 most recent): count_with_salary, min / p25 / median / p75 / max per currency (annualized; USD reported as USD-equivalent, other currencies as-is), top 5 companies by count. Listed bands only — no estimates.
Inputs: query (required), country, experience, remote_only.
search_jobsSearch ENTRA jobsARead-onlyIdempotentInspect
Search thousands of verified AI & tech jobs on ENTRA (aggregated directly from company hiring systems — zero ghost jobs). Filters: work location, country, company, annual salary, experience, posted_within_days. rank_by date | salary | fit (fit needs profile_keywords). Returns total_found and live roles with salary bands and apply links.
Inputs: query (required), limit, remote, company, +9 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
search_jobs vs match_jobs are distinguishable (filtered search vs AI matching), and list_companies vs companies_hiring are distinguishable by scope, but match_profile is explicitly a backward-compatible alias of match_jobs, creating a redundant tool. Overall, descriptions clarify intent, but some overlap remains.
Most tools follow a verb_noun pattern such as search_jobs, get_job, list_companies, and prepare_application. However, salary_stats and companies_hiring break the pattern, and get_job is singular while related tools use plural nouns.
Eight tools is a reasonable scope for a job-search and matching server. However, match_profile being an alias of match_jobs means one tool is largely redundant, keeping the count slightly less clean than it could be.
The tool set covers the core job-search lifecycle: discovery, detail lookup, AI matching, salary benchmarking, company filtering, and application preparation. No significant gaps are apparent for the server's stated purpose, and the human-in-the-loop application flow is intentional.
Maintenance
Related MCP Connectors
Tailor resumes, score ATS fit, find hiring leads, and send cold outreach, from your agent.
Job platform for AI agents. Track tech jobs from companies that match your stack.
1.2M+ jobs from employer career sites, salary benchmarks and company hiring signals for AI agents.
searchnapply connects your AI agent to 800K+ open jobs taken straight from company career sites, kept up to date as companies add and close them. Search in your own words with the site's filters (role, location, remote, salary, experience, department), read postings in full, and tailor a resume or cover letter from your searchnapply profile. Save a search as a monitor to collect new postings and track what you applied to or skipped. It never invents a job or a salary, and it does not apply for you: you apply on the company's own page. Free plan included, within a daily call limit.
Related MCP Servers
AlicenseAqualityBmaintenanceEnables AI agents to parse resumes, tailor CVs, score ATS compatibility, redact PII, scrape job postings, and track applications through a career platform.823 npmAGPL 3.0- AlicenseNot gradedqualityCmaintenanceEnables users to search live public job listings, compare roles side by side, retrieve full job details, and render interactive job cards with application links from AI chat clients.MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to search ~4,700 salary-transparent tech jobs across nine boards and eight countries, filter by salary, tech, remote work and seniority, and apply — while remembering which postings were already applied to so they never resurface.-
- FlicenseNot gradedqualityAmaintenanceEnables AI agents to search, filter by salary, and apply to ~4,700 salary-transparent tech jobs across nine boards and eight countries, while remembering past applications so duplicates are hidden and returning results as JSON-first data.-