Verified AI/tech jobs from company ATSs: search, fit matching, salary stats; employer job posting
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
One-click editor setup isnβt available for this listing yet β we donβt have a confirmed install command, and weβd rather show nothing than point your editor at the wrong package or host. Follow the projectβs own setup instructions, linked above.
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.
Claude Code
Claude 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)
From source:
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."
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 https://mcp.entracareers.com/mcp, authentication "None" (custom connectors need a ChatGPT plan that supports them, e.g. Plus/Pro/Business/Enterprise with developer mode) |
| claude.ai | Settings β Connectors β Add custom connector β URL https://mcp.entracareers.com/mcp |
Cursor (.cursor/mcp.json) | { "mcpServers": { "entra": { "url": "https://mcp.entracareers.com/mcp" } } } |
| Claude Code | claude mcp add --transport http entra https://mcp.entracareers.com/mcp |
| 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:
Mcp-Session-Id), so it scales and redeploys without breaking clients. GET /mcp and DELETE /mcp answer 405 as the spec allows.Authorization header is used for that one request and is neither stored nor logged. No key is read from the server's environment./mcp; request bodies up to 1 MB; CORS open for browser-based agents. Health: GET /healthz.| Tool | What it does | Example call |
|---|---|---|
search_jobs | Search live verified jobs. Filters: work_location (remote/onsite/hybrid), country (ISO-2), company (slug or name), salary_min (annual), experience, posted_within_days. rank_by: date (default) Β· salary Β· fit (with profile_keywords). Returns total_found + jobs with id/title/company/location/salary/published_at/url. | {"query":"machine learning engineer","remote":true,"country":"US","salary_min":200000,"rank_by":"salary","posted_within_days":14,"limit":10} |
get_job | Full role details: description, requirements, skills, salary band, apply link | {"job_id":"<id from search_jobs>"} |
list_companies | Who's hiring on ENTRA, with open-role counts and profile links | {"query":"anthropic"} |
match_jobs | AI matching, live. Pass resume_text (β€8000 chars) or skills[], optional target_role, remote_only, country, min_salary, limit (β€20). Extracts skills/role/seniority deterministically, runs 2β4 searches, dedupes, and returns a ranked list with fit_score (0β100), why[], matched_skills, skill_gaps, salary, interview_chance_hint (high/medium/low). | {"resume_text":"Senior ML engineer, 7 years, PyTorch, RAG, AWSβ¦","remote_only":true,"limit":10} |
match_profile | Backward-compatible alias of match_jobs (skills[], role_hint) | {"skills":["python","llm","rag"],"role_hint":"ML engineer"} |
salary_stats | Salary stats for a role from listings that publish a band: count_with_salary, min / p25 / median / p75 / max per currency (annualized; USD as USD-equivalent, other currencies as-is), top 5 companies | {"query":"software engineer","country":"US"} |
companies_hiring | Which companies are hiring for a role right now: open-role counts, sample titles, latest post date, verified flag, profile URLs | {"query":"AI engineer","remote_only":true,"limit":15} |
prepare_application | Human-in-the-loop apply link + checklist | {"job_id":"<id>"} |
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.
match_jobsfit_score is explainable, not a prediction; interview_chance_hint is derived from fit_score only (never a made-up percentage).salary_stats uses listed bands only β roles without a published band are excluded, and nothing is estimated.search_jobs rank_by: "salary" returns salaried listings only; posted_within_days is applied client-side over the most recent 500 matches.prepare_application returns a link and a checklist; the human applies.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.
Claude Code
Claude Desktop / Cursor / Windsurf
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:
--employer alone just prints a hint on stderr.GET /employer/api-keys/me and caches them.429 is retried once after retry-after.No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/entra-jobs)<a href="https://allmcps.com/mcp/entra-jobs"><img src="https://allmcps.com/api/badge/entra-jobs?style=directory" alt="ENTRA Jobs on AllMCPs" /></a>