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 分