BambooHR MCP server for AI agents

Live

API KEY

HR OPERATIONS

Productivity

BambooHR gives your agent HR operations: read and update employee records, manage time off requests and balances, track timesheets and clock entries, run reports, set performance goals, and move job applications.

  • Per-user credentials: each call uses the actual user's API key, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
BambooHR
agent · Acme Q3
Run
Who's out of office next week?
S
bamboohr_whos_out_list
99ms
HR agent
5 people are out next week. Dana Kim is on vacation Monday to Wednesday, and Friday is a company holiday.
Sources: 5 time off entries, 1 holiday
bamboohr
6 entries
18:29
Message Claude...

Tools your HR agent reaches for on BambooHR, scoped per user.

CALL ANY TOOL
89 tools for HR operations in BambooHR: read and update employees, approve time off, track timesheets, run reports, manage goals, and update applicant status.
bamboohr_applicant_statuses_list
List applicant statuses
List the applicant statuses configured for the company, both system-defined and custom. Returns each status's id, code, name, translatedName, description, enabled and manageable flags. Use bamboohr_applicant_statuses_list to get status IDs for bamboohr_application_status_update or for filtering bamboohr_applications_list.
Parameters
Name
Type
Required
Description
—
No parameters required
bamboohr_application_comment_create
Create application comment
bamboohr_application_get
Get application
bamboohr_application_status_update
Update application status
bamboohr_benefit_coverages_list
List benefit coverages
bamboohr_company_benefits_list
List company benefits
bamboohr_custom_reports_list
List custom reports
bamboohr_dataset_data_query
Query dataset data
bamboohr_dataset_field_options_get
Get dataset field options
bamboohr_employee_dependent_create
Create employee dependent
bamboohr_employee_dependents_list
List employee dependents
bamboohr_employee_get
Get employee
bamboohr_employee_table_row_update
Update employee table row
bamboohr_employee_time_off_policies_list
List employee time off policies
bamboohr_employee_time_off_policy_assign
Assign employee time off policy
bamboohr_employee_training_record_create
Create employee training record
bamboohr_employees_changed_table_rows_list
List employees changed table rows
bamboohr_goal_comments_list
List goal comments
bamboohr_goal_progress_update
Update goal progress
bamboohr_hiring_leads_list
List hiring leads
bamboohr_holiday_create
Create holiday
bamboohr_jobs_list
List jobs
bamboohr_provinces_list
List provinces
bamboohr_time_off_balance_adjust
Time off balance adjust
bamboohr_time_off_balance_get
Get time off balance
bamboohr_time_off_request_cancel
Cancel time off request
bamboohr_time_off_request_comments_list
List time off request comments
bamboohr_time_tracking_clock_in
Time tracking clock in
bamboohr_time_tracking_projects_list
List time tracking projects
bamboohr_training_categories_list
List training categories

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// BambooHR tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["bamboohr"], toolNames: [
    "bamboohr_whos_out_list",
    "bamboohr_time_off_requests_list",
    "bamboohr_time_off_request_approve"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Show who is out next week and approve Dana Kim's pending time off request" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["bamboohr"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Show who is out next week and approve Dana Kim's pending time off request" }],
  tools,
});

// Execute the tool call with the user's vaulted BambooHR API key
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["bamboohr"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Show who is out next week and approve Dana Kim's pending time off request" }],
  tools,
});

// Tool call runs with the user's vaulted BambooHR API key
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["bamboohr"] }, pageSize: 100,
});

const agent = new Agent({
  name: "hr_agent",
  model: "gemini-2.5-pro",
  instruction: "BambooHR tools scoped to this user",
  tools,
});

await agent.run("Show who is out next week and approve Dana Kim's pending time off request");
Try these prompts
Copy any prompt into your agent. Each maps directly to a BambooHR tool. Click to copy, paste into your agent, done.
Employees
Copy the prompt
Copied
Show Dana Kim's job title, department, and manager.
Copy the prompt
Copied
Create an employee record for Priya Shah starting June 3.
Copy the prompt
Copied
Which employees changed since Monday?
Time off
Copy the prompt
Copied
Who's out next week?
Copy the prompt
Copied
Approve Dana Kim's time off request for March 10 to 14.
Copy the prompt
Copied
What is Priya Shah's vacation balance?
Time and performance
Copy the prompt
Copied
Approve Dana Kim's pending timesheet for last week.
Copy the prompt
Copied
Create a Q3 goal for Priya to ship the onboarding revamp.
Copy the prompt
Copied
Run the Headcount by Department custom report.
SEE HOW AUTH WORKS
Each user connects their own BambooHR API key once, and Scalekit sends it with every call. Keys stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
BambooHR
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
BambooHR
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
BambooHR
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
BambooHR
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other HR and productivity connectors.
People Ops and HR teams
Performance review collector
Collects review feedback from Airtable and Google Forms scoped to each manager's direct reports, writes per-employee summaries to Notion, and DMs the manager a Slack digest.
People Ops and HR teams
Offer letter routing agent
Drafts the offer in PandaDoc, blocks on the hiring manager's approval in Slack, then emails the candidate their e-signature link. Every call runs as the recruiter who triggered it, never a shared HR bot.
Test other agents
See the same per-user auth pattern across other HR and productivity connectors.
PEOPLE OPS
Performance review collector agent
Collect review feedback from Airtable and Google Forms per manager, summarise each report in Notion, and DM the digest in Slack.
PEOPLE OPS
Offer letter routing agent
Draft the offer in PandaDoc, gate it on hiring manager approval in Slack, then email the candidate their signature link.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared BambooHR API key looks fine in a demo. In production every time off approval and record change looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
BambooHR today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access BambooHR as the user or through a shared key?
As the user. Each user connects their own BambooHR API key once, and Scalekit sends it with every call. Audit logs attribute every record change and time off approval to that user, not a shared service account.
Where is the BambooHR API key stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new API key. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in BambooHR?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the directory and report tools without bamboohr_employee_update or bamboohr_time_off_request_deny, whose denials are final. No BambooHR tool deletes data. Scalekit also enforces scope checks before every API call.
What happens when a user revokes BambooHR access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Which BambooHR data can the agent reach?
Employees, time off, time tracking, goals, training, benefits, reports, and applicant tracking. Some tools return only what the caller can see; bamboohr_employee_files_list, for example, lists the file categories and files available to the user whose API key is connected.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""bamboohr"": {
""url"": ""https://mcp.scalekit.com/bamboohr"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.bamboohr]
url = ""https://mcp.scalekit.com/bamboohr""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""bamboohr"": {
""url"": ""https://mcp.scalekit.com/bamboohr"",
""type"": ""http""
}
}
}