Skip to main content
Glama

workorai

Search candidates for a job

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

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNo
sortNo
tierNoMatch-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).
jobIdYes
apiKeyNo
pageSizeNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
okNo
pageNo
jobIdNo
reasonNo
entriesNo
advisoryNoOPTIONAL, present only when NO candidate reaches the Best tier for a constrained vacancy (best===0 but candidates exist below). A non-restrictive nudge to relay to the employer: the vacancy's must-have requirements may be strict enough that nobody is an exceptional match — consider moving the less-critical must-haves to nice-to-have to widen the pool. A SUGGESTION, never an instruction to auto-edit the job.
tierCountsNoBand sizes to plan a tier cascade: matched = cover >=1 required skill, unmatched = cover none; best/good/weak split the matched pool (best+good+weak === matched on a scored search; all bands 0 on a newest browse). Use to decide whether to fetch tier:'best' then 'good'/'weak'.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses pagination semantics (page.hasMore vs page.total), error conditions with meanings (NOT_FOUND for missing/owned job, NOT_INDEXED/NO_CATEGORIES for unindexed jobs), and behavior nuances like sort:"newest" ignoring tier. This goes well beyond basic expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded with purpose and structured into numbered workflow steps. Every sentence adds value (workflow, error handling, back-compat). It could be slightly more concise, but the density is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (tiers, pagination, white-box explanations, error cases) and the presence of an output schema, the description is exceptionally complete. It covers not only the search behavior but also post-processing steps and error recovery, making it a self-contained guide for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 17% (only tier has a schema description), so the description must compensate. It explains tier in depth, mentions page.hasMore, and references matchExplanation. However, pageSize and apiKey are not elaborated, though their roles are fairly standard. The description adds significant meaning for the key parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Semantically rank discoverable (interviewed) candidates against one of the employer's own jobs, with a per-candidate fit score AND a white-box explanation.' This clearly distinguishes it from sibling tools like search_candidates_by_query and candidate.search_jobs by focusing on ranking against a specific job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a multi-step workflow: start with tier:'best', cascade to 'good'/'weak' based on tierCounts and page.hasMore, use matchExplanation for explainability, and call employer.get_candidate_evidence for deeper review. It also clarifies when to omit tier for back-compat, making usage guidance explicit and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A3.8/5.0
Disambiguation5/5

Every tool in the candidate and employer sets targets a distinct action or resource with no ambiguity. Tools like `search_candidates_by_query` and `search_candidates_for_job` have clearly different purposes, and all other tools perform unique operations.

Naming Consistency5/5

All tools follow a consistent `domain.action` pattern with snake_case action names. The naming is uniform across both candidate and employer tools, using standard verbs like get, list, create, update, delete, search, set, etc.

Tool Count4/5

29 tools cover two distinct user roles (candidate and employer) with separate workflows. While above the typical 3-15 range, each tool serves a specific purpose and the count is justified for a hiring platform's API surface.

Completeness4/5

The tool surface provides comprehensive CRUD and lifecycle operations for jobs, applications, invitations, and candidate searches for both roles. Minor gaps like candidate profile update tools are likely handled outside the MCP server, so the set feels nearly complete.