Bamboohr Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Bamboohr Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
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:
get/getBuffer— post/put/delete were removed, so no write tool can be added by accident. Every registered MCP tool is a GET.
BAMBOO_BASE_URL to a loopbacktoken-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.
config.ts and passedinto 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.
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"
}
}
}
}| 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.
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-fieldsnpm install
npm run build
npm test
npm run dev # watch modeTypeScript (strict), ESM, Node ≥22. Tests run under Jest.
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.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.