Search matched jobs
candidate.search_jobsSemantically 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.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| tier | No | 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 | No | ||
| apiKey | No | Optional WorkorAI MCP key for in-session authentication when the MCP client was initialized anonymously. | |
| offset | No | ||
| jobType | No | ||
| seniority | No | ||
| workModel | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ok | No | ||
| jobs | No | ||
| page | No | ||
| filters | No | ||
| tierCounts | No | Band sizes for a tier cascade: matched = jobs covering >=1 required skill, unmatched = none; best/good/weak split the matched pool (all bands 0 on a free-text q / no-interview browse). Start at tier:'best', cascade if needed. |