Skip to main content
Glama
osherai

Bullhorn CRM MCP Server

by osherai

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
BULLHORN_AUTH_URLNoAuth URLhttps://auth.bullhornstaffing.com
BULLHORN_PASSWORDYesAPI Password
BULLHORN_USERNAMEYesAPI Username
BULLHORN_CLIENT_IDYesOAuth 2.0 Client ID
BULLHORN_LOGIN_URLNoLogin URLhttps://rest.bullhornstaffing.com
BULLHORN_CLIENT_SECRETYesOAuth 2.0 Client Secret

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_jobsA

List and filter job orders from Bullhorn CRM.

Args: query: Lucene search query (e.g., "title:Engineer AND isOpen:1") status: Filter by job status limit: Maximum number of results (1-500, default 20) fields: Comma-separated fields to return

Returns: JSON array of job orders

Examples: - list_jobs() - Get recent jobs - list_jobs(query="isOpen:1") - Get open jobs - list_jobs(query="title:Software AND employmentType:Direct Hire", limit=10) - list_jobs(status="Accepting Candidates")

list_candidatesA

List and filter candidates from Bullhorn CRM.

Args: query: Lucene search query (e.g., "lastName:Smith" or "skillSet:Python") status: Filter by candidate status limit: Maximum number of results (1-500, default 20) fields: Comma-separated fields to return

Returns: JSON array of candidates

Examples: - list_candidates() - Get recent candidates - list_candidates(query="skillSet:Python") - Find Python developers - list_candidates(query="lastName:Smith AND status:Active") - list_candidates(status="Active", limit=50)

get_jobA

Get details for a specific job order by ID.

Args: job_id: The JobOrder ID fields: Comma-separated fields to return (default: all common fields)

Returns: JSON object with job details

get_candidateA

Get details for a specific candidate by ID.

Args: candidate_id: The Candidate ID fields: Comma-separated fields to return (default: all common fields)

Returns: JSON object with candidate details

search_entitiesA

Search any Bullhorn entity type using Lucene query syntax.

Args: entity: Entity type (JobOrder, Candidate, Placement, ClientCorporation, ClientContact, etc.) query: Lucene search query limit: Maximum number of results (1-500, default 20) fields: Comma-separated fields to return

Returns: JSON array of matching entities

Examples: - search_entities(entity="Placement", query="status:Approved") - search_entities(entity="ClientCorporation", query="name:Acme*") - search_entities(entity="JobSubmission", query="jobOrder.id:12345")

query_entitiesA

Query Bullhorn entities using SQL-like WHERE syntax.

Args: entity: Entity type (JobOrder, Candidate, etc.) where: WHERE clause (e.g., "salary > 100000 AND status='Active'") limit: Maximum number of results (1-500, default 20) fields: Comma-separated fields to return order_by: Sort order (e.g., "-dateAdded" for newest first)

Returns: JSON array of matching entities

Examples: - query_entities(entity="JobOrder", where="salary > 100000") - query_entities(entity="Candidate", where="status='Active'", order_by="-dateAdded")

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4/5.0

Scored across 6 tools

Disambiguation3/5

Tool purposes are mostly distinct, but list_candidates/list_jobs overlap with search_entities since search_entities can also query candidates/jobs with Lucene syntax, creating potential confusion for an agent.

Naming Consistency4/5

Names follow a verb_noun pattern (get_, list_, query_, search_), but verbs are not uniform (get vs list, query vs search). This is a minor inconsistency.

Tool Count5/5

Six tools is appropriate for a read-only CRM data access layer. Each tool has a clear purpose without unnecessary bloat.

Completeness2/5

The server covers only read operations (get, list, query, search) and provides no create, update, or delete tools. For a CRM server, this is a significant gap that will limit agent workflows.

Maintenance

ActivityInactive
ResponsivenessUnresponsive