open-greenhouse-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GREENHOUSE_API_KEY | No | Harvest API key | |
| GREENHOUSE_LOG_FILE | No | Log file path (defaults to stderr) | |
| GREENHOUSE_LOG_LEVEL | No | debug, info, warning (default), error | warning |
| GREENHOUSE_READ_ONLY | No | Set true to enable read-only mode (shorthand for profile read-only) | |
| GREENHOUSE_BOARD_TOKEN | No | Job board URL slug | |
| GREENHOUSE_DIAGNOSTICS | No | Set off to disable the diagnostics file | |
| GREENHOUSE_ON_BEHALF_OF | No | Greenhouse user ID for write audit trail | |
| GREENHOUSE_TOOL_PROFILE | No | recruiter (default), read-only, or full | recruiter |
| GREENHOUSE_DIAGNOSTICS_FILE | No | Diagnostics file path (defaults beside Claude's logs) | |
| GREENHOUSE_MAX_RESULT_BYTES | No | Tool-result size budget in bytes (default 60000) | 60000 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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). |
| 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. |
| 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. |
| 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. |
| 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). |
| 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Comradery64/open-greenhouse-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server