Skip to content

Connect BambooHR to Claude: Streamline Hiring & Applicant Tracking

Learn how to connect Claude to BambooHR using a managed MCP server. Automate employee onboarding, applicant tracking, and HR workflows via natural language.

Uday Gajavalli Uday Gajavalli · · 8 min read
Connect BambooHR to Claude: Streamline Hiring & Applicant Tracking

If you want to give Claude read and write access to your BambooHR directory, applicant tracking system, and employee benefits data, you need a Model Context Protocol (MCP) server. There is no out-of-the-box native Claude connector for this specific cross-platform orchestration. You either build a custom translation layer that converts natural language into BambooHR REST API requests, or you use a managed MCP server. I will show you exactly how to generate a managed MCP server for BambooHR using Truto and connect it to Claude in under ten minutes.

If your team uses ChatGPT, check out our guide on connecting BambooHR to ChatGPT, or if you are building autonomous backend systems, read our guide on connecting BambooHR to AI Agents.

The Engineering Reality of Custom BambooHR Connectors

A custom MCP server is a self-hosted integration layer that translates an LLM's JSON-RPC tool calls into structured HTTP requests.

Anthropic's open standard provides a predictable way for models to discover tools. Implementing it against vendor APIs is entirely different. If you decide to build a custom MCP server for BambooHR, you are responsible for the entire API lifecycle. BambooHR has specific architectural quirks that make building a custom connector uniquely frustrating:

  • Custom Reports over Standard Pagination: BambooHR does not provide a standard paginated endpoint to pull a complete employee directory with all metadata, similar to the pagination challenges we've seen when connecting Ashby to Claude. You often have to construct XML-based custom reports to fetch specific fields en masse. Building an MCP tool that knows how to dynamically construct this XML payload based on an LLM's natural language request is exceptionally difficult.
  • Field Aliasing: The API heavily relies on internal field aliases rather than predictable JSON keys, requiring constant schema mapping.
  • Rate Limits and 429s: BambooHR enforces strict rate limits. When building an agentic loop, the LLM will frequently hit these limits when trying to pull large datasets, a common issue we've also noted when connecting Anthropic to Claude. Truto does not retry, throttle, or apply backoff on rate limit errors. When BambooHR returns an HTTP 429, Truto passes that error directly to the caller. Truto normalizes upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller is responsible for retry and backoff logic.

Instead of writing boilerplate to handle these quirks, you can use Truto to generate a managed MCP server dynamically.

graph TD
A[Claude Desktop / Client] -->|JSON-RPC 2.0 via HTTPS| B[Truto Managed MCP Server]
B -->|Dynamic Tool Generation| C[Truto Proxy API Layer]
C -->|Normalized REST Requests| D[BambooHR API]
D -->|Raw XML / JSON| C
C -->|Standardized JSON Schema| B
B -->|Tool Result| A

How to Generate a Managed MCP Server for BambooHR

Truto creates MCP servers dynamically based on the underlying API documentation. The tools are never cached or pre-built. They are generated in real-time when the client connects. You can create the server via the UI or programmatically via the API.

Method 1: Via the Truto UI

This is the fastest path for internal tools and testing.

  1. Log in to your Truto dashboard and navigate to the Integrated Accounts page.
  2. Select your connected BambooHR account.
  3. Click the MCP Servers tab.
  4. Click Create MCP Server.
  5. Select your desired configuration. You can filter tools by methods (e.g., read-only) or by tags (e.g., only HRIS tools).
  6. Click Save and copy the generated MCP server URL.

Method 2: Via the Truto API

For production use cases where you are provisioning agents programmatically, you should generate the MCP server via the REST API.

Execute a POST request to /integrated-account/:id/mcp with your desired configuration:

curl -X POST https://api.truto.one/integrated-account/<BAMBOOHR_ACCOUNT_ID>/mcp \
  -H "Authorization: Bearer <YOUR_TRUTO_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Claude BambooHR Onboarding Agent",
    "config": {
      "methods": ["read", "write"],
      "tags": ["hris", "ats"]
    },
    "expires_at": "2025-12-31T23:59:59Z"
  }'

The API returns a secure token URL. This URL contains a cryptographic hash that authenticates the request and scopes it strictly to the specific BambooHR account and toolset you defined.

How to Connect the MCP Server to Claude

Once you have your Truto MCP server URL, you need to expose it to Claude.

Method 1: Via the Claude Desktop UI

If you are using Claude Desktop for local agentic workflows:

  1. Open Claude Desktop and navigate to Settings.
  2. Click on Integrations (or Developer Settings depending on your version).
  3. Click Add MCP Server.
  4. Paste the Truto MCP URL you copied earlier.
  5. Click Add. Claude will immediately handshake with the server, request the tools/list, and populate its context window with the available BambooHR operations.

Method 2: Via Manual Configuration File

For headless setups or advanced Claude Desktop configurations, you can edit the claude_desktop_config.json file directly to run a Server-Sent Events (SSE) client.

Add the following configuration to your file:

{
  "mcpServers": {
    "bamboohr_truto": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "https://api.truto.one/mcp/<YOUR_SECURE_TOKEN>"
      ]
    }
  }
}

Restart Claude Desktop. The LLM is now connected directly to your BambooHR instance.

BambooHR MCP Tool Inventory

Truto derives these tools dynamically from BambooHR's resource definitions and JSON schemas. Here are the most critical tools available to your Claude agent.

list_all_bamboohr_employees

  • Description: Retrieves the employee directory for the company domain. Returns employee ID, display name, department, and status.
  • Example Prompt: "Pull a list of all active employees in the Engineering department and group them by location."

get_single_bamboohr_employee_by_id

  • Description: Fetches detailed employee data by specifying the unique ID. Returns first name, last name, compensation details, and custom fields.
  • Example Prompt: "Get the full profile for employee ID 4092 and summarize their current benefit deductions."

create_a_bamboohr_employee

  • Description: Adds a new employee record to BambooHR. Requires at least a first name and last name.
  • Example Prompt: "Create a new employee record for Jane Doe. Set her department to Sales and her start date to next Monday."

list_all_bamboohr_applications

  • Description: Retrieves a list of candidate applications for the company domain. Useful for auditing the hiring pipeline.
  • Example Prompt: "List all applications submitted in the last 48 hours for the Senior Backend Engineer role."

bamboohr_applications_change_status

  • Description: Changes an applicant's status in the ATS by application ID.
  • Example Prompt: "Move application ID 8831 to the 'Offer Extended' status."

get_single_bamboohr_job_by_id

  • Description: Retrieves detailed information about a specific job posting based on the unique job ID.
  • Example Prompt: "Fetch the job details for job ID 102 and tell me if the status is still marked as open."

Complete Tool Inventory

Here is the complete inventory of additional BambooHR tools available. For full schema details, visit the BambooHR integration page.

  • list_all_bamboohr_benefits: Get benefit coverages for the companyDomain in BambooHR. Returns id, shortName, description, and more.
  • bamboohr_benefits_deduction_type: Get all benefit deduction types for the companyDomain in BambooHR. Returns id, deductionTypeName, and more.
  • bamboohr_benefits_member_events: Get a list of member benefit events in BambooHR for the specified companyDomain.
  • update_a_bamboohr_employee_by_id: Update an employee by id in BambooHR. Requires company_domain and id.
  • update_a_bamboohr_field_by_id: Use this endpoint to update one or more metadata fields in the account.
  • list_all_bamboohr_fields: Get a list of fields available in a BambooHR account using companyDomain.
  • list_all_bamboohr_users: Get a list of users for the companyDomain in BambooHR. Returns user id, employeeId, and more.
  • create_a_bamboohr_application: Add a new candidate application to a job opening in BambooHR. Requires company_domain and jobId.
  • get_single_bamboohr_application_by_id: Get details about a specific application in BambooHR. Requires company_domain and id.
  • create_a_bamboohr_job: Add a new job opening in BambooHR with required parameters like postingTitle and jobStatus.
  • list_all_bamboohr_jobs: Get a list of job summaries in BambooHR for the specified companyDomain.

Workflows in Action

Connecting an LLM to an HRIS is only useful if it executes complex, multi-step operations reliably. Here is how Claude handles real-world scenarios using the Truto MCP server.

Scenario 1: Automated Employee Onboarding & Provisioning

"We just hired John Smith as a Data Scientist. Create his employee record in BambooHR, assign him to the Data team, and pull his new employee ID so I can provision his software licenses."

Execution Steps:

  1. Claude calls create_a_bamboohr_employee with the payload {"firstName": "John", "lastName": "Smith", "department": "Data"}.
  2. The Truto Proxy API translates this into BambooHR's required XML/JSON structure and executes the POST request.
  3. BambooHR returns the newly created record, including the generated id.
  4. Claude reads the response, extracts the ID, and outputs the confirmation to the user, ready for the next step in the IT provisioning pipeline.

Scenario 2: Applicant Pipeline Triage

"Pull all open applications for the Product Manager role. Identify any candidates who have been stuck in the 'Initial Review' stage for more than 7 days, and update their status to 'Follow-up Required'."

Execution Steps:

  1. Claude calls list_all_bamboohr_jobs to find the exact job ID for "Product Manager".
  2. Claude calls list_all_bamboohr_applications passing the job ID as a query parameter.
  3. The model parses the returned JSON array, comparing the applicationDate or lastModified timestamps against the current date.
  4. For every candidate exceeding the 7-day threshold, Claude iterates through and calls bamboohr_applications_change_status to update them sequentially.
Warning

Handling Pagination: When calling list methods, Truto automatically injects limit and next_cursor properties into the query schema. Claude is instructed to pass cursor values back unchanged. If your query exceeds the limit, Claude will autonomously invoke the tool again using the next_cursor to fetch the remaining records.

Security and Access Control

Giving an AI agent write access to your core HR system is inherently dangerous, much like the security considerations when connecting Jira to Claude. Truto provides strict, infrastructure-level controls to limit what the MCP server can do.

  • Method Filtering: You can restrict the server to specific HTTP methods. Passing config.methods: ["read"] ensures Claude can only execute get and list operations. It physically cannot delete or create records, even if it hallucinates a command to do so.
  • Tag Filtering: You can scope the server to specific functional areas using config.tags: ["ats"]. This exposes the applicant tracking tools while hiding the core employee directory and payroll tools.
  • Token Authentication: By default, possessing the MCP URL grants access. For enterprise environments, you can set require_api_token_auth: true. This forces the MCP client to provide a valid Truto API token in the Authorization header, adding a secondary layer of identity verification.
  • Ephemeral Access: You can create short-lived servers by setting an expires_at timestamp. The platform schedules a background worker to automatically destroy the token and clean up the database record exactly when it expires, leaving zero stale credentials behind.

Next Steps

Building reliable AI agents requires secure, normalized access to third-party data. Writing custom API wrappers for idiosyncratic platforms like BambooHR drains engineering resources and introduces severe maintenance debt. By using Truto to generate managed MCP servers, you offload the authentication, schema generation, and routing logic entirely.

FAQ

Does Claude have a native integration for BambooHR?
No, Claude does not have a native BambooHR connector. You must use a Model Context Protocol (MCP) server to translate Claude's tool calls into BambooHR API requests.
How do I handle BambooHR API rate limits with Claude?
Truto passes HTTP 429 rate limit errors directly back to Claude via the MCP server. Your AI agent framework must implement retry and exponential backoff logic to handle these limits gracefully.
Can I restrict Claude to read-only access in BambooHR?
Yes. When generating the MCP server in Truto, you can configure method filtering to only allow 'read' operations, preventing the LLM from creating or deleting records.
How does Truto handle BambooHR pagination?
Truto automatically injects limit and next_cursor properties into the MCP tool schemas. Claude reads the next_cursor from the response and passes it back in subsequent tool calls to fetch the next page of data.

More from our Blog