Skip to main content
Glama
Comradery64

open-greenhouse-mcp

by Comradery64

open-greenhouse-mcp

PyPI CI Python 3.10+ License: MIT open-greenhouse-mcp MCP server

Production-ready MCP server for Greenhouse, designed for recruiters and hiring teams.

Most Greenhouse MCP servers mirror the API endpoint by endpoint. This one is built for recruiting teams: safe defaults, role-based profiles, and workflow tools that turn multi-step API operations into single actions.

Choose a Profile

Profile

Tools

Can write?

Recommended for

read-only

103

No

First-time setup, reporting, hiring managers

recruiter (default)

127

Yes (safe ops)

Day-to-day recruiting work

full

181

Yes (all)

Admins, ops, advanced automation

Related MCP server: Greenhouse MCP Server by CData

Quick Start

pip install open-greenhouse-mcp

Add to your MCP client config (Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json, Cursor: Settings > MCP):

{
  "mcpServers": {
    "greenhouse": {
      "command": "open-greenhouse-mcp",
      "env": {
        "GREENHOUSE_CLIENT_ID": "your-harvest-client-id",
        "GREENHOUSE_CLIENT_SECRET": "your-harvest-client-secret",
        "GREENHOUSE_TOOL_PROFILE": "read-only"
      }
    }
  }
}

Start in read-only mode to validate connectivity and tool behaviour, then switch to recruiter or full when you need write access.

Your client ID and secret come from Greenhouse under Configure > Dev Center > API Credential Management, created by someone with Can manage ALL organization's API Credentials. Harvest v3 grants access per endpoint, so the credential needs scopes for the endpoints you intend to use.

Harvest v3. Harvest v1 and v2 became unavailable after 2026-08-31, so the older per-person GREENHOUSE_API_KEY no longer opens Harvest. Tools not yet verified against the v3 guides are withheld at startup rather than left registered and broken — see docs/harvest-v3-migration.md.

What You Can Ask

  • "Show me the pipeline for our Senior Engineer role"

  • "Who needs my attention this week?"

  • "What are our conversion rates for the Backend Intern role?"

  • "Find Sarah Chen and pull up her resume"

  • "Which sources are actually producing hires?"

  • "Bulk reject everything inactive for 30+ days on the Account Manager role"

  • "Screen this candidate for the Backend Engineer role — give me the full picture"

  • "Search our engineering pipelines for anyone with Rust and distributed systems experience"

  • "What new applications came in since yesterday?"

See more examples with full output.

See it in action

Demo

Safety

  • Access is limited by your Greenhouse API key permissions

  • Read-only profile is recommended for first setup

  • Destructive actions require explicit IDs — the server never infers targets

  • Write operations support audit attribution via GREENHOUSE_ON_BEHALF_OF

  • Bulk actions are rate-limited to stay within API limits

Compatibility

Client

Status

Claude Desktop

Supported

Claude Code

Supported

Cursor

Supported

Transport

stdio

Python

3.10+

Startup

When the server starts, it logs its configuration:

open-greenhouse-mcp v0.4.0
Profile: recruiter | Tools: 127 | Writes: recruiter-safe | APIs: harvest, ingestion

What's Included

  • Screening & sourcing tools — 6 tools for candidate screening, resume search with boolean keywords, daily digest, and location detection

  • Recruiter workflow tools — 13 composite tools for pipeline views, analytics, search, and bulk operations

  • Harvest API coverage — 148 tools across candidates, applications, jobs, offers, interviews, and more

  • Job Board API — 13 tools for public job listings and application submission

  • Optional webhooks and ingestion — 14 tools for event-driven workflows and partner integrations


Reference

Screening & Sourcing Tools

Tools for candidate evaluation and proactive talent search.

Tool

What it does

screen_candidate

Complete screening package — profile, resume text, location, screening answers, job description, history

fetch_new_applications

Applications since a date, grouped by job — the daily recruiter digest

scan_pipeline_resumes

Search resume text across pipelines with boolean keywords (required/preferred/exclude)

search_pipeline_candidates

Search pipelines by structured fields — title, company, education, experience, tags

scan_all_candidates

Database-wide candidate search by structured fields with date bounds

batch_read_resumes

Batch-fetch and extract resume text for multiple candidates

Composite Tools

High-level tools that combine multiple API calls into single operations.

Tool

What it does

pipeline_summary

Full pipeline view — candidates grouped by stage with names and days-in-stage

candidates_needing_action

Find stale applications and interviews missing scorecards

stale_applications

Applications with no activity for N days, sorted by stalest

pipeline_metrics

Conversion rates, hire/rejection rates, time-in-stage per stage

source_effectiveness

Which candidate sources produce the best hire rates

time_to_hire

Average, median, min, max days from application to hire

bulk_reject

Reject multiple applications in one call with rate-limit handling

bulk_tag

Tag multiple candidates in one call

bulk_advance

Advance multiple applications to next stage

search_candidates_by_name

Find candidates by first or last name

search_candidates_by_email

Look up a candidate by exact email

read_candidate_resume

Download and return a candidate's most recent resume

download_attachment

Download any Greenhouse attachment by URL

Profile Details

Recruiter includes all read tools, all screening/sourcing tools, all composite workflows, and recruiter-safe writes: reject, advance, hire, move, tag, notes, attachments, interviews, prospects, and bulk operations. It excludes job creation, user management, custom field configuration, candidate deletion, and webhook management.

Read-only skips all write operations. GREENHOUSE_READ_ONLY=true also works as a shorthand.

Configuration

Variable

Required

Description

GREENHOUSE_CLIENT_ID

Yes*

Harvest v3 client ID

GREENHOUSE_CLIENT_SECRET

Yes*

Harvest v3 client secret

GREENHOUSE_USER_ID

No

Your Greenhouse user ID — attributes v3 calls and derives the tool profile

GREENHOUSE_BOARD_TOKEN

Yes*

Job board URL slug. *Client credentials or a board token required

GREENHOUSE_API_KEY

No

Legacy v1 key — Job Board / Ingestion APIs only, not Harvest

GREENHOUSE_ALLOW_UNMIGRATED_TOOLS

No

Set 1 to register Harvest tools not yet verified against v3

GREENHOUSE_STRICT_PROJECTION

No

Set 1 to fail (not warn) when a payload field is missing

GREENHOUSE_TOOL_PROFILE

No

recruiter (default), read-only, or full

GREENHOUSE_ON_BEHALF_OF

No

Greenhouse user ID for write audit trail

GREENHOUSE_LOG_LEVEL

No

debug, info, warning (default), error

GREENHOUSE_LOG_FILE

No

Log file path (defaults to stderr)

GREENHOUSE_MAX_RESULT_BYTES

No

Tool-result size budget in bytes (default 60000)

GREENHOUSE_DIAGNOSTICS_FILE

No

Diagnostics file path (defaults beside Claude's logs)

GREENHOUSE_DIAGNOSTICS

No

Set off to disable the diagnostics file

Logging

Structured JSON logging for observability. Set GREENHOUSE_LOG_LEVEL=info to enable:

{"ts": "2026-04-14T12:31:58", "level": "info", "event": "api_call", "method": "GET", "url": "...", "status": 200, "latency_ms": 245.0}

More Documentation

  • API Reference — Full tool breakdown by category

  • Usage Examples — Real conversations with full output

  • Advanced Setup — Webhook receiver, ingestion API, board-token mode

  • Development — Contributing, testing, project structure

  • Handoff — start here: current state, the verified v3 contract, and the traps that cost real records to find

  • Harvest v3 migration — full endpoint detail. Reads are verified live; writes are not, and 121 tools stay withheld until they are

Changelog

Current version: 0.5.5. Full detail for every release lives in CHANGELOG.md; this is the short version.

0.5.5 — reliability and error reporting

Aimed at deployments where the people using the tools are recruiters, not engineers, so a failure has to be self-explanatory and reportable.

  • Result-size shaping — results are measured and kept within a size budget (60KB default, GREENHOUSE_MAX_RESULT_BYTES to override). A 500-job /jobs page runs to ~1.1MB and clients reject an oversized tool result outright, so the user saw a bare failure instead of an answer. Shaping degrades lazily: untouched if it already fits, then field projection, then text clamping, then dropping rows — attaching returned/total_found and a note telling the model to narrow by a real filter or walk pages, rather than telling the user about flags. Composite tools calling list_* internally still get complete data.

  • User-relayable errors — every failure carries a plain-English user_message, a support_code like GH403-0730-1421-7F2D the user can paste into a support request, and user_can_resolve to separate "check the spelling" from "escalate, you cannot fix this".

  • Always-on diagnostics file — notable events append to a JSON-lines file at a fixed path, so support is "send me this file" instead of asking a recruiter to reproduce with logging turned up. GREENHOUSE_DIAGNOSTICS=off to disable.

  • Default profile is now recruiter, not full — an unset or unrecognised GREENHOUSE_TOOL_PROFILE used to register every tool with writes enabled, including destructive ones. Explicit values, including full, are unchanged.

  • Fixed: 400 and 409 responses were treated as success data — only an enumerated set of statuses became errors, so a rejected filter value came back looking like a real record. Any status >= 400 is now an error.

0.4.0 — screening and sourcing

screen_candidate, fetch_new_applications, search_pipeline_candidates, scan_all_candidates, batch_read_resumes, and scan_pipeline_resumes, plus server-side PDF/DOCX resume text extraction and a 5-step location detection cascade.

0.3.0 — profiles and logging

Tool profiles via GREENHOUSE_TOOL_PROFILE (full / recruiter / read-only) and structured JSON logging with per-call method, status, and latency.

0.2.1 — packaging

PyPI metadata: keywords, classifiers, and project URLs.

0.2.0 — composite tools

13 composite tools for recruiter workflows.

0.1.0 — initial release

Harvest, Job Board, and Ingestion API coverage.

Skills

skills/ holds the Claude skills that drive these tools for recruiters — application triage, candidate screening, pipeline search, and resume batch review. Skills are distributed separately from the extension bundle: upload each directory to Claude as a skill, alongside installing the .mcpb.

They name MCP tools in prose, so a rename or a tool dropped from the bundle's pinned profile would break them silently, at the moment a recruiter tried to use one. tests/test_skills.py matches the registered tool set against each skill's text and fails the build instead. Cited tools are discovered from the files rather than a hardcoded list, so newly cited tools are covered automatically.

Relationship to upstream

This project began as a fork of benmonopoli/open-greenhouse-mcp (MIT, Copyright © 2026 Ben Monopoli), which remains the origin of the great majority of this code. The LICENSE file is unchanged and continues to carry that notice.

Changes made here, released as 0.5.5:

  • Result-size shaping, so a large tool result is trimmed to fit rather than rejected

  • User-relayable error messages carrying a support code a non-technical user can pass on

  • An always-on diagnostics file, so support does not depend on reproducing a failure

  • A curated assistant tool profile, and a safe default profile instead of full

  • A fix for error statuses being treated as success data

  • An upper bound on mcp, without which a clean install resolves 2.0.0 and the package cannot be imported at all

  • A release workflow producing a cross-platform Claude Desktop bundle

To pull in future upstream work:

git remote add upstream https://github.com/benmonopoli/open-greenhouse-mcp.git
git fetch upstream && git merge upstream/main

Feedback

License

MIT License -- Ben Monopoli. See LICENSE.

Available Tools

33 tools
add_note_to_candidateA

Add a text note to a candidate's activity feed. Write operation.

Users say "add a note to Sarah's profile" or "log that I spoke with John." To get candidate_id: search_candidates_by_name.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesNote text content (plain text or HTML)
visibilityNo'private' (default, you only) or 'public' (visible to all users)private
candidate_idYesGreenhouse candidate ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior2/5

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

Without annotations, the description carries the full burden, but it only adds 'Write operation,' which is already implied by the verb 'Add.' It doesn't disclose permissions, reversibility, or other side effects beyond saying the note appears in the activity feed. This is insufficient for a mutation tool.

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 brief and front-loaded, with the core action in the first sentence. The example utterances and prerequisite are useful and non-redundant, though 'Write operation' is somewhat redundant given the action.

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

Completeness4/5

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

Given the presence of an output schema and the simplicity of the tool, the description covers the essential context: what it does, when users would invoke it, and how to get the required ID. It could benefit from noting the visibility options, but those are in the schema.

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?

The schema covers all 3 parameters with descriptions, so baseline is 3. The description adds value by explaining how to locate candidate_id via search_candidates_by_name, which goes beyond the schema. Body and visibility are adequately documented in the schema.

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 clearly identifies the action ('Add a text note') and the target resource ('candidate's activity feed'), distinguishing it from sibling tools like add_tag_to_candidate by specifying it's a text note. The 'Write operation' phrase reinforces the mutation intent.

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

Usage Guidelines4/5

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

It provides concrete user utterances ('add a note to Sarah's profile') that signal when to use this tool, and points to search_candidates_by_name as the way to obtain the required candidate_id. However, it doesn't explicitly state when not to use it or mention alternative tools like add_tag_to_candidate.

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

add_tag_to_candidateA

Apply a tag to a candidate. Write operation.

Users say "tag Sarah as 'referred'" or "mark John as strong hire." For candidate_id: search_candidates_by_name. For tag_id: list_tags → match by name. For bulk tagging, use bulk_tag instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYesTag ID to apply — get from list_tags or create_tag
candidate_idYesGreenhouse candidate ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It explicitly labels the operation as 'Write operation', which is useful, and implies tags must already exist (via 'list_tags → match by name'). However, it does not disclose idempotency, behavior on duplicate tags, permissions required, or error conditions, leaving notable gaps in behavioral transparency.

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

Conciseness5/5

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

The description is compact and front-loaded: a one-sentence purpose, followed by terse usage examples, ID resolution tips, and a single alternative tool mention. Every sentence earns its place with no redundancy.

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

Completeness4/5

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

For a simple two-parameter write operation with an output schema present, the description covers purpose, usage, ID resolution, and alternatives. It does not explain edge cases like duplicate tags or required permissions, but these are not essential for basic invocation. The explicit 'Write operation' flag partially compensates for missing annotations.

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 coverage is 100% with descriptions for both candidate_id and tag_id. The description adds value beyond the schema by recommending how to find each ID (search_candidates_by_name, list_tags → match by name) and providing real-world usage phrasing that helps the agent map user intent to 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 clearly states 'Apply a tag to a candidate' with a specific verb and resource. It also distinguishes itself from the sibling tool bulk_tag by explicitly directing bulk tagging elsewhere, and the name itself differentiates from add_note_to_candidate.

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?

The description provides explicit when-to-use guidance with natural language examples ('tag Sarah as referred'), how to resolve candidate_id and tag_id via search_candidates_by_name and list_tags, and an explicit exclusion for bulk tagging ('use bulk_tag instead'). This fully covers usage context and alternatives.

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

advance_applicationA

Move a candidate forward one stage in their job pipeline. Write operation.

Users say "advance Sarah to the next stage" or "move John forward." To get the application_id: search_candidates_by_name → get_candidate → match the application to the job. Stage IDs are optional — omit to advance to the natural next stage. To skip stages, use move_application_same_job. For bulk advancing, use bulk_advance.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_stage_idNoTarget stage — from list_job_stages_for_job. Omit for next stage
from_stage_idYesCurrent stage ID — from list_job_stages_for_job or get_application
application_idYesGreenhouse application ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses that this is a write operation, explains default behavior when stage IDs are omitted ('advance to the natural next stage'), and implies a state change. However, it does not mention edge cases like what happens if the candidate is already at the final stage, or any permission/authorization requirements, which would ideally be included for a mutation tool with no annotation support.

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

Conciseness5/5

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

The description is well-structured: a clear opening statement, then usage examples, a workflow hint, and explicit alternative tools. Every sentence adds value and the length is appropriate for the tool's complexity. It is front-loaded with the core purpose.

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

Completeness4/5

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

The tool has an output schema (not shown), so return values need not be described. The description provides the core purpose, usage context, parameter guidance, and alternatives. It is adequate for a single-application advancement but could be slightly more complete with edge-case behavior. Overall, it is a well-rounded description.

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?

The input schema already provides 100% description coverage. The tool description adds meaningful context beyond the schema: it explains how to get the application_id via a search chain, and clarifies that to_stage_id is optional and defaults to the next natural stage. This helps the agent understand parameter intent beyond the basic descriptions.

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 clearly states the action: 'Move a candidate forward one stage in their job pipeline.' This is a specific verb+resource combination that distinguishes it from sibling tools like reject_application or bulk_advance. The 'Write operation' note further clarifies its nature.

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 explicit usage guidance: includes example user phrases, a step-by-step workflow for obtaining the application_id, and clearly names alternatives ('To skip stages, use move_application_same_job. For bulk advancing, use bulk_advance.'). This goes beyond minimal guidance to actually direct the agent on when to use this tool vs alternatives.

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

bulk_advanceA

Advance multiple applications to the next stage. Write operation — rate-limited.

Users say "move everyone past phone screen forward." Get application_ids from pipeline_summary or list_applications. Optionally specify from_stage_id (list_job_stages_for_job → match by name) to only advance candidates in that specific stage. Processes sequentially with rate-limit delays.

ParametersJSON Schema
NameRequiredDescriptionDefault
from_stage_idNoCurrent stage ID — omit to advance each app from its current stage
application_idsYesApplication IDs to advance

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description takes on full responsibility. It clearly states 'Write operation — rate-limited' and 'Processes sequentially with rate-limit delays,' which are critical behavioral traits. It doesn't mention permission requirements or partial failure behavior, but the key operational constraints are disclosed.

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

Conciseness5/5

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

The description is compact and front-loaded: purpose, critical warning, practical usage, and optional parameter logic—all in three sentences with no wasted words. Every sentence adds value.

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

Completeness4/5

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

Given the tool's complexity (bulk operation, optional filtering, rate limits) and the presence of an output schema, the description adequately covers what an agent needs: how to identify target applications, when to use from_stage_id, and the sequential/rate-limited execution. It could mention error handling or what happens if some applications are invalid, but that's a minor gap given the schema's output coverage.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds significant meaning: it tells users to get application_ids from pipeline_summary or list_applications, and explains that from_stage_id should be matched by name via list_job_stages_for_job. This is practical workflow knowledge beyond the schema's field descriptions.

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 'Advance multiple applications to the next stage,' a specific verb+resource combination. The word 'multiple' distinguishes it from the sibling tool advance_application, which handles single applications.

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

Usage Guidelines4/5

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

It provides clear guidance on when to use: includes a natural-language trigger ('move everyone past phone screen forward'), tells users where to get application_ids (pipeline_summary or list_applications), and how to optionally filter by stage using list_job_stages_for_job. It doesn't explicitly say 'use advance_application for a single application,' but the bulk semantics make it clear.

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

bulk_rejectA

Reject multiple applications in one call. Write operation — rate-limited.

Users say "reject everyone who's been inactive for 30 days on the Backend role." First use stale_applications to identify the targets, then pass their application_ids here. For rejection_reason_id: list_rejection_reasons → match by name. Processes sequentially with rate-limit delays.

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idsYesApplication IDs to reject — get from list_applications or pipeline_summary
rejection_emailNoSend rejection email to each candidate
rejection_reason_idNoRejection reason ID — get from list_rejection_reasons

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses that this is a 'Write operation — rate-limited' and that it 'Processes sequentially with rate-limit delays.' This adds useful behavioral context beyond the schema, though it does not mention reversibility or other side effects like email sending (which is parameterized).

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 a compact paragraph with a clear front-loaded first sentence. The user example and workflow are relevant, but the text is somewhat dense and could be structured with bullets or shorthand. Still, every sentence adds value.

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

Completeness4/5

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

Given the tool's complexity (batch write operation, 3 params, output schema), the description is fairly complete. It covers the use case, prerequisites, and rate-limit behavior. Minor omissions like maximum batch size or error handling are not described, but the output schema likely sufficient.

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?

The schema already describes all parameters (100% coverage), so the baseline is 3. The description adds extra semantics by describing how to obtain application_ids via stale_applications and how to match rejection_reason_id by name using list_rejection_reasons, which enriches the parameter guidance.

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 explicitly states 'Reject multiple applications in one call,' which is a specific verb (reject), resource (applications), and scope (multiple in one call). This clearly distinguishes it from the sibling reject_application, which handles a single application.

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

Usage Guidelines4/5

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

The description provides a concrete usage example: 'First use stale_applications to identify the targets, then pass their application_ids here.' It also advises matching rejection_reason_id via list_rejection_reasons, giving a clear workflow. However, it does not explicitly state when not to use this tool (e.g., for a single rejection), so it lacks full exclusion guidance.

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

bulk_tagA

Tag multiple candidates in one call. Write operation — rate-limited.

Users say "tag all the candidates from the hiring event." Pass candidate_ids from search or pipeline tools and a tag_name (created automatically if new). Processes sequentially with rate-limit delays.

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_nameYesTag name to apply — created on-the-fly if it doesn't exist
candidate_idsYesCandidate IDs to tag — get from list_candidates or search

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses that it is a write operation, is rate-limited, processes sequentially with delays, and auto-creates tags if new. This is strong behavioral disclosure beyond the schema, though it does not cover error handling or edge cases.

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

Conciseness5/5

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

The description is three sentences, front-loaded with the core action, then adds a practical usage example and rate-limit behavior. No wasted words; every sentence contributes useful context.

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

Completeness4/5

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

For a simple 2-parameter tool with an output schema, the description covers the essential safety profile (write, rate-limited), usage context, and parameter sources. It could be more explicit about alternatives, but overall it is complete enough for an agent to select and invoke correctly.

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

Parameters3/5

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

Schema coverage is 100% and already explains both parameters, including the auto-creation of tags. The description adds minimal new semantic value by mentioning 'from search or pipeline tools,' but this largely duplicates the schema's 'get from list_candidates or search.' Baseline 3 is appropriate.

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 'Tag multiple candidates in one call,' which clearly states the verb, resource, and batch scope. It distinguishes itself from single-candidate tagging siblings like add_tag_to_candidate by emphasizing 'multiple' and 'bulk' behavior.

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

Usage Guidelines4/5

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

The description provides concrete usage context: 'Users say "tag all the candidates from the hiring event"' and instructs to pass candidate_ids from search or pipeline tools. It implicitly differentiates from single-tag tools but does not explicitly state when not to use it or name alternatives.

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

candidates_needing_actionA

Find candidates that need attention — stale apps, missing scorecards. Read-only.

Users say "what needs my attention?" or "who's been sitting too long?" Pass job_id for one job (list_jobs → match by name) or omit for all active applications. Returns stale applications sorted by urgency and interviews missing scorecards.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idNoFilter to one job — list_jobs → match by name
stale_daysNoDays without activity to flag as stale

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It explicitly states 'Read-only', discloses that results are sorted by urgency, and clarifies that it returns both stale applications and interviews missing scorecards. This is solid behavioral disclosure, though it does not mention pagination or rate limits.

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

Conciseness5/5

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

The description is compact and front-loaded, leading with the core purpose and read-only nature, then providing user-intent examples and parameter guidance. Every sentence adds value without unnecessary verbosity.

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

Completeness4/5

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

For a simple read-only query tool with two optional parameters, an output schema, and clear sibling alternatives, the description covers purpose, usage, parameter behavior, and return contents. It could mention pagination or sorting direction more explicitly, but it is largely complete for the tool's complexity.

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

Parameters3/5

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

Schema coverage is 100% and the parameter descriptions already explain job_id ('Filter to one job — list_jobs → match by name') and stale_days ('Days without activity to flag as stale'). The tool description adds a little context ('omit for all active applications') but mostly reinforces what the schema already conveys, so the baseline of 3 is appropriate.

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 uses a specific verb ('find') and resource ('candidates that need attention'), and clearly defines the scope as stale applications and missing scorecards. It distinguishes itself from the sibling 'stale_applications' by adding the scorecard component and the attention/urgency framing.

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

Usage Guidelines4/5

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

It provides clear usage context with example user queries ('what needs my attention?', 'who's been sitting too long?') and explains when to pass job_id versus omit it. It does not explicitly name exclusions or alternatives, but the guidance is sufficient for a straightforward read-only query tool.

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

download_attachmentA

Download content from a Greenhouse attachment URL. Read-only.

Use when you have a specific attachment URL from a candidate or application record (e.g., from get_candidate's attachments array).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAttachment URL — from candidate attachments or application data

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose that the operation is read-only, which is a key behavioral trait. However, it does not mention potential error conditions, rate limits, or how the content is returned (binary vs base64), though the output schema likely covers return format.

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

Conciseness5/5

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

The description is two short sentences that convey purpose, read-only nature, and usage guidance. No filler, front-loaded with the main action, and every sentence earns its place.

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?

For a simple one-parameter download tool with an output schema, the description fully covers the when and where. The usage context is clear, the parameter is well-defined, and no ambiguity remains about intended use.

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?

The schema fully describes the required 'url' parameter (100% coverage), meeting the baseline. The description adds value by contextualizing the parameter's source (from candidate attachments or application data) and giving a concrete example of where to obtain it, going slightly beyond the schema.

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 states a specific verb ('Download') and resource ('content from a Greenhouse attachment URL'), making the tool's function immediately clear. It also implicitly distinguishes itself from siblings by focusing specifically on attachment URLs, unlike read_candidate_resume or other resume-specific tools.

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

Usage Guidelines4/5

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

The description gives explicit guidance on when to use the tool ('Use when you have a specific attachment URL from a candidate or application record') and provides a concrete example (get_candidate's attachments array). It does not name alternative tools or exclude cases, but the context is strong.

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

fetch_new_applicationsA

Applications since a date, grouped by job — the daily digest. Read-only.

Users say "what new applications came in since yesterday?" Pass since as an ISO date. Optionally filter to one job with job_id (list_jobs → match by name). Returns applications grouped by job with candidate names, sources, stages, and screening answers.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceYesISO 8601 date — e.g. '2026-04-14' for yesterday
job_idNoFilter to one job — list_jobs → match by name
statusNoFilter by status: 'active', 'rejected', or 'hired'active
include_candidate_detailsNoInclude candidate names (adds API calls)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It states 'Read-only,' which is a key behavioral trait, and describes the return format (grouped by job with candidate names, sources, stages, screening answers). It does not mention potential side effects or API cost details beyond the schema, but the read-only declaration and output shape provide solid transparency.

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

Conciseness5/5

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

Three sentences: a front-loaded summary, a user-quote example, and a return-format explanation. Every sentence earns its place, with zero fluff. The structure is clear and immediately scannable.

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 presence of an output schema and the read-only nature, the description covers the essentials: purpose, usage example, parameter handling, and return shape. It adequately differentiates from sibling tools and provides enough context for an agent to select and invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description repeats the schema guidance for 'since' and 'job_id' (e.g., 'list_jobs → match by name') but adds no new parameter semantics beyond what the schema already provides. It does not mention 'status' or 'include_candidate_details' defaults, relying on the schema.

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 uses a specific verb+resource+scope: 'Applications since a date, grouped by job — the daily digest.' It clearly distinguishes from siblings like list_applications by emphasizing grouping and the daily digest use case, and it explicitly mentions returning candidate names, sources, stages, and screening answers.

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

Usage Guidelines4/5

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

The description provides a clear use case: 'Users say "what new applications came in since yesterday?"' and explains how to filter by job via list_jobs. It does not explicitly name alternatives or state when not to use it, but the context makes the primary scenario obvious. It lacks direct exclusions, so it falls short of a 5.

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

get_activity_feedA

Get a candidate's activity timeline. Read-only.

Users say "show me Sarah's history" or "what's happened with this candidate?" To find candidate_id: search_candidates_by_name. Returns notes, emails, stage changes, and other timeline events in chronological order.

ParametersJSON Schema
NameRequiredDescriptionDefault
candidate_idYesGreenhouse candidate ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It explicitly states 'Read-only' and describes the return content (notes, emails, stage changes) in chronological order, which are important behavioral traits. It does not cover every possible edge case (e.g., pagination), but for a simple read-only timeline it is sufficiently transparent.

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

Conciseness5/5

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

The description is concise and well-structured: a clear one-line purpose, a read-only declaration, example phrasing, a prerequisite link, and a summary of the return content. Every sentence contributes meaning without redundancy.

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?

For a tool with one parameter and an output schema, the description covers purpose, behavior, usage context, and parameter acquisition. The output schema handles return values, so no further detail is needed. It is complete for an agent to select and invoke correctly.

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?

The schema already provides 100% coverage for candidate_id with 'Greenhouse candidate ID'. The description adds value by pointing to search_candidates_by_name as a way to obtain the candidate_id, which is a useful cross-reference beyond the schema.

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 clearly states the tool 'Get a candidate's activity timeline' with a specific verb and resource, and differentiates from siblings like get_candidate by focusing on timeline events (notes, emails, stage changes). It is specific and unambiguous.

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

Usage Guidelines4/5

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

The description provides clear usage context with example user phrases ('show me Sarah's history') and a prerequisite (use search_candidates_by_name to find candidate_id). However, it does not explicitly mention alternatives or when not to use this tool, so it misses the 'when-not' aspect.

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

get_applicationA

Get a single application by ID. Read-only.

Users rarely know application IDs. To find one: search_candidates_by_name → get_candidate → the applications array has each application's ID and job name. For a complete screening package with resume and location, use screen_candidate.

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYesGreenhouse application ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It explicitly states 'Read-only' (a safety trait) and implies this tool does not provide the complete screening package (resume, location) by directing to screen_candidate. However, it does not mention permissions, error behavior, or other potential side effects, so it falls short of a 5.

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

Conciseness5/5

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

The description is three sentences, each earning its place: purpose, ID discovery workaround, and alternative tool recommendation. It is front-loaded with the main purpose and contains no fluff.

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?

For a simple single-get tool with an output schema, the description is complete. It covers the core action, provides a path to obtain the required ID, and points to a richer alternative. Return value details are handled by the output schema, so no further explanation is needed.

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

Parameters3/5

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

Schema coverage is 100% and the parameter description already states 'Greenhouse application ID'. The description adds little beyond the word 'ID' in 'Get a single application by ID', which is redundant. Baseline 3 is appropriate since the schema does the heavy lifting.

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 clearly states 'Get a single application by ID. Read-only.' which is a specific verb+resource. It also distinguishes itself from sibling tools like list_applications and screen_candidate by emphasizing the single-record nature and pointing to screen_candidate for a broader screening package.

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?

The description gives explicit guidance: it acknowledges users rarely know IDs, provides a discovery workflow (search_candidates_by_name → get_candidate → applications array), and recommends screen_candidate for full screening. This goes beyond mere context and establishes clear when-to-use and when-not-to-use conditions.

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

get_candidateA

Get a candidate's full profile by ID. Read-only.

Returns name, contact info, all applications (with job names and statuses), tags, custom fields, and attachments. This is the central lookup — most workflows route through here after resolving a name via search_candidates_by_name. For a screening package with resume and location, use screen_candidate.

ParametersJSON Schema
NameRequiredDescriptionDefault
candidate_idYesGreenhouse candidate ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'Read-only,' which is a critical safety signal. It also details what is returned (name, contact info, all applications, tags, custom fields, attachments), adding value beyond the schema. It does not mention error/not-found behavior, but for a read-only lookup with a single ID parameter, the coverage is strong.

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

Conciseness5/5

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

The description is three concise sentences front-loaded with purpose, followed by return contents and usage alternatives. Every sentence earns its place, and there is no fluff or repetition of schema details. It is highly scannable and appropriately sized.

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?

The tool is a central lookup with an output schema (context signal indicates true), so the description doesn't need to explain return structure. It covers purpose, read-only nature, key return contents, and relationship to sibling tools. This is complete for an agent to select and invoke the tool correctly.

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

Parameters3/5

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

The input schema already has 100% coverage with a description for candidate_id ('Greenhouse candidate ID'). The description only says 'by ID,' which adds little beyond the schema. No additional semantics about format, requiredness, or constraints are provided, so the baseline 3 is appropriate.

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 and resource: 'Get a candidate's full profile by ID.' It clearly distinguishes itself from siblings by stating it is the 'central lookup' and explicitly names alternatives like search_candidates_by_name and screen_candidate. This leaves no ambiguity about what the tool does.

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?

The description provides explicit usage guidance: it says this is the central lookup after resolving a name via search_candidates_by_name, and directs users to screen_candidate when they need a screening package with resume and location. This offers clear when-to-use and when-not-to-use context, differentiating it from similar candidate-focused tools.

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

get_jobA

Get full details for a job by ID. Read-only.

Returns name, status, departments, offices, hiring team, and custom fields. Use list_jobs to find the job_id by name first. For the public listing, use list_job_posts_for_job. For pipeline stages, use list_job_stages_for_job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesGreenhouse job ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden. It explicitly states 'Read-only' and enumerates the returned fields (name, status, departments, offices, hiring team, custom fields). However, it does not disclose error behavior (e.g., job not found) or any authorization requirements, leaving some transparency gap.

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

Conciseness5/5

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

The description is compact: one purpose sentence, one return-fields sentence, and a structured enumeration of alternative tools. Every sentence earns its place, with no redundancy or filler, and key information is front-loaded.

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?

For a simple get-by-ID tool with one required parameter and an output schema, the description covers the purpose, usage, expected return content, and alternatives. The presence of an output schema obviates the need to describe return types in detail, and nothing essential is missing for the tool's complexity.

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?

The schema provides a terse description 'Greenhouse job ID' (100% coverage), so the baseline is 3. The description adds significant value by instructing 'Use list_jobs to find the job_id by name first,' which tells the agent how to source a valid parameter value beyond what the schema offers. This elevates the score to 4.

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 clearly states the tool's function: 'Get full details for a job by ID' — a specific verb, resource, and scope. It distinguishes from sibling tools by explicitly noting the public listing (list_job_posts_for_job) and pipeline stages (list_job_stages_for_job) as separate concerns, making the purpose unambiguous.

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?

The description provides explicit when-to-use guidance: 'Use list_jobs to find the job_id by name first' and names specific alternatives for other related tasks. It tells the agent exactly when to use this tool versus siblings, satisfying the dimension fully.

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

get_scorecardA

Get a single scorecard by ID. Read-only.

Returns the interviewer's ratings, attribute scores, and overall recommendation. To find scorecard IDs: list_scorecards_for_application.

ParametersJSON Schema
NameRequiredDescriptionDefault
scorecard_idYesScorecard ID — get from list_scorecards or list_scorecards_for_application

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'Read-only' and describes the return content (ratings, attribute scores, recommendation), which adds valuable context about side-effect safety and what the caller can expect. While it doesn't cover error cases or permissions, for a simple read operation this is sufficient.

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

Conciseness5/5

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

The description is three short sentences, front-loaded with the primary purpose, then returning content, and finally a usage tip. Every sentence earns its place with no repetition or filler. It is concise and well-structured.

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?

For a single-parameter read-only tool with an output schema, this description is complete. It states what it does, what it returns, and how to find the required ID. There is no missing context for an agent to invoke it correctly, and the sibling differentiation eliminates ambiguity.

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

Parameters3/5

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

The schema already documents the only parameter with 100% coverage, including the instruction to get the ID from list_scorecards_for_application. The description repeats this guidance but adds minimal new meaning for the parameter itself. Given the high schema coverage, a baseline score of 3 is appropriate.

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 clearly states the tool's purpose: 'Get a single scorecard by ID' with a specific verb and resource. It also differentiates from the sibling list_scorecards_for_application by noting that the latter is for finding IDs. This makes the tool's scope immediately clear.

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?

The description explicitly tells the agent when to use this tool vs the alternative: 'To find scorecard IDs: list_scorecards_for_application.' It also marks the operation as 'Read-only,' giving clear context on safe usage. This is direct, actionable guidance.

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

list_applicationsA

List applications with optional filters. Read-only.

Users say "show me applications for [job name]" or "what came in this week." To filter by job: list_jobs → find by name → use its job_id. To filter by candidate: search_candidates_by_name → candidate_id. For pipeline views grouped by stage, use pipeline_summary. For stale candidates, use stale_applications or candidates_needing_action.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoOpaque cursor from a previous call's `next_cursor`, to fetch the next page. When set, all other filters are ignored — they are already baked into the cursor.
job_idNoFilter to applications on this job
statusNoFilter by status: 'active', 'rejected', or 'hired'
paginateNo'single' for one page, 'all' to auto-fetch every pagesingle
per_pageNoResults per page (max 500)
candidate_idNoFilter to applications for this candidate
created_afterNoISO 8601 datetime — only applications created after this
created_beforeNoISO 8601 datetime — only applications created before this
last_activity_afterNoISO 8601 datetime — only applications with activity after this

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and it explicitly states 'Read-only,' which is the key behavioral trait for safe invocation. It does not discuss pagination or cursor behavior, but those are fully documented in the input schema and no destructive behavior is implied.

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

Conciseness5/5

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

The description is front-loaded with the core purpose and read-only note, then provides compact trigger examples, ID-derivation steps, and sibling routing. Every line earns its place and there is no filler.

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?

For a 9-parameter filterable list tool with an output schema, the description covers purpose, safety, natural-language triggers, parameter derivation, and alternative tools. The remaining details (ISO formats, pagination flags) are already fully documented in the input schema.

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 coverage is 100%, so baseline is 3, and the description adds value by explaining how to obtain the foreign key values: list_jobs to find job_id and search_candidates_by_name to find candidate_id. This is workflow knowledge not present in the schema.

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 uses a specific verb and resource — 'List applications with optional filters' — and immediately marks it read-only. It also distinguishes itself from sibling tools by naming pipeline_summary, stale_applications, and candidates_needing_action as different views.

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?

It gives concrete trigger phrases ('show me applications for [job name]', 'what came in this week') and explicit routing: use list_jobs/search_candidates_by_name to get IDs, use pipeline_summary for stage-grouped views, and use stale_applications/candidates_needing_action for stale candidates. This is clear when-to-use vs alternatives guidance.

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

list_candidatesA

List candidates with optional filters. Read-only.

For finding a specific person, use search_candidates_by_name (by name) or search_candidates_by_email (by email) — faster and simpler. Use this tool for bulk operations: date-range queries, fetching by specific IDs, or paginating through the full database.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNoFilter by exact email address
cursorNoOpaque cursor from a previous call's `next_cursor`, to fetch the next page. When set, all other filters are ignored — they are already baked into the cursor.
paginateNo'single' for one page, 'all' to auto-fetch every pagesingle
per_pageNoResults per page (max 500)
candidate_idsNoFilter to specific candidate IDs
created_afterNoISO 8601 datetime — only candidates created after this
updated_afterNoISO 8601 datetime — only candidates updated after this
created_beforeNoISO 8601 datetime — only candidates created before this
updated_beforeNoISO 8601 datetime — only candidates updated before this

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the safety burden, and it explicitly declares 'Read-only.' It also signals bulk-operation behavior, implying larger result sets. It doesn't cover rate limits or auth, but no side-effect ambiguity remains.

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

Conciseness5/5

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

Three short sentences, front-loaded with core purpose and safety declaration. The use-case guidance is placed immediately after, and every sentence earns its place.

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?

The tool has no required parameters, an output schema, and a clear role among siblings. The description supplies essential selection and safety context, while the schema handles parameter and return details, so nothing critical is missing.

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

Parameters3/5

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

All 9 parameters are already documented in the input schema with 100% coverage, so the baseline applies. The description's references to date-range queries, specific IDs, and pagination map to those parameters without adding new semantic detail beyond what the schema provides.

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?

Description opens with 'List candidates with optional filters' — a specific verb, resource, and filter concept. It then distinguishes itself from search_candidates_by_name and search_candidates_by_email, making the tool's role immediately clear.

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?

Explicitly states when to avoid this tool ('For finding a specific person') and names the faster, simpler alternatives. It also enumerates the intended use cases: date-range queries, fetching by specific IDs, and paginating through the full database.

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

list_jobsA

List all jobs with optional filters. Read-only.

This is the primary tool for resolving job titles to job IDs. When a user mentions a job by name ("Backend Engineer"), use this to find the matching job_id. Filter by status ('open'/'closed'/'draft'), department_id (list_departments), or office_id (list_offices). For pipeline views, use pipeline_summary with the job_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoOpaque cursor from a previous call's `next_cursor`, to fetch the next page. When set, all other filters are ignored — they are already baked into the cursor.
statusNoFilter by status: 'open', 'closed', or 'draft'
paginateNo'single' for one page, 'all' to auto-fetch every pagesingle
per_pageNoResults per page (max 500)
office_idNoFilter to jobs in this office
created_afterNoISO 8601 datetime — only jobs created after this
department_idNoFilter to jobs in this department
created_beforeNoISO 8601 datetime — only jobs created before this

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations supplied, the description carries the safety burden and it does so by explicitly labeling the tool 'Read-only.' It also states the scope ('all jobs with optional filters') and the job-ID-resolution behavior. It does not describe pagination side effects in prose, but the input schema already documents cursor and paginate behavior.

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

Conciseness5/5

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

Four short sentences, front-loaded with the core action and read-only nature, then the use case, filters, and alternative. Every sentence contributes information; no filler.

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?

For an 8-parameter filtered list tool, the description covers what it does, when to use it, how to find job IDs, what filters matter, and which sibling covers pipeline views. Pagination and return-value details live in the schema and output schema, so nothing essential is missing.

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 coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by naming the primary job-title-to-ID use case and pointing to list_departments and list_offices as sources for filter values, plus enumerating the status choices. This is useful parameter guidance not fully present in the schema.

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?

Description opens with a specific verb and resource ('List all jobs') and immediately states a clear retrieval use case: resolving job titles to job IDs. It also points to a sibling alternative (pipeline_summary), so an agent can distinguish this tool from nearby list/detail tools.

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?

The description gives explicit when-to-use guidance: whenever a user mentions a job by name, use list_jobs to find the matching job_id. It also provides a when-not-to-use signal by directing pipeline views to pipeline_summary instead.

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

list_job_stages_for_jobA

List pipeline stages for a specific job in order. Read-only.

This is the primary tool for resolving stage names to stage IDs. When a user says "move to the onsite stage," use this to find the stage_id. To find the job_id first: list_jobs → match by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesGreenhouse job ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It explicitly states 'Read-only', which is a critical safety trait. It also mentions 'in order' implying sorted output. However, it does not describe return format, error cases, or pagination, but for a simple read-only list tool this is adequate.

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

Conciseness5/5

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

The description is three sentences long and front-loads the core purpose before adding usage context. Every sentence earns its place, with no filler or redundant information.

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 low complexity (single parameter, no nested objects) and the presence of an output schema, the description covers all essential aspects: purpose, ordering, read-only nature, and the workflow to resolve stage names to IDs. It is complete for its intended use.

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?

The schema already provides 100% coverage with 'Greenhouse job ID'. The description adds extra value by explaining how to obtain the job_id via 'list_jobs → match by name', enhancing the semantic understanding beyond the schema's bare description.

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 clearly states the verb ('List'), resource ('pipeline stages for a specific job'), and scope ('in order'). It also distinguishes the tool as 'the primary tool for resolving stage names to stage IDs', setting it apart from sibling tools like list_jobs or pipeline_summary.

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?

The description gives explicit when-to-use guidance: 'When a user says "move to the onsite stage," use this to find the stage_id.' It also provides a concrete prerequisite workflow: 'To find the job_id first: list_jobs → match by name.' This clearly instructs the agent on invocation context.

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

list_rejection_reasonsA

List all rejection reasons. Read-only.

Resolves rejection reason names to IDs. When a user says "reject for 'not enough experience'," use this to find the ID, then pass it to reject_application or bulk_reject.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoOpaque cursor from a previous call's `next_cursor`, to fetch the next page. When set, all other filters are ignored — they are already baked into the cursor.
per_pageNoResults per page (max 500)
force_refreshNoBypass cache and fetch fresh data

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the disclosure burden. It explicitly says 'Read-only,' which is a meaningful behavioral guarantee, and adds that it resolves names to IDs. It does not describe caching or pagination behavior, but the input schema already documents force_refresh and cursor semantics, so the added value is solid.

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

Conciseness5/5

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

The description is short, front-loaded with the core purpose and read-only nature, and then gives a concrete usage example. Every sentence adds value; there is no fluff or repetition.

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?

For a simple list/lookup tool with a full output schema and 100% parameter coverage, the description is complete. It defines the tool's job, safety profile, and how it fits into the rejection workflow, which is enough for an agent to select and invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds no extra parameter-level detail, but the schema already thoroughly explains cursor, per_page, and force_refresh, so no significant gap exists.

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?

States a specific action ('List all rejection reasons'), the resource, and a clear purpose ('Resolves rejection reason names to IDs'). This distinguishes it from the sibling list tools and marks it as a lookup/ID-resolution tool rather than a general application or candidate list.

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 an explicit usage scenario: when a user mentions a rejection reason by name, use this tool to find the ID, then pass it to reject_application or bulk_reject. This tells the agent exactly when and how to use the tool in a workflow.

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

list_scorecards_for_applicationA

List scorecards submitted for a specific application. Read-only.

To find application_id: search_candidates_by_name → get_candidate → match the application to the job. Returns each interviewer's ratings and overall recommendation.

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYesGreenhouse application ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description explicitly states 'Read-only' and discloses the return content (interviewer ratings and overall recommendation). This meaningfully conveys the behavioral profile, even though it omits details like error handling or permissions.

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

Conciseness5/5

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

The description is compact: a single purpose sentence, a 'Read-only' label, a lookup hint, and a return summary. It is front-loaded with the main action and every sentence earns its place—no redundant or filler content.

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 simplicity (one parameter, existing output schema), the description is complete: it states the purpose, how to obtain the required ID, and what the response contains. It adequately covers all necessary contextual information for an AI agent to use it effectively.

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 coverage is 100% (application_id described as 'Greenhouse application ID'), so the baseline is 3. The description adds value by explaining how to look up the application_id through a context chain, which goes beyond the schema's type description.

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 clearly states a specific action: 'List scorecards submitted for a specific application.' This uses a clear verb and resource, and the scope ('specific application') distinguishes it from sibling tools like global listing tools or get_scorecard for individual scorecards.

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

Usage Guidelines4/5

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

The description provides concrete guidance on finding the required application_id via a lookup chain (search_candidates_by_name → get_candidate), implying when to use this tool. However, it doesn't explicitly state when not to use it or mention alternatives like get_scorecard.

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

pipeline_metricsA

Conversion rates and stage metrics for a job. Read-only.

Users say "what are our conversion rates for the Backend role?" or "where are we losing candidates?" To find job_id: list_jobs → match by name. Returns per-stage counts, conversion percentages, and time-in-stage metrics.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesGreenhouse job ID — list_jobs → match by name

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description states 'Read-only' explicitly, which is a key safety trait, and describes the return content (per-stage counts, conversion percentages, time-in-stage metrics). This adds valuable behavioral context beyond the tool name, though it does not cover error behavior or auth requirements.

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

Conciseness5/5

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

The description is four sentences, each earning its place: purpose, read-only status, example queries, and return details. It is front-loaded and free of fluff.

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

Completeness4/5

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

Given a simple one-parameter tool with an output schema, the description provides sufficient context: purpose, usage examples, prerequisite, and return metrics. It does not over-explain or omit critical operational details, though it could mention potential limitations (e.g., only for active jobs) but that is not necessary.

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

Parameters3/5

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

Schema coverage is 100% (job_id has a description). The tool description repeats the 'list_jobs → match by name' guidance already present in the schema, adding no new parameter-level semantics. Baseline of 3 is appropriate because the schema handles the parameter meaning.

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 clearly states it provides 'Conversion rates and stage metrics for a job' and specifies 'Returns per-stage counts, conversion percentages, and time-in-stage metrics.' It uses a specific resource (pipeline metrics) and is distinct from sibling tools like time_to_hire or source_effectiveness.

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

Usage Guidelines4/5

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

It gives concrete example user queries ('what are our conversion rates for the Backend role?' or 'where are we losing candidates?') and explicit prerequisite instructions ('To find job_id: list_jobs → match by name'). It does not mention alternative tools or exclusions, but the usage context is clear.

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

pipeline_summaryA

Complete pipeline view for a job — candidates grouped by stage. Read-only.

Users say "show me the pipeline for Backend Engineer" or "how many candidates are in each stage." To find the job_id: list_jobs → match by name. Returns stages with candidate counts, names, days-in-stage, and last activity. One call replaces 5-10 sequential API calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesGreenhouse job ID — list_jobs → match by name

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden. It explicitly states 'Read-only,' which is a key behavioral trait. It also discloses what data is returned (stages with candidate counts, names, days-in-stage, last activity). It doesn't mention rate limits or authorization requirements, but for a read-only aggregation tool, this is a reasonable level of transparency.

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

Conciseness5/5

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

The description is compact and well-organized. It starts with the core purpose, includes user-facing examples, provides a prerequisite step, outlines the return content, and ends with efficiency value. Every sentence adds meaningful information—no filler. It is front-loaded and easy to scan.

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 simplicity (one parameter, read-only, output schema present), the description is fully complete. It covers what the tool does, when to use it, how to get the required ID, what it returns, and why it's beneficial. The agent has all necessary context to select and invoke it correctly.

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?

The only parameter, job_id, already has a description in the schema ('Greenhouse job ID — list_jobs → match by name'), and the description reinforces this with a concrete workflow. Since schema coverage is 100%, the baseline is 3, but the additional context about how to obtain the job_id adds value, justifying a 4.

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

Purpose4/5

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

The description clearly states the tool's function: 'Complete pipeline view for a job — candidates grouped by stage.' It also provides user examples ('show me the pipeline for Backend Engineer') and conveys the resource (job pipeline). While it doesn't explicitly differentiate from siblings like pipeline_metrics, the 'Complete' framing and focus on stage grouping set it apart to some degree.

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

Usage Guidelines4/5

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

The description gives clear usage context with example queries ('how many candidates are in each stage') and a prerequisite workflow ('To find the job_id: list_jobs → match by name'). It also highlights a value proposition ('One call replaces 5-10 sequential API calls'). However, it does not explicitly mention alternatives or exclusions, so it stops short of full guidelines.

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

read_candidate_resumeA

Download and return a candidate's most recent resume text. Read-only.

Users say "pull up Sarah's resume" or "show me John's CV." To find candidate_id: search_candidates_by_name. Returns extracted text from the most recent resume attachment. For batch reading, use batch_read_resumes.

ParametersJSON Schema
NameRequiredDescriptionDefault
candidate_idYesGreenhouse candidate ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Since annotations are absent, the description carries the full burden. It discloses the tool is read-only and returns extracted text from the most recent resume attachment, which is valuable. However, it does not mention edge cases like missing resumes or rate limits, leaving a small gap.

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

Conciseness5/5

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

Three sentences, no filler. The main action is front-loaded, and each subsequent sentence adds distinct value: user intents, lookup method, and batch alternative.

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?

For a simple single-parameter read tool with an output schema, the description covers purpose, usage guidelines, and safety without redundant return-value explanation. It is complete for an agent to select and invoke correctly.

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?

The schema already fully describes candidate_id, and the description adds extra context by explaining how to obtain the ID via search_candidates_by_name. This enriches the parameter's meaning beyond the schema baseline.

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 clearly states the tool downloads and returns a candidate's most recent resume text. The verb 'Download and return' plus the specific resource 'resume text' makes the purpose unambiguous and distinguishes it from siblings like get_candidate or download_attachment.

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?

Explicitly instructs how to find candidate_id via search_candidates_by_name and directs batch usage to batch_read_resumes. This provides concrete when-to-use and alternative guidance.

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

reject_applicationA

Reject a candidate from a job. Write operation.

Users say "reject Sarah from the Backend role." To get the application_id: search_candidates_by_name → get_candidate → match the application to the job. For rejection_reason_id: list_rejection_reasons → match by name. For email templates: list_email_templates. Can be reversed with unreject_application. For bulk rejections, use bulk_reject.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoInternal rejection notes (not sent to candidate)
application_idYesGreenhouse application ID
rejection_emailNoOptional email to candidate: {email_template_id, send_email_at (ISO 8601)}
rejection_reason_idNoReason ID — get from list_rejection_reasons

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the burden of disclosure. It clearly states 'Write operation' and notes reversibility via unreject_application, but does not detail side effects like email sending or permission requirements.

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

Conciseness5/5

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

The description is compact and front-loaded: first line states purpose, then provides concrete usage context. Every sentence earns its place with no repetition or filler.

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

Completeness4/5

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

Given the tool's moderate complexity and presence of an output schema, the description covers the main workflow, reversibility, and alternatives. It could have mentioned prerequisites like stage constraints, but the current coverage is strong.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds real value by explaining how to source parameters (application_id via search_candidates_by_name → get_candidate, rejection_reason_id via list_rejection_reasons, email template via list_email_templates), going well beyond the baseline.

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 uses a specific verb (reject) and resource (candidate from a job), and explicitly labels it as a write operation. It also distinguishes itself from related tools like unreject_application and bulk_reject.

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 explicit when-to-use guidance, including a detailed workflow to obtain application_id and rejection_reason_id, and names alternatives (unreject_application for reversal, bulk_reject for bulk operations).

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

scan_pipeline_resumesA

Search resume text in pipelines for skills and qualifications. Read-only.

Users say "find Rust engineers in our pipelines" or "search for distributed systems experience." The primary sourcing tool — ~90% of candidate data lives in resumes. Pass job_ids (list_jobs → get IDs for similar roles). Supports boolean search: keywords (OR), required_keywords (AND), exclude_keywords (NOT with word-boundary matching).

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idsYesJob IDs to search — list_jobs → get IDs for similar roles
keywordsNoOR keywords — each hit boosts ranking
statusesNoFilter by status: 'active', 'rejected', 'hired'
max_resumesNoMaximum resumes to scan
exclude_keywordsNoNOT keywords — any match disqualifies (word-boundary matching)
required_keywordsNoAND keywords — ALL must appear or candidate is skipped

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

The description discloses 'Read-only' (since no annotations are provided) and details the boolean search behavior: keywords (OR), required_keywords (AND), exclude_keywords (NOT with word-boundary matching). This goes beyond the schema and gives the agent a clear picture of side effects and matching rules.

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 well-structured: a clear purpose statement, a user-facing example, tool positioning, a prerequisite instruction, and a semantic explanation. It is compact with no unnecessary words, though it is slightly dense in one paragraph.

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

Completeness4/5

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

Given the output schema documents return values, the description covers the essential usage guidance, search logic, source scope (resumes in pipelines), and readonly nature. It does not cover all edge cases, but it is sufficiently complete for effective selection and invocation.

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 coverage is 100%, so the baseline is 3. The description adds value by explaining the semantic of OR/AND/NOT for the keyword parameters and the word-boundary matching nuance for exclude_keywords, which is not evident from the schema alone.

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 explicitly states the action ('Search resume text in pipelines for skills and qualifications') and provides example user queries ('find Rust engineers'). It distinguishes itself from siblings by positioning as 'the primary sourcing tool' with boolean search capabilities, making its purpose unmistakable.

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

Usage Guidelines4/5

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

It gives clear usage context: 'The primary sourcing tool — ~90% of candidate data lives in resumes' and instructs to 'Pass job_ids (list_jobs → get IDs for similar roles)'. It does not explicitly name alternatives, but the positioning makes it clear this is the go-to tool for resume search.

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

screen_candidateA

Full screening package for one candidate application. Read-only.

Users say "screen Sarah for the Backend role" or "give me the full picture." To get application_id: search_candidates_by_name → get_candidate → match the application to the job name. Returns profile, resume text, location, screening answers, job description, and application history in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYesApplication ID — search_candidates_by_name → get_candidate → match app

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description explicitly marks the operation as read-only, which is a key safety trait. It also discloses that the tool aggregates and returns multiple data types (profile, resume, answers, etc.) in a single call, setting expectations for response breadth. No contradictions with annotations since none exist; however, it omits edge-case behaviors like error handling or permission requirements.

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

Conciseness5/5

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

Three sentences with clear front-loading: the core function first, followed by usage scenarios and parameter acquisition, then return contents. Every sentence adds value; no redundancy or filler.

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?

For a single-parameter tool with an output schema (though not displayed), the description thoroughly specifies the return value composition. The provided workflow for obtaining application_id ensures the agent can correctly invoke the tool even without prior context. Given the tool's complexity, the description covers the essential context.

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?

The schema already covers application_id at 100%, but the description adds crucial guidance on how to obtain the ID via a specific tool chain (search_candidates_by_name → get_candidate → match). This goes beyond the schema's bare description and helps agents understand the semantic provenance of the parameter.

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?

Clearly states it is a 'full screening package' for one candidate application, with a specific verb and resource. Distinguishes itself from sibling tools like get_candidate or read_candidate_resume by emphasizing the aggregated, one-call nature. The read-only qualifier adds clarity.

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?

Directly addresses when to use it via example user intents ('screen Sarah...' or 'give me the full picture'). Provides a step-by-step alternative workflow to obtain application_id, implicitly guiding when this tool is the right choice versus using smaller sibling tools. Explicitly mentions the integration steps leading up to invocation.

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

search_candidates_by_emailA

Look up a candidate by exact email address. Read-only.

Use when the user provides an email instead of a name. Returns the candidate record directly. For name-based lookup, use search_candidates_by_name.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesExact email address to search for

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description discloses the read-only nature and states it 'Returns the candidate record directly'. It does not cover edge cases like no matches, but the core behaviors are transparent beyond the annotation absence.

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

Conciseness5/5

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

Three concise sentences, front-loaded with the main action, and no extraneous detail. Every sentence adds value.

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 simplicity (one required parameter), the presence of an output schema, and the explicit usage alternative, the description is complete for an agent to select and invoke correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the parameter description already provides meaning. The description reinforces the 'exact' nature of the email but does not add significant new semantics beyond the schema.

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 clearly states 'Look up a candidate by exact email address' with a specific verb and resource, and explicitly distinguishes itself from the sibling tool 'search_candidates_by_name' by targeting email-based lookup.

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?

It explicitly states when to use this tool ('Use when the user provides an email instead of a name') and names the alternative for name-based lookup, providing clear contextual guidance.

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

search_candidates_by_nameA

Find candidates by name. Read-only — the starting point for most workflows.

Users always refer to candidates by name, not ID. Use this first whenever a user mentions a candidate, then get_candidate on the match to see their full profile and application IDs. Case-insensitive substring match — "Sarah" finds "Sarah Chen", "Sarah O'Brien", etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName to search — matches first or last name (case-insensitive substring)
per_pageNoResults per page (max 500)
max_pagesNoMaximum pages to fetch when auto-paginating

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

No annotations are provided, so the description carries full responsibility. It explicitly declares 'Read-only,' which is a safety-relevant behavior not available elsewhere. It also discloses that matching is case-insensitive and substring-based, with concrete examples, and notes that users refer by name rather than ID—all beyond the structured schema.

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

Conciseness5/5

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

Three sentences, front-loaded with purpose, then workflow, then an illustrative example. Every sentence earns its place without redundancy, making it concise yet highly informative.

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 simplicity of the tool, a fully documented schema (100% coverage), and the presence of an output schema, the description covers purpose, usage, and behavior completely. Pagination is not discussed, but the schema documents per_page and max_pages, so no critical gap exists.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description's example ('Sarah') reinforces the schema's 'case-insensitive substring' but adds no new parameter-specific information beyond what the schema already states. Per_page and max_pages are not mentioned in the description, but their schema descriptions are clear.

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 'Find candidates by name,' which is a specific verb plus resource. It further positions itself as 'the starting point for most workflows,' distinguishing it from other search tools by name-based scope. The matching behavior (case-insensitive substring) is also clarified, leaving no ambiguity about what the tool does.

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?

The description explicitly states 'Use this first whenever a user mentions a candidate, then get_candidate on the match to see their full profile and application IDs.' This provides a clear workflow and when-to-use instruction relative to get_candidate. It also implies the alternative (email search) by noting users refer to candidates by name, not ID.

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

search_pipeline_candidatesA

Search pipelines by structured fields — title, company, education, tags. Read-only.

Users say "find VP-level candidates in our pipelines" or "who do we have from Google?" Pass job_ids (list_jobs → get IDs for similar roles). Best when structured data is populated. If few results, switch to scan_pipeline_resumes for resume-text search. Combine with batch_read_resumes to verify skill matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoTag names to filter by
job_idsYesJob IDs to search — list_jobs → get IDs for similar roles
statusesNoFilter by status: 'active', 'rejected', 'hired'
max_resultsNoMaximum candidates to return
title_keywordsNoJob title keywords — e.g. ['VP', 'Director']
company_keywordsNoCompany name keywords — e.g. ['Google', 'Stripe']
education_keywordsNoEducation keywords — e.g. ['Stanford', 'MIT']
min_experience_yearsNoMinimum years of work experience

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It explicitly states 'Read-only,' clarifying that no mutations occur. It also discloses the limitation that results depend on populated structured data. Missing finer behavioral details like rate limits or pagination, but the core safety profile is transparent.

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

Conciseness5/5

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

The description is concise and front-loaded with the core purpose. The subsequent sentences provide examples, usage instructions, and alternative recommendations—all in a tight paragraph. Every sentence earns its place.

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 (8 parameters, output schema present), the description provides sufficient context: what it does, when to use it, when to switch to alternatives, and how to prepare inputs. It does not need to explain return values because an output schema exists.

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

Parameters3/5

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

Schema description coverage is 100%, with each parameter having a clear description including examples (e.g., title_keywords '['VP', 'Director']'). The tool description adds contextual examples but does not explain parameter interactions beyond the schema. Thus it meets the baseline for high schema coverage without adding substantial parameter-level insight.

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 clearly states the tool's function: 'Search pipelines by structured fields — title, company, education, tags' and explicitly labels it 'Read-only.' It distinguishes itself from the sibling tool scan_pipeline_resumes by positioning this as structured-field search.

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 explicit usage context with natural-language examples ('find VP-level candidates', 'who do we have from Google?'), instructs to pass job_ids obtained via list_jobs, and names an alternative (scan_pipeline_resumes) for when this tool underperforms. Also suggests combining with batch_read_resumes for verification.

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

source_effectivenessA

Which candidate sources produce the best results. Read-only.

Users say "which sources are working?" or "where should we spend recruiting budget?" Pass job_id (list_jobs → match by name) for one role, or omit for org-wide analysis. Returns volume, active rate, and hire rate per source.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idNoFilter to one job — list_jobs → match by name
created_afterNoISO 8601 date — only applications created after this

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It explicitly declares 'Read-only', which is a key behavioral safety disclosure, and explains behavior around job_id filtering and returning metrics. It does not cover pagination or permission details, but is transparent about its main safety profile and output.

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

Conciseness5/5

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

Three short sentences front-loaded with the core purpose, followed by usage triggers and parameter guidance. Every sentence earns its place with no filler or redundancy.

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?

With an output schema present, the description does not need to explain return values, but it still does. It covers what the tool does, when to use it, and how to parameterize it. Low parameter count and simple nullable inputs mean the context is complete.

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

Parameters3/5

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

The input schema has 100% description coverage, so the baseline is 3. The description adds context for job_id (omit for org-wide analysis, list_jobs→match by name) beyond the schema, but does not mention created_after, which the schema already describes as ISO 8601. Overall, the description adds modest value on top of the schema.

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 clearly states the tool analyzes candidate sources by effectiveness, with explicit output metrics (volume, active rate, hire rate per source). This distinguishes it from sibling analytics tools like pipeline_metrics or time_to_hire, which focus on other aspects of the recruitment pipeline.

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

Usage Guidelines4/5

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

The description provides explicit trigger phrases ('which sources are working?', 'where should we spend recruiting budget?') and explains when to pass job_id vs omit for org-wide analysis. However, it does not name alternatives or provide exclusion criteria, so it falls short of a 5.

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

stale_applicationsA

Applications with no activity for N days, sorted by stalest. Read-only.

Users say "who's been sitting untouched?" Use the results with bulk_reject for pipeline cleanup. Pass job_id (list_jobs → match by name) to filter to one job.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoMinimum days without activity
limitNoMax applications to return
job_idNoFilter to one job — list_jobs → match by name

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

No annotations are present, so the description carries the full burden. It explicitly states 'Read-only' and discloses sorting by stalest. However, it does not mention pagination behavior, rate limits, or auth requirements. For a read-only listing tool, the essential safety and ordering behavior is covered, but other traits are left to the output schema.

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

Conciseness5/5

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

The description is three crisp sentences: first states purpose and read-only nature, second gives a user scenario and workflow, third explains job filtering. Every sentence earns its place; there is no redundancy or filler, making it highly effective and scannable.

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

Completeness4/5

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

For a simple listing tool with an output schema and fully documented parameters, the description covers purpose, read-only nature, sort order, a concrete use case, and a filtering instruction. It does not explicitly state that omitting job_id returns applications across all jobs, but that is inferable. This is complete enough to enable correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description reinforces job_id semantics by referencing 'list_jobs → match by name', but this repeats what the schema already says. It adds no new parameter-level meaning for days or limit, so it provides marginal value beyond the schema.

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 uses a specific verb+resource combination: 'Applications with no activity for N days, sorted by stalest' clearly states the tool lists stale applications and defines the criterion. It distinguishes from siblings like list_applications by the inactivity filter and sorting behavior, making the purpose unambiguous.

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

Usage Guidelines4/5

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

The description provides explicit usage context: 'Users say "who's been sitting untouched?"' and recommends pairing with bulk_reject for pipeline cleanup. It also instructs how to filter by job via 'list_jobs → match by name'. It lacks explicit exclusions (e.g., 'use list_applications for unfiltered views') but gives sufficient, actionable scenarios.

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

time_to_hireA

Time-to-hire metrics for hired candidates. Read-only.

Users say "how long does it take to hire?" or "what's our average days-to-offer?" Pass job_id (list_jobs → match by name) for one role, or omit for org-wide metrics. Returns average, median, min, max days.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idNoFilter to one job — list_jobs → match by name
created_afterNoISO 8601 date — limit analysis window

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description takes on the full burden of behavioral disclosure. It clearly states 'Read-only' upfront, signaling a safe read operation. It also describes the return values (average, median, min, max days) and the scope (hired candidates). While it doesn't mention rate limits or data freshness, the read-only nature is sufficiently transparent.

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

Conciseness5/5

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

The description is four lines, front-loaded with purpose, and every sentence earns its place: purpose, read-only flag, example queries, parameter guidance, and output summary. No redundancy or fluff.

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?

For a read-only metrics tool with two optional parameters, the description covers all essential aspects: what it does, how to filter, what it returns, and safety. With an output schema present and a clear description, the agent has everything needed to select and invoke the tool correctly.

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 coverage is 100% with both parameters described. The description adds value by explaining that omitting job_id yields org-wide metrics, which is not present in the schema's 'default null'. This extra context helps the agent understand the filter vs. global behavior beyond the schema.

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 clearly states the tool provides 'Time-to-hire metrics for hired candidates', which is a specific verb+resource combination. It distinguishes itself from siblings like pipeline_metrics by focusing on hired candidates and days-to-offer. Including example user queries ('how long does it take to hire?') further clarifies its purpose.

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?

The description explicitly tells users when to use the tool via natural language examples ('Users say "how long does it take to hire?"'). It also provides clear scoping instructions: pass job_id for one role, omit for org-wide metrics, and cross-references list_jobs for ID lookup. This is actionable guidance with no ambiguity.

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

unreject_applicationA

Reverse a rejection, returning the candidate to active status. Write operation.

Users say "undo the rejection for Sarah" or "bring Sarah back." To get the application_id: search_candidates_by_name → get_candidate → find the rejected application in their applications array.

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYesGreenhouse application ID of a rejected application

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description must disclose behavior; it explicitly labels the operation as a 'Write operation,' which is critical for an agent to know. It also states the resulting state change ('returning the candidate to active status'), but doesn't address permissions, idempotency, or side effects beyond that.

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

Conciseness5/5

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

The description is brief and front-loaded, with the purpose in the first sentence. The additional examples and workflow are purposeful and directly support usage, with no wasted words.

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

Completeness4/5

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

For a single-parameter write operation with an output schema, the description covers the core purpose, the write nature, and the parameter acquisition workflow. It's sufficiently complete for an agent to understand and invoke, though it doesn't cover edge cases like calling on an active application.

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?

The schema already describes application_id as a Greenhouse application ID, but the description enriches this by showing how to find it via search_candidates_by_name → get_candidate and how to map natural language to the parameter. This adds meaningful guidance beyond the schema.

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 'Reverse a rejection, returning the candidate to active status,' which clearly states the action and its effect. It distinguishes from the sibling reject_application by being the inverse operation, and gives concrete user phrasings.

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

Usage Guidelines4/5

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

It provides explicit examples of user intents ('undo the rejection for Sarah' or 'bring Sarah back') that trigger this tool. It also specifies a workflow to obtain the required application_id, setting clear context for when to call this tool, though it doesn't explicitly mention exclusions or alternatives.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.6.0
    • Changedlist_applications2 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Opaque cursor from a previous call's `next_cursor`, to fetch the next page. When set, all other filters are ignored — they are already baked into the cursor.",
        +  "title": "Cursor"
        +}
      • removedInput schema / properties / page
        Removed value: -{
        -  "default": 1,
        -  "description": "Page number (starts at 1)",
        -  "title": "Page",
        -  "type": "integer"
        -}
    • Changedlist_candidates2 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Opaque cursor from a previous call's `next_cursor`, to fetch the next page. When set, all other filters are ignored — they are already baked into the cursor.",
        +  "title": "Cursor"
        +}
      • removedInput schema / properties / page
        Removed value: -{
        -  "default": 1,
        -  "description": "Page number (starts at 1)",
        -  "title": "Page",
        -  "type": "integer"
        -}
    • Changedlist_jobs2 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Opaque cursor from a previous call's `next_cursor`, to fetch the next page. When set, all other filters are ignored — they are already baked into the cursor.",
        +  "title": "Cursor"
        +}
      • removedInput schema / properties / page
        Removed value: -{
        -  "default": 1,
        -  "description": "Page number (starts at 1)",
        -  "title": "Page",
        -  "type": "integer"
        -}
    • Changedlist_rejection_reasons2 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Opaque cursor from a previous call's `next_cursor`, to fetch the next page. When set, all other filters are ignored — they are already baked into the cursor.",
        +  "title": "Cursor"
        +}
      • removedInput schema / properties / page
        Removed value: -{
        -  "default": 1,
        -  "description": "Page number (starts at 1)",
        -  "title": "Page",
        -  "type": "integer"
        -}
  2. 33 tool updatesv0.5.0
    • First observedadd_note_to_candidate
    • First observedadd_tag_to_candidate
    • First observedadvance_application
    • First observedbulk_advance
    • First observedbulk_reject
    • First observedbulk_tag
    • First observedcandidates_needing_action
    • First observeddownload_attachment
    • First observedfetch_new_applications
    • First observedget_activity_feed
    • First observedget_application
    • First observedget_candidate
    • First observedget_job
    • First observedget_scorecard
    • First observedlist_applications
    • First observedlist_candidates
    • First observedlist_job_stages_for_job
    • First observedlist_jobs
    • First observedlist_rejection_reasons
    • First observedlist_scorecards_for_application
    • First observedpipeline_metrics
    • First observedpipeline_summary
    • First observedread_candidate_resume
    • First observedreject_application
    • First observedscan_pipeline_resumes
    • First observedscreen_candidate
    • First observedsearch_candidates_by_email
    • First observedsearch_candidates_by_name
    • First observedsearch_pipeline_candidates
    • First observedsource_effectiveness
    • First observedstale_applications
    • First observedtime_to_hire
    • First observedunreject_application

TDQS

A3.9/5.0

Scored across 33 tools

Disambiguation4/5

Most tools target distinct resources and actions, and descriptions include routing hints that clarify when to use each one. Some overlap exists among application-listing tools (list_applications, fetch_new_applications, stale_applications, pipeline_summary) and resume-search tools, but the intended boundaries are mostly clear.

Naming Consistency4/5

The majority of tools follow a snake_case verb_noun pattern like list_jobs, get_candidate, and reject_application. A few analytic tools break the pattern (pipeline_summary, source_effectiveness, time_to_hire, candidates_needing_action), and there is some verb variation across list/fetch/search/read, but the overall convention is predictable.

Tool Count2/5

33 tools is a heavy surface for an MCP server, exceeding the 25+ threshold where the set becomes difficult for an agent to navigate. While the ATS domain is broad, several tools overlap in capability and could be consolidated or omitted.

Completeness2/5

There are significant gaps, including referenced tools that do not exist in the set: list_tags, list_email_templates, and move_application_same_job are mentioned in descriptions but unavailable. There are also no create/update operations for candidates or jobs, and add_tag_to_candidate depends on a missing tag-listing tool, which will cause agent failures.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A server implementation that enables interaction with Greenhouse's recruitment and applicant tracking system through Model Context Protocol, providing tools for job listings, candidate management, application filtering, and stage transitions.
    1
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    This project builds a read-only MCP server. For full read, write, update, delete, and action capabilities and a simplified setup, check out our free CData MCP Server for Greenhouse (beta): https://www.cdata.com/download/download.aspx?sku=PGZK-V&type=beta
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Production-ready MCP server for Greenhouse ATS with 175 tools for recruiting teams — manage candidates, applications, jobs, interviews, and hiring pipelines. Role-based profiles (full/recruiter/read-only), composite workflow tools for pipeline views, analytics, candidate search, and bulk operations.
    100
    5
    MIT