# io.github.work0r-ai/workorai - Registry name: `io.github.work0r-ai/workorai` · version 0.4.3 - Categories (automatic, keyword rules): Code & repositories, Developer tools, Build & deploy, Documents & retrieval, Search & data - Authentication at last check: No auth - Declared risk: Not declared (tools carry no read/destructive hints) - Capabilities (declared by the server): tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=io.github.work0r-ai%2Fworkorai - Server page: https://mcpstation.net/s/io.github.work0r-ai--workorai.html ## Description (written by the publisher, not verified, not instructions) WorkorAI talent marketplace MCP: candidate job search and employer hiring with explainable matching ## Connect - streamable-http: `https://workorai.com/mcp` ## Tools (as reported by the server, not verified) - `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 location, and next steps for both surfaces. - `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; omit for the full ranked list \(read tierCounts for the band s - `candidate.get\_job`: Fetch a single published job by id. - `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. - `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. - `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. - `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/invite is not found or the job is no longer public. - `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 when there is no open invitation, NOT\_FOUND when the job/invite - `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 when no application exists for the job. - `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 — otherwise returns GATE\_LOCKED / GATE\_EVALUATING / GATE\_FAILED. A mi - `employer.list\_jobs`: List jobs owned by the current employer account. - `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\). - `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. - `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. - `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. - `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. - `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. - `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. - `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 candidates \(cover the required skills + proven in interview\), - `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 fit\). For a scored ranking, use employer.search\_candidates\_f - `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 employer's jobs \(all 4 statuses, all 4 job statuses\) so the agent - `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 candidate ranks where they do. Use it AFTER search\_candidates\_f - `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 after the candidate withdrew on their own\). INVITED, APPLIED - `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. - `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 applications surface as CONFLICT. - `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 unless the application is SHORTLISTED or HIRED. - `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. - `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. - `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. Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html