BambooHR MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@BambooHR MCP ServerWho is out of office this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
BambooHR MCP Server
Eesti keeles: README.et.md
A read-only Model Context Protocol server that lets Claude answer questions from BambooHR. It covers time off (who is out, balances, requests, a company-wide vacation overview), employee fields including custom ones, employee tables including custom tables, bulk reports across the whole company, training types and records, dependents, employee file listings, user accounts, company holidays and recent record changes.
It never writes to BambooHR. Nothing is created, approved, adjusted or deleted. The one POST it makes is the custom-report endpoint, which only reads.
Quick install (Claude Desktop)
No terminal, no Node.js. Claude Desktop ships its own runtime.
Download the extension file
bamboohr-mcp.mcpb.Double-click it. Claude Desktop opens an install dialog. Click Install.
Fill in two fields:
BambooHR API key: in BambooHR click your photo (bottom left) > API Keys > Add New Key, name it
Claude, copy the key.Company subdomain: the first part of your BambooHR address. For
acme.bamboohr.comenteracme.
Click Save, start a new chat and ask "Who is out of office this week?"
If double-clicking does nothing, use Settings > Extensions > Advanced settings > Install Extension and pick the file. On a Team or Enterprise plan an admin may first need to allow custom extensions. To update later, download the new file and install it again; your settings stay.
Developers who prefer a source checkout or Claude Code: see Manual setup.
Related MCP server: bamboohr-mcp
How access works
The server uses your own BambooHR API key. You see exactly what you can see in BambooHR itself. An HR administrator's key sees the whole company; an employee's key sees only themselves and possibly their direct reports. Results are silently limited by BambooHR, so an incomplete report usually means the key's access level, not a bug. Where a tool can tell, it says so: missingFields in the output of bamboohr_get_employee and bamboohr_employee_report lists the fields that came back empty or that the key could not see. The vacation overview and bamboohr_list_employees cover employees who appear in the published company directory, which is not always the full roster. If someone is missing, or a department filter returns nobody, check Settings > Company Directory sharing in BambooHR.
Manual setup
For developers, or for Claude Code. HR users should use the quick install above.
1. Create an API key
Log in to BambooHR.
Click your photo in the bottom-left corner and choose API Keys.
Click Add New Key, name it
Claude MCP, and click Generate Key.Copy the key now. It is shown only once.
2. Install
Requires Node.js 20 or newer.
git clone https://github.com/mikkmihkel/bamboohr-mcp.git
cd bamboohr-mcp
npm ci
npm run build3. Add to Claude Desktop
Open Settings > Developer > Edit Config and add the server. Replace the path, key and subdomain.
{
"mcpServers": {
"bamboohr": {
"command": "node",
"args": ["/absolute/path/to/bamboohr-mcp/dist/index.js"],
"env": {
"BAMBOOHR_TOKEN": "your-api-key",
"BAMBOOHR_COMPANY_DOMAIN": "yourcompany",
"BAMBOOHR_VACATION_TYPE": "Vacation"
}
}
}
}Restart Claude Desktop. The tools appear under the tools icon in the chat box.
3b. Or add to Claude Code
claude mcp add bamboohr -e BAMBOOHR_TOKEN=your-api-key -e BAMBOOHR_COMPANY_DOMAIN=yourcompany -- node /absolute/path/to/bamboohr-mcp/dist/index.js4. Smoke test
Ask Claude: "List the employee fields that contain 'shoe'." You should get the field's name, alias and type back, or an empty list if your account has no such field. If you get a permissions error, check the key and its access level. If the vacation overview says it cannot identify the vacation type, ask "List the time-off types" and set BAMBOOHR_VACATION_TYPE to the right name. Also pick one employee who is on vacation today and compare their unplanned days with the balance shown in BambooHR. The tool assumes BambooHR deducts a request from the balance once it starts; if the numbers disagree by the remaining days of that vacation, report it so the calculation can be adjusted.
Distributing to HR
Send HR users the link to the latest release or the .mcpb file itself, plus the install guide. The dialog stores the API key in the operating system's credential store, not in a text file.
Install guide for HR (Estonian): docs/PAIGALDUSJUHEND.md
Rebuild the bundle after code changes:
npm run bundle. Attach the result to a GitHub release so the download link above stays valid. It compiles, stages production dependencies under.bundle/, validatesmanifest.jsonand writesrelease/bamboohr-mcp.mcpb.Bump
versionin bothpackage.jsonandmanifest.jsonwhen you ship a new bundle so Claude Desktop shows the update.
Example questions
The tool Claude reaches for is named in parentheses.
Time off
Who is out next week? (
bamboohr_whos_out)Show Anna Tamm's vacation balance. (
bamboohr_list_employeesto find her id, thenbamboohr_time_off_balances)Which vacation requests are still waiting for approval in October? (
bamboohr_time_off_requestswith statusrequested)Who in Engineering has not taken a 14-day continuous vacation this year? (
bamboohr_vacation_overviewwithdepartmentandonlyMissingFourteenDayBlock)How many unplanned vacation days does each employee still have as of today? (
bamboohr_vacation_overview)
People data and custom fields
What is Anna Tamm's shoe size? (
bamboohr_list_fieldswith searchshoeto find the alias, thenbamboohr_get_employee)When did Mart Mets start? (
bamboohr_get_employeewithhireDate)Shoe sizes of everyone in Tallinn for the winter boots order. (
bamboohr_employee_reportwithlocationand the custom shoe-size field)Who has been with us more than 10 years? (
bamboohr_employee_reportwithhireDate)Who has a work anniversary this month? (
bamboohr_employee_reportwithhireDate)
Tables
Show Anna's job history. (
bamboohr_table_rowswith tablejobInfo)List all laptops in the equipment table. (
bamboohr_list_tablesto find the alias, thenbamboohr_table_rowsfor all employees)
Training
Which trainings are required? (
bamboohr_training_types)Has Anna done first-aid training? (
bamboohr_training_records)
Admin and audit
Which public holidays are left this year? (
bamboohr_company_holidays)Who joined or left since 1 September? (
bamboohr_changed_employees)Which BambooHR accounts are disabled? (
bamboohr_list_userswith statusdisabled)Which documents are on Anna's record? (
bamboohr_employee_files)Which dependents are recorded for Anna? (
bamboohr_employee_dependents)
Tools
Time off
Tool | What it does |
| Employees out and holidays in a range. Default today + 14 days. |
| Current employees with id, name, department, location, supervisor, email. |
| The company's time-off types and ids. |
| All balances for one employee as of a date. |
| Requests overlapping a range, with filters. |
| Per-employee vacation report for a year with the 14-day check. |
Employees and fields
Tool | What it does |
| Every employee field, standard and custom, with id, name, alias and type. |
| Every employee table with its alias and columns, including custom tables. |
| One employee's field values, plus |
| Chosen fields for every employee in one call. Always includes id, displayName and status. |
| Rows of one table for one employee or for everyone. |
| Records inserted, updated or deleted since a timestamp, newest first. |
People and company
Tool | What it does |
| Training types and categories, with required, renewable and renewal frequency. |
| One employee's completed trainings with date, instructor, hours, credits and cost. |
| Dependents for one employee or for everyone. Needs Benefits Administration permission. |
| Document categories and file metadata on an employee's record. No downloads. |
| BambooHR login accounts with linked employee id, status and last login. |
| Company holidays overlapping a range. Default: the current calendar year. |
How the vacation overview is calculated
Vacation type: the
timeOffTypeargument, elseBAMBOOHR_VACATION_TYPE, else the one type named like "vacation", "annual leave" or "puhkus". If more than one time-off type looks like vacation, the tool refuses to guess and lists the candidates. SetBAMBOOHR_VACATION_TYPEto the right name.Planned: approved or requested vacation starting after the as-of date, within the year.
Unplanned: balance as of the date minus planned. Negative means overbooked.
Blocks: approved or requested vacation requests, clipped to the year, merged when adjacent or overlapping. Length is calendar days, end minus start plus one.
14-day rule: true when any block is 14 calendar days or longer.
Year boundary: blocks are measured per calendar year. A vacation from 25 December to 7 January counts as 7 days in each year, not 14.
Gaps: only back-to-back or overlapping requests merge. Two Monday-to-Friday requests with a weekend between them count as two 5-day blocks. Book the whole period as one request to have it counted as one block.
Performance: the overview makes one balance call per employee, five at a time, and retries once on rate limiting. For several hundred employees it can take a minute.
Tips for good answers
Ask for the field list first. Custom fields have aliases such as
customShoeSize, andbamboohr_list_fieldswith a search word is the fastest way to find the right one before reading or reporting on it.The report excludes inactive people by default.
bamboohr_employee_reportdrops employees whose status is notActiveunless you ask forincludeInactive.Table rows come back unsorted. Job history and other tables are returned in BambooHR's own order; sort by date when you want the latest row.
The vacation overview is the slow one. In a company with several hundred employees it can take about a minute, because it asks BambooHR for one balance per employee.
An empty answer is usually a permission. Check
missingFieldsand the key's access level before assuming the data is absent.
Privacy and data flow
Data moves from BambooHR to the connector on your machine, and from there into your Claude conversation. Nothing is stored by the connector; there is no database, cache on disk or log of results. Metadata such as field and table names is kept in memory for ten minutes.
What you paste into a chat is subject to your organisation's Claude plan and data policy. Employee data is personal data. Ask only what you need, and prefer aggregate questions over dumping whole records.
The API key never leaves your machine except in requests to
https://<subdomain>.bamboohr.com. Tools never accept a key or domain as an argument, so Claude cannot be talked into using someone else's.Revoke a key in BambooHR under API Keys if it leaks or when a person leaves.
Troubleshooting
Symptom | Likely cause and fix |
| The key is wrong or revoked. Create a new one and re-enter it in Settings > Extensions > BambooHR > Configure. |
| Your BambooHR access level does not include that data. Ask a BambooHR administrator. |
A field you know exists is listed in | Either the key may not see it or the name is off. Run |
The vacation overview cannot identify the vacation type | More than one time-off type looks like vacation. Set Vacation time-off type in the extension settings to the exact name. |
A department filter returns nobody | The directory is not shared for that department. Check Settings > Company Directory in BambooHR. |
The overview is slow | One balance request per employee. A few hundred employees take about a minute. |
Environment variables
See .env.example.
Development
npm test # unit and integration tests
npm run typecheck
npm run buildSource layout: src/client.ts (HTTP get and post), src/bamboohr.ts (endpoint wrappers), src/fields.ts (pure field helpers), src/metaCache.ts (10-minute metadata cache), src/analysis.ts (pure vacation maths), src/overview.ts (report orchestration), src/server.ts (registrar), src/tools/shared.ts (annotations and helpers), src/tools/timeOff.ts, src/tools/meta.ts, src/tools/employees.ts, src/tools/people.ts (tool definitions), src/index.ts (stdio bootstrap).
License
MIT License, see LICENSE.
Available Tools
18 toolsbamboohr_changed_employeesChanged employeesARead-onlyIdempotent
List employees whose record changed since a timestamp: new hires (Inserted), edits to any field or to job, compensation or employment status tables (Updated), and removals (Deleted). Newest first. Use bamboohr_get_employee to see the current values.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only this change type. Default: all. | |
| since | Yes | ISO 8601 date or date-time, e.g. 2026-09-01 or 2026-09-01T00:00:00+00:00. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is known. The description adds useful behavioral context beyond annotations: it defines inserted/updated/deleted semantics, notes edits to job, compensation, or employment status tables, and states the newest-first ordering. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences each earn their place: the first defines the tool's scope, the second states sort order, and the third references the sibling tool for follow-up detail. The most important information is front-loaded, with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with two parameters, full schema documentation, and safety annotations, the description is complete. It explains what changed means, how results are sorted, and how to get current employee details. No output schema exists, but the description gives enough structural context to understand the tool's purpose and follow-up path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters, providing a baseline of 3. The description adds semantic value by mapping enum labels to real-world meanings: new hires = Inserted, edits = Updated, removals = Deleted. This helps the agent choose the type parameter more accurately than the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'List employees whose record changed since a timestamp.' It enumerates the three change categories (Inserted, Updated, Deleted), which fully clarifies what 'changed' means. It also differentiates itself from bamboohr_get_employee by pointing there for current values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when a changed-record list is needed after a timestamp. It routes the agent to bamboohr_get_employee for current values, providing a concrete alternative. It does not explicitly state exclusions versus other list-style siblings, but the scope is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_company_holidaysCompany holidaysARead-onlyIdempotent
List company holidays that overlap a date range. Default: the current calendar year. Multi-day holidays that overlap the range are included.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Range end, YYYY-MM-DD. Default: 31 December of the current year. | |
| start | No | Range start, YYYY-MM-DD. Default: 1 January of the current year. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is covered. The description adds two behavioral details beyond the schema: the default range (current calendar year) and the inclusion of multi-day holidays that overlap. These are useful, non-obvious traits that help an agent reason about the result set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundancy, and the primary action is stated first. The default and edge-case behavior are added efficiently without padding. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no required parameters and full schema coverage, the description covers the core behavior and defaults. It does not mention the response format, but the verb 'List' implies a list, and with no output schema, this is a minor gap. An agent can call it correctly without further info.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both start and end parameters are already documented with formats and defaults. The description reiterates the default but adds no new parameter-specific semantics. The multi-day overlap rule is behavioral, not parameter-focused. Thus a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a clear resource ('company holidays'), and a precise condition ('overlap a date range'). It also defines defaults, making it unambiguous. With no sibling tool for holidays, it stands alone without confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on what the tool does and its default behavior, which implies when to use it (when company holiday data is needed). It doesn't explicitly contrast with alternatives like 'whos_out', but the scope is clear enough that an agent can infer its purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_employee_dependentsEmployee dependentsARead-onlyIdempotent
List dependents (children, spouse) recorded in BambooHR, for one employee or for everyone the key may see. National id numbers arrive masked from BambooHR. Requires Benefits Administration permission.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | No | Internal employee id. Omit for all employees. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable non-obvious details beyond those annotations: national ID numbers are masked, and Benefits Administration permission is required. This helps agents anticipate auth failures and data formatting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences deliver purpose, scope, a data-format caveat, and a permission prerequisite with no filler. All content earns its place and the primary purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, optional-parameter list tool, the description plus schema covers what the tool does, how to scope it, what authorization is needed, and an important return-value behavior. Nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole parameter employeeId is already fully described in the schema as 'Internal employee id. Omit for all employees.' The description adds the nuance that omission returns everyone the key may see, but this is a modest extension of the schema's existing meaning. Baseline 3 is appropriate given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'dependents', and the scope: either one employee or all employees the key can see. The subject is distinct from sibling tools like get_employee or list_employees, so an agent can easily differentiate it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use the tool and how to scope it: pass employeeId for one employee or omit it for all visible dependents. It does not explicitly name alternative tools or state when not to use it, but the intended use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_employee_filesEmployee filesARead-onlyIdempotent
List the document categories and files stored on an employee's record (contracts, certificates, signed policies) with name, size, upload date and uploader. Metadata only; files are not downloaded.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes | Internal employee id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds meaningful behavioral context by stating 'Metadata only; files are not downloaded.' This clarifies that the tool will not return binary file content, which is useful beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. It front-loads the primary action and resource, then supplements with output details and a key limitation. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only tool with no output schema, the description covers the resource, output fields, and behavioral limit (no downloads). It is complete enough for an agent to call correctly, though it could optionally mention pagination or error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the employeeId parameter is already well documented as 'Internal employee id.' The description adds only implicit context by referring to 'an employee's record', which does not materially improve parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb 'List' and names the exact resource ('document categories and files stored on an employee's record'), including examples of document types and the returned metadata fields. This clearly differentiates it from sibling tools like bamboohr_get_employee or bamboohr_table_rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose statement makes it easy to infer when to use this tool, but it never explicitly says when to choose it over alternatives or mentions conditions like 'use this when you need file metadata but not downloads'. It is adequate but relies entirely on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_employee_reportEmployee reportARead-onlyIdempotent
Pull chosen fields for every employee in one call: e.g. hire date, department and a custom field such as shoe size for the whole company. id, displayName and status are always included. Inactive (terminated) employees are excluded unless includeInactive is true. missingFields lists fields BambooHR did not return, usually because the API key may not see them or the name is wrong; check names with bamboohr_list_fields. Filter and aggregate the rows yourself; BambooHR does not filter server-side.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Fields to include. | |
| employeeIds | No | Restrict to these employee ids. | |
| includeInactive | No | Include employees whose status is not Active. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, and the description adds important behavior beyond that: inactive employees are excluded unless includeInactive is true, missingFields reports fields BambooHR did not return, and filtering/aggregation is client-side only. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct operational information: the core call, guaranteed fields, inactive-employee handling, and missingFields/filtering caveats. The main action is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description conveys what the response will contain (requested fields plus always-included fields), how missing fields are surfaced, how inactive employees are handled, and that no server-side filtering exists. This is sufficient for an agent to invoke and interpret the tool correctly; 'in one call' also implies a single bulk response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real value by explaining that id/displayName/status are always included, clarifying that missingFields may indicate API key visibility issues or wrong field names, and linking fields to bamboohr_list_fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation—'Pull chosen fields for every employee in one call'—against a clear resource, with examples. It also emphasizes always-included id, displayName, and status, which differentiates it from single-employee or field-list sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use when you need the same chosen fields for all employees, and it directs agents to bamboohr_list_fields for checking field names. It does not explicitly say when not to use it relative to siblings like bamboohr_list_employees, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_get_employeeGet employeeARead-onlyIdempotent
Read one employee's field values: standard fields (hire date, job title, supervisor, status, contact details) and custom fields (e.g. shoe size). Omit employeeId to read the API key owner's own record. Omit fields for a sensible default set. missingFields lists requested fields that came back empty or that the key may not see.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Fields to read. Default: name, job, department, hire date, status, contact. | |
| employeeId | No | Internal employee id from bamboohr_list_employees. Omit or 0 for yourself. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond that: how omitted employeeId is interpreted, what happens when fields is omitted, and that missingFields reflects fields that may be empty or hidden from the API key. This discloses a real visibility limitation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The first sentence states the core purpose, the second covers the two optional-behavior decisions, and the third explains the missingFields semantics. The most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with two optional parameters and strong safety annotations, this is complete. It covers the purpose, default behavior, self-record behavior, and what missingFields means. Without an output schema, the explicit mention of missingFields is especially useful and nothing needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter mechanics are already well documented. The description still adds meaning by listing example standard fields, mentioning custom fields, and explaining what the default field set is. The missingFields note also clarifies what the fields parameter's result will contain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read one employee's field values', naming a specific verb, resource, and field scope. It clearly distinguishes itself from list-style siblings by emphasizing 'one employee' and even explains how to read the API key owner's own record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: omit employeeId to read your own record and omit fields for a sensible default set. It does not explicitly name bamboohr_list_employees as the alternative for listing employees or retrieving IDs, but the singular/plural contrast and the concrete omit-behavior guidance make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_list_employeesList employeesARead-onlyIdempotent
List current employees from the BambooHR directory with id, name, job title, department, division, location, supervisor and work email. Use the id with the balance and request tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and non-destructive behavior, so the bar is lower. The description adds meaningful behavioral context by specifying the exact field set returned and signaling that the output is a directory listing of current employees. It does not mention pagination or sorting, but for a zero-parameter list tool these are minor gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences, with the core action and scope front-loaded and the downstream usage hint placed second. Every sentence earns its place with no redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, zero-parameter listing tool, the description is complete: it states what is listed, which fields are returned, and how the returned IDs should be used. The annotations cover safety and idempotency, so nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to explain parameter behavior; the baseline of 4 applies. The field list in the description compensates for the absence of an output schema by indicating what the returned data will contain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a precise resource ('current employees from the BambooHR directory'), and enumerates the returned fields (id, name, job title, department, division, location, supervisor, work email). It clearly differentiates from sibling tools like get_employee and list_users by focusing on the employee directory listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: this is for obtaining current employees and their IDs for downstream use with 'balance and request tools.' It does not explicitly state when to avoid this tool in favor of a sibling such as get_employee, but the 'current employees' scope and the downstream ID guidance provide usable direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_list_fieldsList employee fieldsARead-onlyIdempotent
List every employee field in this BambooHR account, standard and custom, with id, name, API alias and type. Use search to find a field by name (e.g. 'shoe', 'hire'). Set includeOptions to see the allowed values of list fields. Pass the alias or id to bamboohr_get_employee or bamboohr_employee_report.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Case-insensitive substring of the field name or alias. | |
| includeOptions | No | Attach the option list of list-type fields. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds useful behavioral detail: it returns all fields, includes custom fields, and optionally includes options for list fields. This goes beyond the structured annotations and clarifies what the agent can expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four concise sentences, each serving a purpose: stating the output, guiding search, explaining includeOptions, and directing downstream use. It is front-loaded with the primary purpose and contains no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with two optional parameters, the description covers the purpose, output attributes, parameter usage, and how to use the results. It lacks explicit mention of pagination or response format, but given the tool's simplicity and the annotations covering safety, this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters described ('Case-insensitive substring' and 'Attach the option list... Default false'). The description adds examples ('shoe', 'hire') and rephrases includeOptions as 'allowed values', which slightly enriches understanding but does not add critical new semantics. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists every employee field (standard and custom) with specific attributes (id, name, API alias, type). It distinguishes itself from sibling list tools (e.g., bamboohr_list_employees) by focusing on fields, not people or time-off types. The purpose is explicit and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage instructions: 'Use search to find a field by name' and 'Set includeOptions to see the allowed values of list fields.' It also explains downstream usage by passing the alias/id to other tools. While it doesn't explicitly contrast with alternatives, the intended workflow is clear and contextually sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_list_tablesList employee tablesARead-onlyIdempotent
List every tabular field in BambooHR (job history, compensation, employment status, and custom tables such as equipment or certificates) with the table alias and its columns. Use the alias with bamboohr_table_rows.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the safety profile is fully covered. The description adds useful behavioral context beyond that: it explains the output shape (alias and columns) and the relationship to bamboohr_table_rows, which helps the agent know how the result is meant to be consumed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence names the resource and examples, and the second sentence gives the crucial usage linkage to a sibling tool. It is front-loaded with the action and scope, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter discovery tool with rich annotations and no output schema, the description is complete: it explains what the tool returns, gives concrete category examples, and tells the agent exactly how to use the returned alias. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool takes zero parameters and the schema coverage is 100%, so there are no parameter semantics left unexplained. The description appropriately focuses on behavior rather than wasted parameter detail, earning the baseline for a zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a clear resource ('every tabular field in BambooHR'), and what is returned ('table alias and its columns'). The examples of job history, compensation, employment status, and custom tables make the scope concrete and distinguish it from listing employees or other entity types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs the agent to 'Use the alias with bamboohr_table_rows,' providing a direct next step after calling this tool. It does not explicitly list when not to use it, but the purpose is clear enough that no alternatives are genuinely competing for this metadata-discovery role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_list_time_off_typesList time-off typesARead-onlyIdempotent
List the company's time-off types (e.g. vacation, sick leave) with their ids and units, plus the default hours per weekday. Use this to find the right type name or id for other tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds value by stating what the response contains (ids, units, and default hours per weekday), which is useful behavioral information beyond the annotations. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: the first states the action and output contents, the second states the practical use case. No filler or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool, the description is complete. It names the resource, the output fields, and the follow-up purpose (finding type name/id for other tools), leaving no critical gap for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty input schema, so the baseline is 4. There are no parameter details needed, and the description appropriately focuses on output semantics rather than inventing parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('List') and resource ('company's time-off types'), and adds concrete detail about the returned fields ('ids and units, plus the default hours per weekday'). This distinguishes it from sibling list tools like 'bamboohr_list_employees' or 'bamboohr_list_fields'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence provides clear usage context: 'Use this to find the right type name or id for other tools.' It does not mention exclusions or alternative tools, but for a lookup/reference tool the use case is well-defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_list_usersList BambooHR usersARead-onlyIdempotent
List BambooHR user accounts (people who can log in) with their linked employee id, email, status and last login. Useful for access reviews: who has an enabled account, who never logged in.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Only accounts with this status. Default: all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, idempotent, open-world, and non-destructive behavior. The description adds useful context by specifying the returned fields (linked employee id, email, status, last login) and the access-review purposeais without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core behavior and result fields, then adds a concrete use case. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and strong annotations, the description covers what the tool returns, who it applies to, and why it is useful. No critical information for invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the only parameter, status, is fully documented with an enum and default of 'all'. The description mentions 'status' but does not add meaning beyond what the schema already provides, so the baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('List') and resource ('BambooHR user accounts') and clarifies that these are 'people who can log in', distinguishing them from employee records. This clearly differentiates from siblings like bamboohr_list_employees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case: 'access reviews: who has an enabled account, who never logged in.' It does not explicitly state when not to use this tool or name alternatives, but the definition of user accounts versus employees makes the appropriate context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_table_rowsTable rowsARead-onlyIdempotent
Read the rows of an employee table for one employee or for everyone: job history (jobInfo), compensation, employmentStatus, or any custom table (e.g. equipment, certificates). Get valid table aliases from bamboohr_list_tables. Rows are unsorted; sort by date yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table alias, e.g. jobInfo, compensation, employmentStatus, customEquipment. | |
| employeeId | No | Internal employee id. Omit for all employees the key may see. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds a meaningful behavioral caveat: 'Rows are unsorted; sort by date yourself.' It also clarifies the scope ('for everyone') without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The main action and scope are first, examples follow, and the important unsorted-data caveat is saved for the end. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with annotations covering safety, the description covers purpose, valid inputs, and the unsorted output behavior. It does not describe the return format, but there is no output schema to reconcile, and the essential call details are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description mostly repeats the example alias values found in the schema, adding only the hint to fetch aliases from bamboohr_list_tables. Since the schema carries the semantic load, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('rows of an employee table'), then scopes it to one employee or everyone with concrete examples (jobInfo, compensation, employmentStatus, custom tables). It clearly distinguishes itself from bamboohr_list_tables by instructing the agent to get valid aliases from that sibling, so the tool's purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: whenever table rows are needed, and it points to bamboohr_list_tables for valid aliases. It does not explicitly contrast with alternative employee-data tools like bamboohr_get_employee, but the examples make the intended use evident, so the guidance is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_time_off_balancesTime-off balancesARead-onlyIdempotent
Get one employee's time-off balances for every assigned type as of a date, including amount used year-to-date. Use a future date to project the balance.
| Name | Required | Description | Default |
|---|---|---|---|
| asOf | No | Calculate the balance as of this date, YYYY-MM-DD. Default: today. | |
| employeeId | Yes | Internal BambooHR employee id (from bamboohr_list_employees). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds behavioral context beyond that: the temporal dimension ('as of a date') and the future-projection behavior, plus the response scope (every assigned type, year-to-date used). It doesn't mention auth or rate limits, but for a read-only tool with full annotation coverage this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The core purpose is front-loaded, followed by a single, high-value usage note. Every word contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 2 params and no output schema, the description sufficiently conveys the purpose, the parameter behavior, and the expected data (balances per type, ytd used). It could list return fields in more detail, but the simplicity and annotations make this an adequate level of completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the baseline is 3. The description adds meaning above the schema by explaining that the asOf date can be a future date to project the balance, and clarifies the balance includes year-to-date usage, which goes beyond simple schema field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific verb 'Get' and the resource: 'one employee's time-off balances for every assigned type as of a date, including amount used year-to-date.' The explicit single-employee scope differentiates it from sibling tools like 'time off requests' or company-wide overviews.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you need a single employee's balance history) and provides a useful tip for the asOf parameter ('Use a future date to project the balance'), but it does not explicitly state when to prefer this tool over siblings such as 'bamboohr_vacation_overview', and no exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_time_off_requestsTime-off requestsARead-onlyIdempotent
List time-off requests overlapping a date range, optionally filtered by employee, status and time-off type. Results are limited to employees the API key's owner may see in BambooHR.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Range end, YYYY-MM-DD. | |
| start | Yes | Range start, YYYY-MM-DD. | |
| status | No | Limit to these statuses. Default: all. | |
| employeeId | No | Limit to one employee. | |
| timeOffTypeId | No | Limit to one time-off type id (see bamboohr_list_time_off_types). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond annotations: the 'overlapping' semantics for date range and the visibility limitation to employees the API key owner may see. This enriches the agent's understanding without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundant words. It front-loads the core purpose and then adds the critical scope restriction. Every sentence earns its place, and the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (5 params, all documented in schema) and rich annotations, the description covers the essential behavioral aspects: the overlap semantics and the visibility constraint. It doesn't mention pagination or response format, but with no output schema, the phrase 'List time-off requests' suffices. It is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds meaningful nuance by clarifying that the date range selects requests overlapping the range (not just contained), and explicitly mentions the optional filters (employee, status, time-off type) which map directly to parameters. This goes beyond simple schema repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (List) and resource (time-off requests), and specifies the key filters (date range, employee, status, time-off type) and the scope limitation to visible employees. It is unambiguous and distinguishes this tool from sibling listing tools by its focus on requests with these specific filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it lists time-off requests with optional filters and notes the visibility restriction. It doesn't explicitly name alternatives or conditions for when not to use it, but the tool's purpose is self-evident and no competing sibling tool has the same filter set, so an agent can infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_training_recordsTraining recordsARead-onlyIdempotent
List one employee's completed trainings with completion date, instructor, hours, credits, cost and notes. Optionally limit to one training type. To check who is missing a required training, call this per employee.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes | Internal employee id. | |
| trainingTypeId | No | Only records of this training type (see bamboohr_training_types). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, idempotent, non-destructive behavior; the description adds concrete facts about scope ('per employee', 'completed') and return content (dates, instructor, hours, credits, cost, notes). It does not discuss edge cases like missing employee IDs or pagination, but the disclosed context exceeds the annotated baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with action and resource, no redundant filler. Each clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter read tool with no output schema, the description covers the core return fields, the per-employee scope, and a representative use case. The schema and annotations fill in safety and parameter details, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: employeeId and trainingTypeId are described in the schema, including the link to bamboohr_training_types. The description only restates that trainingTypeId is optional, adding no new semantics. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('List') and a bounded resource ('one employee's completed trainings'), and enumerates the returned fields. This distinguishes it from sibling tools like bamboohr_training_types, which lists type definitions rather than per-employee records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear operational context: 'Optionally limit to one training type' and 'To check who is missing a required training, call this per employee.' It does not explicitly name alternatives or exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_training_typesTraining typesARead-onlyIdempotent
List the company's training types (name, category, required, renewable, renewal frequency in months, due window for new hires) and training categories. Use the type id with bamboohr_training_records.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a safe, read-only, idempotent operation. The description adds the output fields and the relationship to training records, but does not describe response structure or other behavioral details. This is adequate but not extensive beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the core purpose and followed by a useful usage pointer. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the zero-parameter schema and read-only annotations, the description is nearly complete. It lists the returned fields and connects to the related sibling, but the exact response shape (e.g., array vs. object) is not stated. Still, this is a minor gap for such a simple list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description adds value by enumerating the returned fields and clarifying that training categories are part of the result, which helps the agent understand the output even though no inputs are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly says this tool lists the company's training types with specific fields and training categories. It is unambiguous and distinguishable from the sibling bamboohr_training_records, with which it directly connects via the type id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this is the lookup tool for training type definitions and tells the agent to use the returned type id with bamboohr_training_records. It does not explicitly exclude other alternatives, but the context and sibling list make the intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_vacation_overviewVacation overviewARead-onlyIdempotent
Company-wide vacation report for one calendar year. For every current employee: vacation balance as of a date, used year-to-date, vacation planned after that date (approved or requested), unplanned balance (balance minus planned), the longest continuous vacation block in calendar days, and whether they have at least one 14-day continuous block. Adjacent requests are merged into one block. Use onlyMissingFourteenDayBlock to list only employees who have not taken or booked a 14-day vacation. The summary counts all employees before the onlyMissingFourteenDayBlock filter is applied. Note: planned vacation excludes a request already in progress on the as-of date, on the assumption that BambooHR's balance has already deducted it.
| Name | Required | Description | Default |
|---|---|---|---|
| asOf | No | Balance date, YYYY-MM-DD, must be inside the year. Default: today (or Dec 31 for past years). | |
| year | No | Calendar year. Default: current year. | |
| department | No | Only employees in this department (exact name, case-insensitive). | |
| timeOffType | No | Vacation time-off type name or id. Default: BAMBOOHR_VACATION_TYPE, else a type named like 'vacation' or 'puhkus'. | |
| onlyMissingFourteenDayBlock | No | Return only employees without a 14-day continuous block. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnlyHint/idempotentHint annotations by disclosing important behaviors: adjacent requests are merged, the summary counts before the onlyMissingFourteenDayBlock filter, and planned vacation excludes a request already in progress because BambooHR's balance may have already deducted it. This is exactly the kind of non-obvious behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries information: the report scope, the detailed output fields, the block-merging rule, the filter behavior, and the critical caveat about in-progress requests. It is front-loaded with the most important scoping statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating all returned columns and their meanings. It could additionally clarify what 'current employee' means or whether results are paginated, but for the tool's complexity the essential calling context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real value by explaining the interaction of onlyMissingFourteenDayBlock with the summary count, the as-of date semantics, and default timeOffType resolution, which are not evident from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: a company-wide vacation report for one calendar year, and enumerates the exact computed columns (balance, used YTD, planned, unplanned, longest block, 14-day block flag). This clearly distinguishes it from individual-level sibling tools like bamboohr_time_off_balances or bamboohr_time_off_requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Company-wide vacation report' and 'For every current employee' provides clear context that this is an aggregate overview, not a per-employee lookup. However, it does not explicitly name alternatives or state when not to use it, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bamboohr_whos_outWho's outARead-onlyIdempotent
List employees who are out of office and company holidays in a date range. Defaults to today through 14 days ahead. Each entry has type 'timeOff' (with employeeId and employee name) or 'holiday' (holiday name only).
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Last day of the range, YYYY-MM-DD. Default: start + 14 days. | |
| start | No | First day of the range, YYYY-MM-DD. Default: today. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description does not need to repeat safety traits. It adds valuable behavioral detail by describing the output structure (each entry has type 'timeOff' or 'holiday' with specific fields) and the default date range. This goes beyond annotations and helps the agent understand what to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose, defaults, and output format. No redundant information, front-loaded with the core action. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with two optional parameters and no output schema, the description covers the essential details: what it lists, the default range, and the shape of entries. No missing information is needed for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'start' and 'end' documented with defaults and formats. The description does not add new parameter semantics beyond what the schema already provides; it repeats the default behavior in prose. Baseline 3 is appropriate since the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and a clear resource: employees out of office and company holidays. It distinguishes itself from siblings like bamboohr_list_employees (all employees) and bamboohr_company_holidays (holidays only) by combining both into a single view. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context (date range, defaults) but does not explicitly state when to use this tool versus alternatives. It does not mention exclusions or recommend sibling tools for specific needs, leaving some inference to the agent. However, the combined nature is implied by the title and content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
18 tool updates
v3.0.0- First observed
bamboohr_changed_employees - First observed
bamboohr_company_holidays - First observed
bamboohr_employee_dependents - First observed
bamboohr_employee_files - First observed
bamboohr_employee_report - First observed
bamboohr_get_employee - First observed
bamboohr_list_employees - First observed
bamboohr_list_fields - First observed
bamboohr_list_tables - First observed
bamboohr_list_time_off_types - First observed
bamboohr_list_users - First observed
bamboohr_table_rows - First observed
bamboohr_time_off_balances - First observed
bamboohr_time_off_requests - First observed
bamboohr_training_records - First observed
bamboohr_training_types - First observed
bamboohr_vacation_overview - First observed
bamboohr_whos_out
TDQS
Scored across 18 tools
Most tools have distinct purposes, but some overlap exists. For example, 'bamboohr_list_employees' and 'bamboohr_employee_report' both return employee data, and 'bamboohr_time_off_requests' and 'bamboohr_whos_out' both deal with time-off, though with different granularity. The descriptions clarify the differences, so misselection is unlikely but possible.
The consistent 'bamboohr_' prefix and snake_case are maintained throughout. While many tools follow the verb_noun pattern (list_*, get_*), a few like 'whos_out' and 'vacation_overview' break from that, but they are still readable and predictable. The overall style is cohesive.
With 18 tools, the server is well-scoped for an HR integration. Each tool covers a distinct area: employee data, time-off, training, dependents, files, users, and change tracking. No tool feels redundant, and the number is appropriate for the breadth of functionality.
The surface is nearly complete for a read-only HR toolset, covering employee details, time-off, training, company holidays, users, dependents, files, and change detection. The only notable gap is the absence of write/update operations, but since the server appears intended for reading, this is acceptable. Minor missing features like a dedicated single-employee time-off request fetch are easily worked around.
Maintenance
Related MCP Connectors
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Ask data questions in natural language. Get SQL, insights, and charts from your databases.
Ask questions in plain language, get answers from your business database. No SQL required.
Ask business questions in plain English. Get instant answers from your database, no SQL needed.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with BambooHR's API through natural language queries. Provides access to employee data, time off management, company files, and HR operations with comprehensive tools for workforce management.108 npm1MIT
- AlicenseNot gradedqualityFmaintenanceEnables natural language interaction with BambooHR to manage employee records, time off, hiring, and benefits. It provides 74 tools and pre-built workflows to automate HR operations like onboarding, reporting, and performance tracking.14MIT
- AlicenseAqualityDmaintenanceA read-only MCP server for BambooHR that enables safe AI assistant access to employee records, time-off, files, and directories via natural language queries.10MIT
- FlicenseNot gradedqualityCmaintenanceEnables querying an HR analytics database (hr_db) using natural language, providing tools to get database schema and run read-only SQL queries for HR metrics like headcount, attrition, and payroll.-