Skip to main content
Glama

bamboohr-mcp

A read-only Model Context Protocol server for BambooHR.

This is a fork of evrimalacan/mcp-bamboohr (MIT). See NOTICE for attribution and the full list of changes.

Why this fork

BambooHR is sensitive HR data, so this fork hardens the upstream server for exposing it to an AI assistant safely. Design priorities: read-only by construction, least privilege, and the host process holds no credential. The upstream server is a clean, well-tested base; this fork hardens it for that posture:

  • Read-only by construction. The HTTP client exposes only get/getBuffer — post/put/delete were removed, so no write tool can be added by accident. Every registered MCP tool is a GET.

  • Proxy-ready, credential-free. Set BAMBOO_BASE_URL to a loopback token-proxy and the server sends no Authorization header — the proxy injects a fresh OAuth Bearer per request. The BambooHR credential never lives in this process.

  • Injectable config. The credential is resolved in config.ts and passed into the client, not hardwired into a boot-time singleton — so a future multi-tenant/remote host can construct a per-request client without touching the tool layer.

Related MCP server: BambooHR MCP Server

Configuration

Two shapes (see .env.example):

Proxied (recommended for shared / sensitive use):

{
  "mcpServers": {
    "bamboohr": {
      "command": "node",
      "args": ["build/index.js"],
      "type": "stdio",
      "env": {
        // A loopback proxy injects Authorization; no token here.
        "BAMBOO_BASE_URL": "http://127.0.0.1:7339"
      }
    }
  }
}

Direct (a local/desktop setup with your own API key):

{
  "mcpServers": {
    "bamboohr": {
      "command": "node",
      "args": ["build/index.js"],
      "type": "stdio",
      "env": {
        "BAMBOO_API_TOKEN": "your_api_token",
        "BAMBOO_COMPANY_DOMAIN": "your_company_subdomain"
      }
    }
  }
}

Tools (all read-only)

Tool

Purpose

get-employee

Employee record with selectable fields

get-employee-photo

Employee photo by size

get-employee-directory

Company-wide directory

get-employee-goals

Performance goals for an employee

estimate-time-off-balance

Projected time-off balances

get-time-off-requests

Time-off requests (filterable)

get-whos-out

Upcoming time off + holidays

list-company-files

Browse company files/categories (metadata)

get-company-file

Download a company document by id

get-meta-fields

Discover available BambooHR data fields

Egress note. Some tools (directory, file download) can return large volumes of PII. For shared / sensitive deployments, enforce row/size caps and field scoping at the proxy in front of this server, rather than trusting the tool layer.

Activating / deactivating tools

Set BAMBOO_ENABLED_TOOLS to a comma- or space-separated allowlist to control which tools register. Unset = all tools. This lets you switch tools on/off by config alone — no code change — which is the clean way to keep tools whose BambooHR OAuth scope you didn't grant switched off, so the agent is never offered a tool that would 403. Unknown names are warned and ignored (never fail the server). Example (the read-only set covered by directory + employee name/job/photo + time-off scopes):

BAMBOO_ENABLED_TOOLS=get-employee,get-employee-photo,get-employee-directory,estimate-time-off-balance,get-time-off-requests,get-whos-out,get-meta-fields

Development

npm install
npm run build
npm test
npm run dev      # watch mode

TypeScript (strict), ESM, Node ≥22. Tests run under Jest.

Scope

Read-only data access only. There are deliberately no write tools. Adding any write capability is an explicit decision that changes the security posture — not a casual PR.

License

MIT — see LICENSE and NOTICE.

Available Tools

10 tools
estimate-time-off-balanceEstimate Future Time Off BalanceA

Calculate future time off balances for an employee. Returns array of time off types with current balance, units (days/hours), policyType (accruing/discretionary/manual), and usedYearToDate amounts.

Inputs: employeeId (required), date.

get-company-fileGet Company FileA

Download a specific company document by ID. Returns file data with base64-encoded content for binary files (PDFs, images, etc.) along with file size and metadata.

Inputs: fileId (required).

get-employeeGet EmployeeA

Get employee data with customizable field selection. Returns employee object with fields like displayName, firstName, lastName, jobTitle, department, division, location, supervisor, photoUrl, and many more based on the 'fields' parameter.

Inputs: id, fields, onlyCurrent.

get-employee-directoryGet Employee DirectoryA

Get the company-wide employee directory. Returns array of employee objects with comprehensive information including displayName, jobTitle, department, division, location, supervisor, workEmail, photoUrl, and more.

Inputs: no named parameters.

get-employee-goalsGet Employee GoalsA

Get performance goals and objectives for an employee. Returns goal objects with title, description, percentComplete, status, dueDate, milestones (for milestone-based goals), and progress tracking information.

Inputs: employeeId (required), filter.

get-employee-photoGet Employee PhotoC

Get an employee photo by size

Inputs: employeeId (required), size.

get-meta-fieldsGet Meta FieldsA

Discover all available BambooHR data fields. Returns array of field definitions with id, type (text/email/list/etc.), name, and optional alias. Essential for understanding what employee data fields can be requested.

Inputs: no named parameters.

get-time-off-requestsGet Time Off RequestsA

Retrieve and filter time off requests. Returns request objects with id, employeeId, status, start/end dates, request type, amount, available actions (approve/deny/etc.), and employee/manager notes. Supports extensive filtering.

Inputs: id, end, type, start, +3 more.

get-whos-outGet Who's OutB

View upcoming time off and holidays for a date range. Returns array of mixed events: timeOff events (id, type, employeeId, name, start, end) and holiday events (id, type, name, start, end) with summary counts.

Inputs: end, start.

list-company-filesList Company FilesA

Browse available company files and categories. Returns organized structure with file categories, each containing files with id, name, originalFileName, size, dateCreated, and category information.

Inputs: no named parameters.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 10 tools

    Disambiguation4/5

    Most tools target distinct resources (employee, photo, directory, goals, files, time-off balance, time-off requests, who's out, meta fields). However, get-time-off-requests and get-whos-out both relate to time off and could be confused, though their purposes differ (requests vs. calendar view).

    Naming Consistency5/5

    All tools follow a consistent verb-noun pattern with kebab-case (e.g., get-employee, list-company-files, get-whos-out). The distinction between 'get' for singular resources and 'list' for collections is uniformly applied.

    Tool Count5/5

    10 tools is well-scoped for a read-only HR data server, covering employees, directories, goals, files, time-off, and metadata without being overwhelming. Each tool serves a clear purpose.

    Completeness3/5

    The tool set covers many read operations (employee details, directory, goals, files, time-off), but lacks write operations. Since get-time-off-requests mentions approve/deny actions but no tool executes them, there is a notable gap for workflows that require action, not just data retrieval.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers