Workorai

io.github.work0r-ai由 GitHub 账号 work0r-ai 发布v0.4.3更新于 Oct 24, 2026

WorkorAI talent marketplace MCP: candidate job search and employer hiring with explainable matching

已验证Streamable HTTP可网页运行效率与工作流商业与电商

概览

AI 生成的概览

WorkorAI 人才市场 MCP:让助手以求职者身份搜索和申请职位,或以雇主身份发布职位、筛选候选人。

可以做什么
  • 以求职者身份搜索、查看和收藏职位,申请职位、接受或拒绝邀请、撤回申请
  • 以雇主身份列出、创建、更新、发布、关闭、归档和删除职位
  • 按职位或自由查询对候选人做语义排序,并获取每位候选人的匹配依据
  • 审阅申请人:列出申请人、查看详情与面试逐字记录、设置审阅状态
  • 管理邀请:邀请候选人、列出待处理邀请、取消邀请
  • 在角色工具尚不可用时说明各角色的入门流程与 MCP 密钥设置
适用场景
当你希望助手代为完成求职侧的搜索与申请步骤,或在雇主侧起草、发布职位并筛选候选人,并需要可解释的匹配评分时使用。
运行要求
远程 MCP 端点位于 workorai.com;清单未声明任何软件包或环境变量。需要 WorkorAI 账号:求职者须完善资料并完成经评估的面试后才能申请,两种角色都需要 MCP 密钥,可从 WORKORAI_MCP_API_KEY 或 WORKORAI_EMPLOYER_MCP_API_KEY、操作系统密钥库或本地备用文件读取。
安装前请注意
该服务器会操作真实的人才市场:工具可创建、发布、关闭、归档和删除职位,提交申请,发送或取消邀请,并更改申请人审阅状态,后者可解锁候选人联系方式。拒绝邀请是终局操作,会阻止雇主再次邀请。MCP 密钥属于凭据:不要放入代码仓库、截图或 MCP 配置,仅在明确同意后使用共享文件备用存储。创建职位会把原始文本发送给 Gemini AI 解析。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Workorai,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.work0r-ai%2Fworkorai/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "workorai": {
      "type": "http",
      "url": "https://workorai.com/mcp"
    }
  }
}

README

WorkorAI Agent Kit

[npm] [License: MIT] [Agent Skill]

WorkorAI Agent Kit packages the workorai Agent Skill and a zero-dependency installer for WorkorAI MCP talent marketplace workflows.

It supports both sides of the marketplace through one skill:

  • Candidates ask prompts like найди мне работу, find me a job, or help me get hired; the skill guides them through onboarding, MCP key setup, and the candidate match tools.
  • Employers ask prompts like найди кандидатов, hire developers, post a job, or review applicants; the skill walks through the 19-tool employer MCP surface (job lifecycle, candidate discovery, invitations, applicants review).

Both roles share one skill name (workorai) and one credential helper, with role-aware storage slots so a dual-role user can keep both keys.

Install

Install the skill and write MCP config for supported local agents:

bash
npx @workorai/agent-kit install

Install for one client:

bash
npx @workorai/agent-kit install --agent codexnpx @workorai/agent-kit install --agent claudenpx @workorai/agent-kit install --agent opencodenpx @workorai/agent-kit install --agent cursornpx @workorai/agent-kit install --agent openclawnpx @workorai/agent-kit install --agent qwennpx @workorai/agent-kit install --agent antigravitynpx @workorai/agent-kit install --agent deepcode

Use a local development MCP endpoint:

bash
npx @workorai/agent-kit install --endpoint http://127.0.0.1:3001/mcp

For isolated installer tests, set WORKORAI_AGENT_HOME to a temporary directory:

bash
WORKORAI_AGENT_HOME=/tmp/workorai-agent-home npx @workorai/agent-kit install

After install, restart the agent client and ask:

text
find me a job

What Is Included

  • skills/workorai/SKILL.md - canonical Agent Skill (thin role router).
  • skills/workorai/agents/openai.yaml - Codex/OpenAI-style UI metadata.
  • skills/workorai/references/
    • candidate-catalog.md - candidate tool mini-schemas
    • candidate-recipes.md - candidate calling-order recipes (incl. the Agent Pick result presentation)
    • candidate-troubleshooting.md - candidate-side error scenarios
    • employer-catalog.md - 19 employer tool mini-schemas
    • employer-recipes.md - hire / review / lifecycle recipes
    • employer-troubleshooting.md - employer-side error scenarios
    • auth-flow.md - candidate and employer onboarding + saved-key flow
    • troubleshooting.md - cross-role MCP transport / saved-key issues
  • skills/workorai/scripts/credential-store.mjs - role-aware consent-based local MCP key storage.
  • bin/workorai-agent.mjs - installer, MCP config writer, diagnostics, and credential command wrapper.

Supported Targets

Agent targetSkill locationMCP config
codex~/.codex/skills/workorai~/.codex/config.toml
claude~/.claude/skills/workorai~/.claude.json
opencode~/.config/opencode/skills/workorai~/.config/opencode/config.json
cursor~/.cursor/skills/workoraiUse WorkorAI MCP config supported by your Cursor setup
openclaw~/.agents/skills/workorai~/.agents/mcp.json
qwen~/.qwen/skills/workoraiConfigure MCP according to your Qwen Code setup
antigravity~/.gemini/antigravity/skills/workoraiConfigure MCP according to your Antigravity setup
deepcode~/.agents/skills/workorai~/.agents/mcp.json
generic~/.agents/skills/workorai~/.agents/mcp.json

The default install command installs a canonical copy at ~/.agents/skills/workorai and links or copies compatible client locations.

Commands

bash
npx @workorai/agent-kit --helpnpx @workorai/agent-kit install --dry-runnpx @workorai/agent-kit configure --agent allnpx @workorai/agent-kit print-config --agent codexnpx @workorai/agent-kit doctor --agent allnpx @workorai/agent-kit credential get

Credentials

The skill reads WorkorAI MCP keys role-aware. Default --role is candidate; pass --role=employer for the employer slot.

Candidate read order:

  1. WORKORAI_MCP_API_KEY
  2. OS secret store (account candidate)
  3. Shared local fallback at ~/.config/workorai/mcp-token

Employer read order:

  1. WORKORAI_EMPLOYER_MCP_API_KEY
  2. OS secret store (account employer)
  3. Shared local fallback at ~/.config/workorai/mcp-token-employer

Save with OS storage by default:

bash
npx @workorai/agent-kit credential save                  # candidate (default)npx @workorai/agent-kit credential save --role=employer

Use best-effort storage for headless agent sessions:

bash
npx @workorai/agent-kit credential save --best-effort --role=candidatenpx @workorai/agent-kit credential save --best-effort --role=employer

Use the shared file fallback only after explicit user consent:

bash
npx @workorai/agent-kit credential save --shared-file --role=<role>

Never put real WorkorAI MCP keys in repositories, screenshots, issue text, or MCP config. Redact keys as wai_[REDACTED].

Skill Hub Compatibility

This repository is structured for direct ingestion by major skill surfaces:

  • GitHub: readable standalone repository with license, security policy, CI, and contribution docs.
  • npm: @workorai/agent-kit CLI package for one-command install.
  • Codex/OpenAI-style skills: canonical folder at skills/workorai plus agents/openai.yaml.
  • Claude Code: standard SKILL.md folder installable into .claude/skills/ or ~/.claude/skills/.
  • OpenCode: standard SKILL.md folder installable into .opencode/skills/, ~/.config/opencode/skills/, or Claude-compatible locations.
  • Cursor: standard SKILL.md folder installable into .cursor/skills/ or ~/.cursor/skills/.
  • Qwen Code: standard SKILL.md folder installable into .qwen/skills/ or ~/.qwen/skills/.
  • Antigravity / Gemini Antigravity: standard SKILL.md folder installable into ~/.gemini/antigravity/skills/.
  • Deep Code / DeepSeek: standard SKILL.md folder installable into .deepcode/skills/ or the shared ~/.agents/skills/.
  • skills.re and similar registries: root skills/ folder with at least one skill directory.
  • Cursor/Windsurf-compatible hubs: canonical SKILL.md folder plus generic MCP config notes in registry/.

Submission notes live in registry/submission-checklist.md.

Candidate Onboarding

When personalized MCP access is not available, the skill guides the user through:

  1. Register and sign in: https://workorai.com/candidate/login
  2. Complete profile: https://workorai.com/candidate/profile
  3. Complete the profile interview and wait for evaluation.
  4. Generate or copy the MCP key: https://workorai.com/candidate/home?tab=mcp
  5. Paste the key into the agent session for immediate candidate.search_jobs use.

Employer Onboarding

When the user asks to hire, post jobs, or review candidates, the skill guides them through:

  1. Sign in: https://workorai.com/employer/login
  2. Open the Employer Dashboard and locate the Employer MCP card: https://workorai.com/employer/dashboard
  3. Generate or copy the MCP key from the card.
  4. Paste the key into the agent session for immediate employer.* tool use.
  5. Save with --role=employer for future hiring searches.

The 19 employer tools cover the full hire-to-review lifecycle. See skills/workorai/references/employer-catalog.md for the mini-schemas and skills/workorai/references/employer-recipes.md for the four calling-order recipes (hire from a specific job, free-form hire, funnel review, pending-invites cleanup) plus the job lifecycle (create → publish → close → archive).

Development

bash
npm run validatenpm run smokenpm pack --dry-run

npm run smoke installs into a temporary directory only and does not touch user agent config.

Release

  1. Update CHANGELOG.md.
  2. Run validation, smoke, and npm pack --dry-run.
  3. Tag the GitHub release.
  4. Publish npm:
bash
npm publish --access public
  1. Submit the repository URL to relevant skill hubs using registry/submission-checklist.md.

License

MIT. See LICENSE.

来源:README.md,提交 b7187c2

工具

29

request_access

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.

输入参数role

candidate.search_jobs

Search matched 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 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.

输入参数qtierlimitapiKeyoffsetjobTypeseniorityworkModel

candidate.get_job

Get job

Fetch a single published job by id.

输入参数jobId必填apiKey

candidate.get_applications

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.

输入参数apiKey

candidate.set_saved_job

Save / unsave 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.

输入参数jobId必填saved必填apiKey

candidate.get_saved_jobs

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.

输入参数apiKey

candidate.accept_invitation

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.

输入参数jobId必填apiKey

candidate.decline_invitation

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 is not found.

输入参数jobId必填apiKey

candidate.withdraw_application

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.

输入参数jobId必填apiKey

candidate.apply_to_job

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 missing or non-public job returns NOT_FOUND.

输入参数jobId必填apiKey

employer.list_jobs

List jobs

List jobs owned by the current employer account.

输入参数limitapiKeyoffsetstatus

employer.get_job

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).

输入参数jobId必填apiKey

employer.create_job

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.

输入参数apiKeyrawText必填

employer.update_job

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.

输入参数jobId必填apiKeyfields必填

employer.publish_job

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.

输入参数jobId必填apiKey

employer.close_job

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.

输入参数jobId必填apiKey

employer.archive_job

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.

输入参数jobId必填apiKey

employer.delete_job

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.

输入参数jobId必填apiKey

employer.search_candidates_for_job

Search candidates for a 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), 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).

输入参数pagesorttierjobId必填apiKeypageSize

employer.search_candidates_by_query

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_for_job with a job id.

输入参数pagequery必填apiKeypageSize

employer.get_candidate

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 can decide whether re-inviting will succeed. Heavy artefacts (transcript, facts, resume, github, linkedin) live behind employer.get_applicant_detail and require an application.

输入参数apiKeyuserId必填

employer.get_candidate_evidence

Get candidate interview 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_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.

输入参数jobId必填apiKeyuserId必填

employer.invite_candidate

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, 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).

输入参数jobId必填apiKeycandidateUserId必填

employer.list_applicants

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.

输入参数jobId必填apiKey

employer.set_review_status

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.

输入参数apiKeyreviewStatus必填applicationId必填

employer.get_applicant_detail

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.

输入参数apiKeyapplicationId必填

employer.get_applicant_transcript

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.

输入参数apiKeyapplicationId必填

employer.list_invitations

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.

输入参数jobId必填apiKey

employer.cancel_invitation

Cancel invitation

Cancel a pending invitation sent to a candidate. The invitation record is deleted; the employer can re-invite the same candidate later.

输入参数jobId必填apiKeycandidateUserId必填

版本历史

1
  1. v0.4.3最新Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分