WorkorAI talent marketplace skill: candidate job search and employer hiring with white-box match explanations via the WorkorAI MCP server (https://workorai.com/mcp). Use when the user asks to find a job, apply to jobs, respond to employer invitations, or when an employer wants to post jobs, search and evaluate candidates, invite them, and review applicants.
5cc17cfUse this skill for WorkorAI talent marketplace workflows through the
WorkorAI MCP server. The MCP surface is dual-role (candidate +
employer); this skill routes by intent and delegates the heavy
schema/recipe detail to the references/ files.
references/candidate-catalog.md,
references/candidate-recipes.md, and references/auth-flow.md. Run the
candidate flow: discover (candidate.search_jobs → candidate.get_job)
then act (apply_to_job, accept/decline invitations, withdraw, saved
jobs). Edge cases: references/candidate-troubleshooting.md.
references/auth-flow.md ("What To Say
First (Candidate)"). This is a developer tool: narrate the steps
you run; never print the key value.references/employer-catalog.md,
references/employer-recipes.md, and the employer sections of
references/auth-flow.md. Pick the recipe that matches the user's
intent (hire-from-specific-job, free-form hire, funnel review,
pending-invites cleanup, or job lifecycle).
employer.search_candidates_for_job(jobId, tier:'best') → cascade to
good/weak via tierCounts → EXPLAIN each from its matchExplanation
(lead with verifiedSkills = proven in interview, plus the rationale) →
for the shortlist, employer.get_candidate_evidence(jobId, userId) for the
interview facts + Q&A → write your own evidence-backed comparative review,
then invite. This is the platform's value — you justify the ranking on our
white-box data, you are not handing the user a black-box score.tools/list — visibility is discovery, not authorization. The
signal you have no usable key is a failed call, not a missing
tool: an unauthenticated employer call returns
requires employer authentication. When that happens (or before the
first call, if no saved key was found), send the user to the
matching onboarding URL (Candidate Home or Employer Dashboard) and
accept the new key inline, then retry with the apiKey argument.curl or raw JSON-RPC probing unless the user
explicitly asks to debug MCP connectivity.scripts/credential-store.mjs relative to this SKILL.md.node scripts/credential-store.mjs get --role=candidatenode scripts/credential-store.mjs get --role=employer--role) is candidate for backward compatibility.apiKey argument for tools in the matching role.node scripts/credential-store.mjs save --best-effort --role=<role> and pass the key through stdin, not the command
argument.save --shared-file --role=<role> only when the user explicitly
wants the shared-file fallback.wai_[REDACTED].https://workorai.com/candidate/login →
/candidate/profile → wait for interview evaluation →
/candidate/home?tab=mcp to copy the MCP key.candidate.search_jobs → candidate.get_job.candidate.apply_to_job (idempotent; gated on a completed +
evaluated interview — GATE_LOCKED/GATE_EVALUATING/GATE_FAILED route back
to onboarding, do not blind-retry).candidate.accept_invitation (→ APPLIED) /
candidate.decline_invitation (TERMINAL — blocks re-invite; confirm
first). See what's pending with candidate.get_applications.candidate.withdraw_application (soft exit, re-invitable),
candidate.set_saved_job (desired-state, NOT a toggle) /
candidate.get_saved_jobs (PUBLISHED-only).jobUrl/url) and apply (applicationUrl/applyUrl). Never show
apply-only.matchScore and matched/missing skills — treat missing skills as
gaps to discuss, not rejections. (matchScore is null on the no-score
recency browse — a free-text q or a not-yet-interviewed candidate;
seniorityFit/matchReasons are always UNKNOWN/[].)Agent Pick (fit bars bound to real
matchExplanation fields), not a flat list; no-score browse → plain list,
no bars. See references/candidate-recipes.md Recipe 6.jobId as internal/debug metadata unless the user asks
for it.references/candidate-catalog.md. Recipes:
references/candidate-recipes.md. Edge cases:
references/candidate-troubleshooting.md.https://workorai.com/employer/dashboard
(Employer MCP card on the page).employer.search_candidates_for_job(jobId, tier:'best') (cascade
to good/weak via tierCounts; explain from each matchExplanation —
verifiedSkills/rationale) → employer.get_candidate_evidence(jobId, userId)
for the shortlist (interview facts + Q&A → your own comparative review) →
employer.get_candidate(userId) (inspect existingApplications) →
employer.invite_candidate(jobId, candidateUserId). Track with
employer.list_invitations(jobId) and later
employer.list_applicants(jobId).employer.search_candidates_by_query(query) →
pick or create a vacancy → invite.employer.list_applicants(jobId) →
employer.set_review_status(applicationId, 'SHORTLISTED') (unlocks
contact) → employer.get_applicant_detail(applicationId) and
optional employer.get_applicant_transcript.INVITE_BLOCKED: INVITE_NOT_ALLOWED. Always call
employer.get_candidate first when the candidate has any prior
interaction.reviewStatus ∈ {SHORTLISTED, HIRED}. Below that, fields are null.employer.create_job is synchronous and takes 5-30 s (Gemini
parse). On client timeout, do NOT resubmit rawText — recover via
employer.list_jobs({ status: 'DRAFT' }) and pick the newest row.references/employer-catalog.md. Recipes:
references/employer-recipes.md. Edge cases:
references/employer-troubleshooting.md.Read on demand based on intent:
references/candidate-catalog.md — candidate tool mini-schemas (9)references/candidate-recipes.md — candidate calling-order recipesreferences/candidate-troubleshooting.md — candidate-side error scenariosreferences/employer-catalog.md — employer tool mini-schemas (19)references/employer-recipes.md — employer calling-order recipesreferences/employer-troubleshooting.md — employer-side error scenariosreferences/auth-flow.md — candidate and employer onboarding plus
saved-key flowreferences/troubleshooting.md — general / cross-role MCP issuesCopy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/workorai · pinned to the source commit
# Run from your project root
git clone https://github.com/davila7/claude-code-templates.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cc17cf267132cc690dee82239b80a99ec82e4f8
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/cli-tool/components/skills/career/workorai" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/davila7/claude-code-templates.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cc17cf267132cc690dee82239b80a99ec82e4f8
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/cli-tool/components/skills/career/workorai" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/workorai
Scanner static-checks@0.1.0 · commit 5cc17cf26713. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
References credentials, tokens or secret files that a skill should not need.
Evidence: [redacted]· fingerprint 61ea4113f56ba6e8
Fetches remote content at runtime, which can change after review.
Evidence: curl· fingerprint 427e4b79b1f0fc90