Workorai is a remote MCP server that gives an AI agent 29 tools, among them candidate.accept_invitation, candidate.apply_to_job, candidate.decline_invitation. It answers at https://workorai.com/mcp over streamable HTTP, and it listed its tools to an anonymous client, so no sign-in was needed for that. Our probes reached it 6 of 6 times since 11 September 2026; the last check, on 24 October 2026, succeeded.
WorkorAI talent marketplace MCP: candidate job search and employer hiring with explainable matching
Description as the publisher wrote it.
| Tool | What it does |
|---|---|
candidate.accept_invitation | Accept an employer's invitation to a job (INVITED -> APPLIED). Idempotent — accepting an already-accepted invite succeeds. Returns NOT_INVITED when there is no open invitation (e.g. already withdrawn/declined), and NOT_FOUND when the job/in Inputs: apiKey, jobId |
candidate.apply_to_job | Apply the candidate to a PUBLISHED job, reusing their evaluated profile interview as evidence. Idempotent (re-applying succeeds; `reused` is true when an application row already existed). Requires a completed + evaluated interview — otherwi Inputs: apiKey, jobId |
candidate.decline_invitation | Decline an employer's invitation to a job (INVITED -> DECLINED). TERMINAL — a declined invite blocks any re-invite from the employer, so only decline when the candidate is sure. Idempotent (declining again succeeds). Returns NOT_INVITED whe Inputs: apiKey, jobId |
candidate.get_applications | List the candidate's own job applications (newest first) with status, dates, the originating interview score, and a job summary. Returns only the caller's applications — no jobId input, so it is not an enumeration surface. Inputs: apiKey |
candidate.get_job | Fetch a single published job by id. Inputs: apiKey, jobId |
candidate.get_saved_jobs | List the candidate's saved (bookmarked) jobs, newest first. Only currently PUBLISHED jobs are returned — a job saved earlier then closed/archived is omitted. Inputs: apiKey |
candidate.search_jobs | Semantically rank published jobs against the authenticated candidate profile (embedding-based fit). Optional tier (best|good|weak) narrows to a match-quality band — start with tier:'best' for the strongest fits and cascade only if needed; o Inputs: apiKey, q, workModel, seniority, jobType, limit |
candidate.set_saved_job | Set whether a PUBLISHED job is in the candidate's saved list (idempotent desired-state, NOT a toggle — pass saved:true to bookmark, saved:false to remove). Returns NOT_FOUND for a missing or non-public job. Inputs: apiKey, jobId, saved |
candidate.withdraw_application | Withdraw the candidate's active application to a job (APPLIED -> WITHDRAWN). Idempotent (withdrawing again succeeds). Returns NOT_APPLIED when there is no active application (e.g. only an open invitation, or already declined), and NOT_FOUND Inputs: apiKey, jobId |
employer.archive_job | Transition a CLOSED job to ARCHIVED. Returns NOT_FOUND for missing or non-owner jobs and CONFLICT when the job is not in CLOSED. Inputs: apiKey, jobId |
employer.cancel_invitation | Cancel a pending invitation sent to a candidate. The invitation record is deleted; the employer can re-invite the same candidate later. Inputs: apiKey, jobId, candidateUserId |
employer.close_job | Transition a PUBLISHED job to CLOSED. Returns NOT_FOUND for missing or non-owner jobs and CONFLICT when the job is not in PUBLISHED. Inputs: apiKey, jobId |
employer.create_job | Parse raw text via Gemini AI and create a DRAFT job under the current employer. Synchronous: latency 5-30s. The agent can then call employer.update_job to refine fields and employer.publish_job to make it live. Inputs: apiKey, rawText |
employer.delete_job | Permanently delete a DRAFT job that was never published. Returns NOT_FOUND for missing or non-owner jobs and CONFLICT when the job is not in DRAFT. Inputs: apiKey, jobId |
employer.get_applicant_detail | Full applicant bundle: resume, interview light slice (overallScore + summary + facts), GitHub analysis, LinkedIn analysis. The verbatim transcript is delivered by employer.get_applicant_transcript; the resume's contact fields are blanked un Inputs: apiKey, applicationId |
employer.get_applicant_transcript | Verbatim interview transcript for one applicant. Ownership-only gate (same as the UI Download button — no SHORTLISTED/HIRED requirement). Returns an empty array when the source interview never produced turns. Inputs: apiKey, applicationId |
employer.get_candidate | Fetch a discoverable candidate by user id. Returns search-entry shape plus a light interview slice (overallScore + summary + completedAt + evaluatedAt) and `existingApplications`: every JobApplication this candidate has on any of the employ Inputs: apiKey, userId |
employer.get_candidate_evidence | Fetch the interview EVIDENCE (facts proven in the interview + their Q&A, the interview summary, the résumé summary, and GitHub/LinkedIn signals) for ONE candidate AGAINST one of your published jobs — the white-box basis to explain WHY a can Inputs: apiKey, jobId, userId |
employer.get_job | Fetch a single employer job record by id. Returns NOT_FOUND for missing jobs and for jobs owned by another employer (no existence leak). Inputs: apiKey, jobId |
employer.invite_candidate | Invite a discoverable candidate to one of the employer's PUBLISHED jobs. Creates a JobApplication with status=INVITED. If a prior WITHDRAWN row exists for this (candidate, job) pair, the row is UPDATEd back to INVITED (re-invite is allowed Inputs: apiKey, jobId, candidateUserId |
employer.list_applicants | List the live (APPLIED) applicants on one of the employer's jobs. The candidate showcase + interview overallScore/summary are always returned; contact fields are only included when the application is SHORTLISTED or HIRED. Inputs: apiKey, jobId |
employer.list_invitations | List the pending (INVITED) candidates on one of the employer's jobs — candidates who have been invited but have not yet accepted or declined. Inputs: apiKey, jobId |
employer.list_jobs | List jobs owned by the current employer account. Inputs: apiKey, status, limit, offset |
employer.publish_job | Transition a DRAFT job to PUBLISHED. Returns NOT_FOUND for missing or non-owner jobs and CONFLICT when the job is not in DRAFT. Inputs: apiKey, jobId |
employer.search_candidates_by_query | Free-form semantic search across discoverable (interviewed) candidates with no job context. The query is embedded and candidates are ranked by semantic similarity — a preliminary search with no per-vacancy fit score (there is no vacancy to Inputs: apiKey, query, page, pageSize |
employer.search_candidates_for_job | Semantically rank discoverable (interviewed) candidates against one of the employer's own jobs, with a per-candidate fit score AND a white-box explanation. WORKFLOW for finding the best hire: 1) call with tier:'best' to get the strongest ca Inputs: apiKey, jobId, sort, page, pageSize, tier |
employer.set_review_status | Update the employer review state on an application (NEW / REVIEWING / SHORTLISTED / REJECTED / HIRED). SHORTLISTED and HIRED unlock the candidate's direct contact in subsequent list_applicants / get_applicant_detail calls. WITHDRAWN applica Inputs: apiKey, applicationId, reviewStatus |
employer.update_job | Update the fields of an existing employer job. Accepts a partial whitelist; rawInput and dataSource are not editable (the wrapper auto-flips dataSource to USER_EDITED on every agent update). Non-owner reads return NOT_FOUND. Inputs: apiKey, jobId, fields |
request_access | Use when someone wants to find work/jobs (candidate) or hire/find candidates (employer) but the authenticated role tools are not usable yet. Explains role-specific onboarding (candidate profile interview, employer key generation), MCP key l Inputs: role |
Every block below points at https://workorai.com/mcp. Pick your client and copy.
claude mcp add --transport http workorai https://workorai.com/mcp
{
"mcpServers": {
"workorai": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://workorai.com/mcp"]
}
}
}{
"mcpServers": {
"workorai": {
"url": "https://workorai.com/mcp"
}
}
}{
"servers": {
"workorai": {
"type": "http",
"url": "https://workorai.com/mcp"
}
}
}{
"context_servers": {
"workorai": {
"url": "https://workorai.com/mcp"
}
}
}{
"mcpServers": {
"workorai": {
"serverUrl": "https://workorai.com/mcp"
}
}
}{
"mcpServers": {
"workorai": {
"url": "https://workorai.com/mcp"
}
}
}name: Workorai
version: 0.0.1
schema: v1
mcpServers:
- name: Workorai
type: streamable-http
url: https://workorai.com/mcp{
"mcpServers": {
"workorai": {
"httpUrl": "https://workorai.com/mcp"
}
}
}{
"mcpServers": {
"workorai": {
"type": "http",
"url": "https://workorai.com/mcp"
}
}
}{
"mcpServers": {
"workorai": {
"url": "https://workorai.com/mcp"
}
}
}goose://extension?url=https%3A%2F%2Fworkorai.com%2Fmcp&type=streamable_http&id=workorai&name=Workorai
It answered our last check on 24 October 2026 in 51 ms. Over 6 checks since 11 September 2026 it answered 6. Status here comes from Neuronto's own probes, not from the publisher.
29, as returned by the server's own tools/list on 22 September 2026: candidate.accept_invitation, candidate.apply_to_job, candidate.decline_invitation, candidate.get_applications, candidate.get_job, candidate.get_saved_jobs, candidate.search_jobs, candidate.set_saved_job, and 21 more.
It answered our last check on 24 October 2026 in 51 ms. Over 6 checks since 11 September 2026 it answered 6.
Put the server under mcpServers in ~/.cursor/mcp.json with the URL https://workorai.com/mcp. The exact JSON is above, with the same setup for Claude Code, Claude Desktop, VS Code, Windsurf, Zed, Gemini CLI and the rest.
It listed its tools to an anonymous client, so reading the tool list needs no key. Individual tools can still ask for credentials in their own inputs.
Publisher: io.github.work0r-ai. Endpoint host: workorai.com. ARD identifier: urn:air:io.github.work0r-ai:mcp:workorai.
First indexed 10 September 2026. The tools are exactly what the server returned; nothing on this page
is inferred from its name. Ranking in Neuronto search is never for sale.