accueil / serveurs / Recherche & Web / io.github.work0r-ai/workorai
io.github.work0r-ai/workorai
serveur MCP (Model Context Protocol) · workor-mcp 0.1.0
Référencé dans l'annuaire. Seul le pentest comportemental fait foi, et il n'a pas encore été exécuté sur ce serveur.
Est-ce que io.github.work0r-ai/workorai est sûr ?
Au dernier audit MCP Hub, le serveur MCP « io.github.work0r-ai/workorai » est classé « Non encore testé ». Référencé dans l'annuaire. Seul le pentest comportemental fait foi, et il n'a pas encore été exécuté sur ce serveur. Le verdict est réévalué en continu ; consultez la fiche pour l'état à jour.
Méthode : MCP Hub analyse la description de chaque outil (couche 1) et, pour le verdict fort, exécute le serveur dans une micro-VM isolée avec leurres et réseau bloqué (couche 2). On publie des noms et des compteurs, jamais le contenu brut renvoyé par un outil.
Les 29 outils
- candidate.accept_invitation≈ 201 tokens
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.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "candidate.accept_invitation", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "status": "texte"}} - candidate.apply_to_job≈ 229 tokens
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 missing or non-public job returns NOT_FOUND.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "candidate.apply_to_job", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "reused": true, "status": "texte", "applicationId": "texte"}} - candidate.decline_invitation≈ 208 tokens
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 is not found.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "candidate.decline_invitation", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "status": "texte"}} - candidate.get_applications≈ 270 tokens
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.
Paramètres, retour & exemple (1)
ParamètresapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "candidate.get_applications", "arguments": {"apiKey": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "applications": []}} - candidate.get_job≈ 132 tokens
Fetch a single published job by id.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "candidate.get_job", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "job": {}}} - candidate.get_saved_jobs≈ 246 tokens
List the candidate's saved (bookmarked) jobs, newest first. Only currently PUBLISHED jobs are returned — a job saved earlier then closed/archived is omitted.
Paramètres, retour & exemple (1)
ParamètresapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "candidate.get_saved_jobs", "arguments": {"apiKey": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "savedJobs": []}} - candidate.search_jobs≈ 1373 tokens
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 sizes). Each scored row carries matchExplanation (the white-box 'why': fit score, the candidate's skills that match the job's required set, and a rationale). A free-text `q`, or a candidate who has not completed an interview yet, instead browses published jobs by recency — those rows carry NO fit score (`matchScore` is `null`, no bands); treat them as a browse list, not a ranking.
Paramètres, retour & exemple (8)
Paramètresq· string · optionneltier· string · optionnel · best | good | weak
Match-quality band. Omit for the full ranked list. START with tier:"best" (strongest fits), cascade to "good"/"weak" only if you need more; read tierCounts to decide. Ignored on a free-text q / no-interview browse (no bands).limit· number · optionnelapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.offset· number · optionneljobType· string · optionnel · FULL_TIME | PART_TIME | CONTRACT | FREELANCEseniority· string · optionnel · INTERN | JUNIOR | MIDDLE | SENIOR | LEAD | PRINCIPALworkModel· string · optionnel · REMOTE | HYBRID | ON_SITE
Exemple d'appel{"name": "candidate.search_jobs", "arguments": {"q": "texte", "tier": "best", "limit": 1, "apiKey": "texte", "offset": 1, "jobType": "FULL_TIME"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "jobs": [], "page": {}, "filters": {}, "tierCounts": {}}} - candidate.set_saved_job≈ 223 tokens
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.
Paramètres, retour & exemple (3)
ParamètresjobId· string · requissaved· boolean · requis
Desired saved state. true bookmarks the job, false removes the bookmark. Idempotent — a retry never flips the state.apiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "candidate.set_saved_job", "arguments": {"jobId": "texte", "saved": true}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "saved": true}} - candidate.withdraw_application≈ 200 tokens
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.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "candidate.withdraw_application", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "status": "texte"}} - employer.archive_job≈ 534 tokens
Transition a CLOSED job to ARCHIVED. Returns NOT_FOUND for missing or non-owner jobs and CONFLICT when the job is not in CLOSED.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "employer.archive_job", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "job": {}}} - employer.cancel_invitation≈ 193 tokens
Cancel a pending invitation sent to a candidate. The invitation record is deleted; the employer can re-invite the same candidate later.
Paramètres, retour & exemple (3)
ParamètresjobId· string · requis
The job the invitation belongs toapiKey· string · optionnel
Employer MCP API keycandidateUserId· string · requis
The candidate whose invitation to cancel
Exemple d'appel{"name": "employer.cancel_invitation", "arguments": {"jobId": "texte", "candidateUserId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "jobId": "texte", "candidateUserId": "texte"}} - employer.close_job≈ 534 tokens
Transition a PUBLISHED job to CLOSED. Returns NOT_FOUND for missing or non-owner jobs and CONFLICT when the job is not in PUBLISHED.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "employer.close_job", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "job": {}}} - employer.create_job≈ 616 tokens
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.
Paramètres, retour & exemple (2)
ParamètresapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.rawText· string · requis
Free-form job description (up to 10000 characters). Parsed by Gemini AI; the call typically takes 5-30 seconds. On a client-side timeout, recover by calling employer.list_jobs with status=DRAFT and pick the most recent row.
Exemple d'appel{"name": "employer.create_job", "arguments": {"rawText": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "job": {}}} - employer.delete_job≈ 162 tokens
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.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "employer.delete_job", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "jobId": "texte"}} - employer.get_applicant_detail≈ 1322 tokens
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.
Paramètres, retour & exemple (2)
ParamètresapiKey· string · optionnelapplicationId· string · requis
Exemple d'appel{"name": "employer.get_applicant_detail", "arguments": {"applicationId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "detail": {}}} - employer.get_applicant_transcript≈ 200 tokens
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.
Paramètres, retour & exemple (2)
ParamètresapiKey· string · optionnelapplicationId· string · requis
Exemple d'appel{"name": "employer.get_applicant_transcript", "arguments": {"applicationId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "transcript": [], "applicationId": "texte"}} - employer.get_candidate≈ 760 tokens
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 can decide whether re-inviting will succeed. Heavy artefacts (transcript, facts, resume, github, linkedin) live behind employer.get_applicant_detail and require an application.
Paramètres, retour & exemple (2)
ParamètresapiKey· string · optionneluserId· string · requis
Exemple d'appel{"name": "employer.get_candidate", "arguments": {"userId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "candidate": {}}} - employer.get_candidate_evidence≈ 630 tokens
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_for_job: shortlist with the scorecard, then read the evidence here for the few you care about and write your own comparative review. Returns NOT_FOUND if the job is missing / not yours / not published, or the candidate is not in that job's searchable pool.
Paramètres, retour & exemple (3)
ParamètresjobId· string · requis
One of YOUR published vacancies — the evidence is scoped to it (must-linked facts use its required skills).apiKey· string · optionneluserId· string · requis
A candidate from search_candidates_for_job for THIS jobId. The interview evidence to explain your ranking.
Exemple d'appel{"name": "employer.get_candidate_evidence", "arguments": {"jobId": "texte", "userId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "evidence": {}}} - employer.get_job≈ 534 tokens
Fetch a single employer job record by id. Returns NOT_FOUND for missing jobs and for jobs owned by another employer (no existence leak).
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "employer.get_job", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "job": {}}} - employer.invite_candidate≈ 318 tokens
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, and DECLINED rows still block with INVITE_BLOCKED: INVITE_NOT_ALLOWED. Inspect `existingApplications` on employer.get_candidate before calling to know which case applies. Returns INVITE_BLOCKED with one of several sub-reasons (JOB_NOT_FOUND, JOB_NOT_PUBLISHED, CANDIDATE_NOT_FOUND, NOT_DISCOVERABLE, INVITE_NOT_ALLOWED) when the invite cannot be created. A missing vacancy and a vacancy owned by another employer both return JOB_NOT_FOUND (you cannot tell them apart — anti-enumeration).
Paramètres, retour & exemple (3)
ParamètresjobId· string · requisapiKey· string · optionnelcandidateUserId· string · requis
Exemple d'appel{"name": "employer.invite_candidate", "arguments": {"jobId": "texte", "candidateUserId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "status": "texte", "applicationId": "texte"}} - employer.list_applicants≈ 1247 tokens
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.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Exemple d'appel{"name": "employer.list_applicants", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "jobId": "texte", "applicants": []}} - employer.list_invitations≈ 258 tokens
List the pending (INVITED) candidates on one of the employer's jobs — candidates who have been invited but have not yet accepted or declined.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requis
The job to list invitations forapiKey· string · optionnel
Employer MCP API key
Exemple d'appel{"name": "employer.list_invitations", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "jobId": "texte", "invitations": []}} - employer.list_jobs≈ 646 tokens
List jobs owned by the current employer account.
Paramètres, retour & exemple (4)
Paramètreslimit· number · optionnelapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.offset· number · optionnelstatus· ? · optionnel
Exemple d'appel{"name": "employer.list_jobs", "arguments": {"limit": 1, "apiKey": "texte", "offset": 1, "status": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "jobs": [], "page": {}, "filters": {}}} - employer.publish_job≈ 534 tokens
Transition a DRAFT job to PUBLISHED. Returns NOT_FOUND for missing or non-owner jobs and CONFLICT when the job is not in DRAFT.
Paramètres, retour & exemple (2)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.
Exemple d'appel{"name": "employer.publish_job", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "job": {}}} - employer.search_candidates_by_query≈ 495 tokens
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_for_job with a job id.
Paramètres, retour & exemple (4)
Paramètrespage· number · optionnelquery· string · requisapiKey· string · optionnelpageSize· number · optionnel
Exemple d'appel{"name": "employer.search_candidates_by_query", "arguments": {"query": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "page": {}, "jobId": "texte", "query": "texte", "reason": "NOT_INDEXED", "entries": [], "tierCounts": {}}} - employer.search_candidates_for_job≈ 1802 tokens
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), cascade to tier:'good' then tier:'weak' only if you need more (read tierCounts to decide; paginate within a band via page.hasMore, not page.total); 2) each row carries matchExplanation — the white-box 'why' (the fit score, the skills the candidate PROVED in their interview, what they're missing, and a plain-English rationale) — use it to explain your shortlist on OUR data, not a black box; 3) for the few you shortlist, call employer.get_candidate_evidence(jobId, userId) for the interview facts + Q&A to write a deeper comparative review. Omit tier for the full ranked pool (back-compat). Returns NOT_FOUND when the job is missing / owned by another employer (no existence leak), or NOT_INDEXED / NO_CATEGORIES when the job is not indexed for semantic search yet (re-save / republish, then retry).
Paramètres, retour & exemple (6)
Paramètrespage· number · optionnelsort· string · optionnel · bestMatch | newesttier· string · optionnel · best | good | weak
Match-quality band (required-skill coverage + fit). Omit to get the full ranked pool. To shortlist, START with tier:"best" — the strongest candidates (cover the required skills, proven in interview); only cascade to "good" then "weak" if you need more. Read tierCounts to decide; paginate within a band using page.hasMore (NOT page.total, which is the full pool). Each row carries matchExplanation (the white-box "why"); then call employer.get_candidate_evidence for the interview evidence to explain your ranking. Ignored on sort:"newest" (a recency browse has no bands → tierCounts bands are 0).jobId· string · requisapiKey· string · optionnelpageSize· number · optionnel
Exemple d'appel{"name": "employer.search_candidates_for_job", "arguments": {"jobId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "page": {}, "jobId": "texte", "reason": "NOT_INDEXED", "entries": [], "advisory": {}, "tierCounts": {}}} - employer.set_review_status≈ 208 tokens
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.
Paramètres, retour & exemple (3)
ParamètresapiKey· string · optionnelreviewStatus· string · requis · NEW | REVIEWING | SHORTLISTED | REJECTED | HIREDapplicationId· string · requis
Exemple d'appel{"name": "employer.set_review_status", "arguments": {"reviewStatus": "NEW", "applicationId": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "reviewStatus": "texte", "applicationId": "texte"}} - employer.update_job≈ 769 tokens
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.
Paramètres, retour & exemple (3)
ParamètresjobId· string · requisapiKey· string · optionnel
Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously.fields· object · requis
Exemple d'appel{"name": "employer.update_job", "arguments": {"jobId": "texte", "fields": {}}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"ok": true, "job": {}}} - request_access≈ 272 tokens
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.
Paramètres, retour & exemple (1)
Paramètresrole· string · optionnel · CANDIDATE | EMPLOYER
Exemple d'appel{"name": "request_access", "arguments": {"role": "CANDIDATE"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"guides": [], "message": "texte", "capabilityManifest": {}}}
C'est votre serveur ?
Revendiquez-le sur l'espace créateur (preuve GitHub, domaine ou npm) pour afficher le badge « propriétaire vérifié » et lancer un pentest comportemental à la demande afin d'obtenir le badge « Vérifié ».