# Northline Group — HRIS data dictionary

**Instance key:** `ember-pier-3541`  
**MCP endpoint:** `https://hr-safe-space.cheek.org/i/ember-pier-3541/mcp`  
**Authentication:** none. The endpoint key is the only thing that selects a dataset.  
**Generated:** 2026-09-14T05:48:20.097Z

> Every row described here is synthetic. It represents no real person and no real
> organisation. This exists to give an assistant a realistic HRIS to work against.

## This instance

| Property | Value |
| --- | --- |
| Company | Northline Group |
| Industry | Professional Services |
| Email domain | northline.com |
| Founded | 1990 |
| Base currency | USD |
| Worker records | 275,396 |
| Management layers | 9 |
| Provisioned | 2026-09-14T03:30:40.529Z |
| Tool calls served | 0 |
| Writes applied | 0 |

### Organisation shape

| Layer | Role | People | Average span of control |
| --- | --- | --- | --- |
| 0 | Chief Executive Officer | 1 | 7 |
| 1 | Executive | 7 | 5 |
| 2 | Executive | 37 | 4 |
| 3 | Vice President | 149 | 3 |
| 4 | Senior Director | 447 | 3 |
| 5 | Director | 1,340 | 4 |
| 6 | Senior Manager | 5,361 | 5 |
| 7 | Manager | 26,805 | 9 |
| 8 | Individual contributor | 241,249 | — |

## How an instance works

Calling any endpoint key for the first time provisions a complete HRIS for that key. The roster size is drawn from the range 50,000–425,000 worker records and is stable for the life of the key: the same key always describes the same company.

**Provisioning is a single row insert.** The employee roster is not copied per instance. One master template holds the worker records once; an instance is a *projection* over a prefix of that template, parameterised by the instance row. Names, company identity, department mix, location mix, pay scale and hire dates all derive from the instance, so two keys over the same template are two different companies. That is what makes it possible to stand up thousands of these: a 425,000-person company materialises in the time it takes to insert one row, and costs one row of storage until something is written to it.

**Writes are copy-on-write.** Every mutating tool writes a diff into this instance's private overlay: a patch, a newly created row, or a tombstone. Reads merge the overlay over the projection. The shared template is immutable at runtime, so a write through one endpoint key can never be observed through another.

**Isolation guarantee.** Every query this endpoint runs is bound to `ember-pier-3541`. There is no tool, filter or parameter that reaches another instance's data.

## Entities

| Entity | Rows here | Origin | Writable | Description |
| --- | --- | --- | --- | --- |
| [`employee`](#employee) | 275,396 | template-projection | yes | The worker record. |
| [`compensation_event`](#compensation_event) | 111,518 | template-projection | yes | Historical pay changes: merit increases, promotions, market adjustments and retention awards. |
| [`time_off_request`](#time_off_request) | 60,909 | template-projection | yes | Absence requests across every leave type, from submitted through approved, denied or taken. |
| [`performance_review`](#performance_review) | 235,191 | template-projection | yes | Completed review-cycle records with rating, potential, calibration state and written feedback. |
| [`goal`](#goal) | 80,993 | template-projection | yes | Individual objectives with weighting, progress and status. |
| [`benefit_enrollment`](#benefit_enrollment) | 234,509 | template-projection | yes | Which employees are enrolled in which benefit plans, with employee and employer cost. |
| [`training_record`](#training_record) | 170,826 | template-projection | yes | Assigned and completed learning, including mandatory compliance training and its renewal state. |
| [`hr_case`](#hr_case) | 2,839 | template-projection | yes | Employee-relations matters: conduct concerns, grievances, accommodation requests, safety reports and ethics-hotline intake, with severity, SLA and assignment. |
| [`hr_case_note`](#hr_case_note) | 8,539 | template-projection | yes | Chronological notes recorded against an employee-relations case. |
| [`job_requisition`](#job_requisition) | 1,400 | template-projection | yes | Open and historical hiring requisitions with hiring manager, recruiter, target and fill state. |
| [`candidate`](#candidate) | 26,000 | template-projection | yes | Applicants against requisitions, with source, pipeline stage, rating and expected compensation. |
| [`payslip`](#payslip) | ~13,219,008 (derived) | derived | no | Per-period earnings, taxes and deductions. |
| [`time_off_balance`](#time_off_balance) | ~2,203,168 (derived) | derived | no | Accrued, taken and available leave per employee per leave type. |
| [`audit_log`](#audit_log) | 1 | overlay | no | Every write any MCP tool has performed against this instance, in order. |
| [`department`](#department) | 19 | reference | no | Department catalogue. |
| [`location`](#location) | 24 | reference | no | Work locations with timezone, currency and cost-of-living index. |
| [`job`](#job) | 418 | reference | no | Job catalogue: every department and level combination with its title, FLSA status and pay band. |
| [`benefit_plan`](#benefit_plan) | 22 | reference | no | Benefit plan catalogue with carrier, tier, cost split, deductible and eligibility waiting period. |
| [`training_course`](#training_course) | 25 | reference | no | Learning catalogue, including which courses are mandatory and how often they must be renewed. |
| [`policy_document`](#policy_document) | 12 | reference | no | HR policy library. |
| [`payroll_run`](#payroll_run) | 48 | template-projection | no | The payroll calendar: two years of semi-monthly periods with status and totals. |

## Operational entities

### employee

**Employee** — The worker record. One row per person who has ever been on the roster, including terminated leavers. Org structure (manager, level, department, direct reports) is derived arithmetically from the position in the roster, so the reporting tree is always internally consistent and never orphaned.

- **Rows in this instance:** 275,396
- **Primary key:** `employee_id` (public ids are prefixed `EMP-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `employee_id` asc
- **Writable through MCP:** yes
- **Read by:** `search_employees`, `get_employee`, `list_direct_reports`, `get_reporting_chain`, `get_org_snapshot`, `get_headcount_summary`, `get_compensation_detail`, `get_pay_band_analysis`, `get_attrition_report`, `get_diversity_report`, `describe_hris_schema`, `get_instance_info`
- **Written by:** `submit_compensation_change`, `submit_performance_review`, `transfer_employee`, `promote_employee`, `record_termination`, `onboard_employee`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `employee_id` | text | no | Stable public identifier. primary key |
| `seq` | integer | no | Position in the roster. Lower numbers sit higher in the org. |
| `first_name` | text | yes | Given name. |
| `last_name` | text | yes | Family name. |
| `middle_initial` | text | no | Disambiguating initial, present only above the size of the name space. |
| `full_name` | text | yes | Display name. |
| `work_email` | text | yes | Corporate email. Unique across the instance. |
| `work_phone` | text | yes | Work telephone number. |
| `home_address_line1` | text | yes | Home street address. |
| `job_title` | text | yes | Current job title. |
| `job_code` | text | no | Job catalogue code. FK → `job.job_code` |
| `job_family` | text | no | Job family grouping. |
| `flsa_status` | text | no | Overtime eligibility. one of: `exempt`, `non-exempt` |
| `job_level` | integer | yes | Career level, 0 (associate) to 10 (CEO). |
| `job_level_name` | text | no | Human-readable level. |
| `job_level_code` | text | no | Short level code such as IC3 or M2. |
| `is_people_manager` | boolean | no | True when the employee has at least one direct report. |
| `is_executive` | boolean | no | True at VP level and above. |
| `department_code` | text | no | Owning department. FK → `department.code` |
| `department_name` | text | yes | Department name. |
| `department_function` | text | no | Function grouping such as Technology or Revenue. |
| `cost_center` | text | no | Finance cost centre. |
| `location_code` | text | yes | Primary work location. FK → `location.code` |
| `location_city` | text | no | Work city. |
| `location_region` | text | no | State or region. |
| `location_country` | text | no | Country. |
| `location_country_code` | text | no | ISO 3166-1 alpha-2 country code. |
| `location_timezone` | text | no | IANA timezone. |
| `manager_id` | text | yes | Direct manager. Null only for the CEO. FK → `employee.employee_id` |
| `manager_seq` | integer | no | Manager roster position. |
| `direct_report_count` | integer | no | Exact number of direct reports. |
| `org_depth` | integer | no | Layers below the CEO. 0 is the CEO. |
| `employment_type` | text | no | Full-time, part-time, contractor, intern or temporary. |
| `work_arrangement` | text | yes | On-site, hybrid or remote. |
| `employment_status` | text | yes | Current status. one of: `active`, `on_leave`, `terminated` |
| `hire_date` | date | no | Original hire date. |
| `tenure_years` | numeric | no | Years of service to today. |
| `termination_date` | date | yes | Last day worked. Null unless terminated. |
| `termination_reason` | text | yes | Reason for leaving. |
| `termination_voluntary` | boolean | no | True when the employee chose to leave. |
| `leave_type` | text | no | Type of leave, when on leave. |
| `date_of_birth` | date | no | Date of birth. |
| `age` | integer | no | Age in whole years. |
| `gender` | text | no | Self-identified gender. |
| `ethnicity` | text | no | Self-identified ethnicity (US EEO categories). |
| `base_salary_cents` | bigint | yes | Annual base salary in minor units. |
| `base_salary` | numeric | yes | Annual base salary. |
| `currency` | text | no | Pay currency, from the work location. |
| `bonus_target_pct` | numeric | no | Target bonus as a percentage of base. |
| `bonus_target` | numeric | no | Target bonus amount. |
| `equity_units` | integer | no | Outstanding equity units. |
| `compa_ratio` | numeric | no | Position in the pay band. 1.00 is midpoint. |
| `band_min_cents` | bigint | no | Bottom of the pay band for this job. |
| `band_mid_cents` | bigint | no | Midpoint of the pay band. |
| `band_max_cents` | bigint | no | Top of the pay band. |
| `department_ordinal` | integer | no | Internal department ordinal. Filtering on this instead of department_code lets the query engine discard rows before it joins the reference catalogues, which is the difference between a fast page and a full pass over the roster. |
| `location_ordinal` | integer | no | Internal location ordinal. Same index-friendly role as department_ordinal. |
| `employment_status_ordinal` | integer | no | Internal status ordinal: 0 active, 1 on leave, 2 terminated. |
| `performance_rating` | integer | yes | Most recent rating, 1 to 5. |
| `engagement_score` | integer | no | Latest engagement survey score, 1 to 100. |
| `flight_risk_score` | integer | no | Modelled attrition risk, 1 to 100. |
| `tenure_days` | integer | no | Days of service. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `query` | text | `full_name` | Free text across name, email, job title and id. |
| `employee_id` | id | `employee_id` | Exact employee id. |
| `department_code` | exact | `department_code` | Department code such as ENG. |
| `location_code` | exact | `location_code` | Location code such as US-NYC. |
| `employment_status` | enum | `employment_status` | Employment status. |
| `employment_type` | exact | `employment_type` | Employment type. |
| `work_arrangement` | exact | `work_arrangement` | On-site, Hybrid or Remote. |
| `manager_id` | id | `manager_id` | Direct reports of this manager. |
| `job_level_min` | number-range | `job_level` | Minimum career level. |
| `job_level_max` | number-range | `job_level` | Maximum career level. |
| `hired_after` | date-range | `hire_date` | Hired on or after this date. |
| `hired_before` | date-range | `hire_date` | Hired on or before this date. |
| `performance_rating` | number-range | `performance_rating` | Exact performance rating, 1 to 5. |
| `is_people_manager` | boolean | `is_people_manager` | Only people managers. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/employee)

### compensation_event

**Compensation event** — Historical pay changes: merit increases, promotions, market adjustments and retention awards.

- **Rows in this instance:** 111,518
- **Primary key:** `compensation_event_id` (public ids are prefixed `CMP-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `effective_date` desc
- **Writable through MCP:** yes
- **Read by:** `list_compensation_history`, `describe_hris_schema`
- **Written by:** `submit_compensation_change`, `promote_employee`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `compensation_event_id` | text | no | Stable public identifier. primary key |
| `employee_id` | text | no | Affected employee. FK → `employee.employee_id` |
| `employee_name` | text | no | Employee display name. |
| `effective_date` | date | no | Date the change took effect. |
| `event_type` | text | no | Kind of change. |
| `reason` | text | no | Business justification. |
| `percent_change` | numeric | no | Percentage increase applied. |
| `previous_salary` | numeric | no | Annualised base before the change. |
| `new_salary` | numeric | no | Annualised base after the change. |
| `currency` | text | no | Pay currency. |
| `approved_by` | text | no | Approving manager. FK → `employee.employee_id` |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `employee_id` | id | `employee_id` | Events for one employee. |
| `event_type` | exact | `event_type` | Kind of change. |
| `effective_after` | date-range | `effective_date` | On or after this date. |
| `effective_before` | date-range | `effective_date` | On or before this date. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/compensation_event)

### time_off_request

**Time off request** — Absence requests across every leave type, from submitted through approved, denied or taken.

- **Rows in this instance:** 60,909
- **Primary key:** `request_id` (public ids are prefixed `TOR-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `start_date` desc
- **Writable through MCP:** yes
- **Read by:** `list_time_off_requests`, `get_absence_summary`, `describe_hris_schema`
- **Written by:** `submit_time_off_request`, `decide_time_off_request`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `request_id` | text | no | Stable public identifier. primary key |
| `employee_id` | text | no | Requesting employee. FK → `employee.employee_id` |
| `employee_name` | text | no | Employee display name. |
| `leave_type_code` | text | no | Leave type code. FK → `time_off_type.code` |
| `leave_type` | text | no | Leave type name. |
| `is_paid` | boolean | no | Whether the leave is paid. |
| `start_date` | date | no | First day of absence. |
| `end_date` | date | no | Last day of absence. |
| `business_days` | integer | no | Working days requested. |
| `status` | text | yes | Request status. one of: `pending`, `approved`, `denied`, `cancelled`, `taken` |
| `requested_on` | date | no | Submission date. |
| `decided_on` | date | yes | Date the request was approved or denied. |
| `approver_id` | text | yes | Deciding manager. FK → `employee.employee_id` |
| `note` | text | yes | Employee-supplied note. |
| `decision_note` | text | yes | Approver note. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `employee_id` | id | `employee_id` | Requests for one employee. |
| `status` | enum | `status` | Request status. |
| `leave_type_code` | exact | `leave_type_code` | Leave type code such as PTO. |
| `start_after` | date-range | `start_date` | Starting on or after this date. |
| `start_before` | date-range | `start_date` | Starting on or before this date. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/time_off_request)

### performance_review

**Performance review** — Completed review-cycle records with rating, potential, calibration state and written feedback.

- **Rows in this instance:** 235,191
- **Primary key:** `review_id` (public ids are prefixed `REV-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `submitted_on` desc
- **Writable through MCP:** yes
- **Read by:** `list_performance_reviews`, `get_performance_review`, `describe_hris_schema`
- **Written by:** `submit_performance_review`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `review_id` | text | no | Stable public identifier. primary key |
| `employee_id` | text | no | Reviewed employee. FK → `employee.employee_id` |
| `employee_name` | text | no | Employee display name. |
| `reviewer_id` | text | no | Reviewing manager. FK → `employee.employee_id` |
| `cycle_code` | text | no | Review cycle. FK → `review_cycle.cycle_code` |
| `cycle_name` | text | no | Review cycle name. |
| `rating` | integer | yes | Overall rating, 1 (unsatisfactory) to 5 (outstanding). |
| `rating_label` | text | no | Rating in words. |
| `potential` | text | no | Nine-box potential axis. |
| `promotion_ready` | boolean | yes | Flagged ready for the next level. |
| `calibrated` | boolean | no | Rating passed through calibration. |
| `strengths` | text | yes | Recorded strengths. |
| `growth_areas` | text | yes | Recorded development areas. |
| `summary` | text | yes | Narrative summary. |
| `submitted_on` | date | no | Date the review was submitted. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `employee_id` | id | `employee_id` | Reviews for one employee. |
| `cycle_code` | exact | `cycle_code` | Review cycle code. |
| `rating` | number-range | `rating` | Exact rating, 1 to 5. |
| `promotion_ready` | boolean | `promotion_ready` | Only promotion-ready employees. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/performance_review)

### goal

**Goal** — Individual objectives with weighting, progress and status.

- **Rows in this instance:** 80,993
- **Primary key:** `goal_id` (public ids are prefixed `GOL-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `due_date` asc
- **Writable through MCP:** yes
- **Read by:** `list_goals`, `describe_hris_schema`
- **Written by:** `update_goal_progress`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `goal_id` | text | no | Stable public identifier. primary key |
| `employee_id` | text | no | Goal owner. FK → `employee.employee_id` |
| `employee_name` | text | no | Owner display name. |
| `title` | text | yes | Goal statement. |
| `category` | text | no | Goal category. |
| `cycle_code` | text | no | Planning cycle. |
| `progress_pct` | integer | yes | Percent complete. |
| `status` | text | yes | Goal status. one of: `on_track`, `at_risk`, `off_track`, `achieved`, `cancelled` |
| `weight_pct` | integer | no | Weight within the employee goal set. |
| `due_date` | date | no | Target completion date. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `employee_id` | id | `employee_id` | Goals for one employee. |
| `status` | enum | `status` | Goal status. |
| `category` | exact | `category` | Goal category. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/goal)

### benefit_enrollment

**Benefit enrollment** — Which employees are enrolled in which benefit plans, with employee and employer cost.

- **Rows in this instance:** 234,509
- **Primary key:** `enrollment_id` (public ids are prefixed `BEN-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `enrolled_on` desc
- **Writable through MCP:** yes
- **Read by:** `get_benefit_enrollments`, `describe_hris_schema`
- **Written by:** `enroll_in_benefit`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `enrollment_id` | text | no | Stable public identifier. primary key |
| `employee_id` | text | no | Enrolled employee. FK → `employee.employee_id` |
| `employee_name` | text | no | Employee display name. |
| `plan_code` | text | no | Benefit plan. FK → `benefit_plan.plan_code` |
| `plan_name` | text | no | Plan name. |
| `category` | text | no | Benefit category. |
| `carrier` | text | no | Carrier or administrator. |
| `coverage_tier` | text | no | Coverage tier. |
| `status` | text | yes | Enrollment status. one of: `active`, `waived`, `terminated`, `pending` |
| `enrolled_on` | date | no | Effective date of coverage. |
| `dependents` | integer | no | Covered dependents. |
| `employee_monthly_cost` | numeric | no | Employee monthly contribution. |
| `employer_monthly_cost` | numeric | no | Employer monthly contribution. |
| `annual_employer_cost` | numeric | no | Employer cost over twelve months. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `employee_id` | id | `employee_id` | Enrollments for one employee. |
| `plan_code` | exact | `plan_code` | Plan code. |
| `category` | exact | `category` | Benefit category. |
| `status` | enum | `status` | Enrollment status. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/benefit_enrollment)

### training_record

**Training record** — Assigned and completed learning, including mandatory compliance training and its renewal state.

- **Rows in this instance:** 170,826
- **Primary key:** `training_record_id` (public ids are prefixed `TRN-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `completed_on` desc
- **Writable through MCP:** yes
- **Read by:** `get_training_transcript`, `get_compliance_training_status`, `describe_hris_schema`
- **Written by:** `onboard_employee`, `assign_training`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `training_record_id` | text | no | Stable public identifier. primary key |
| `employee_id` | text | no | Learner. FK → `employee.employee_id` |
| `employee_name` | text | no | Learner display name. |
| `course_code` | text | no | Course. FK → `training_course.course_code` |
| `course_title` | text | no | Course title. |
| `category` | text | no | Course category. |
| `is_mandatory` | boolean | no | Whether the course is required. |
| `status` | text | yes | Completion status. one of: `completed`, `in_progress`, `not_started`, `overdue` |
| `completed_on` | date | yes | Completion date. |
| `score` | integer | yes | Assessment score out of 100. |
| `expires_on` | date | no | Date the certification lapses. |
| `assigned_on` | date | no | Date the course was assigned. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `employee_id` | id | `employee_id` | Records for one employee. |
| `course_code` | exact | `course_code` | Course code. |
| `status` | enum | `status` | Completion status. |
| `is_mandatory` | boolean | `is_mandatory` | Only mandatory training. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/training_record)

### hr_case

**HR case** — Employee-relations matters: conduct concerns, grievances, accommodation requests, safety reports and ethics-hotline intake, with severity, SLA and assignment.

- **Rows in this instance:** 2,839
- **Primary key:** `case_id` (public ids are prefixed `CASE-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `opened_on` desc
- **Writable through MCP:** yes
- **Read by:** `list_hr_cases`, `get_hr_case`, `describe_hris_schema`
- **Written by:** `open_hr_case`, `add_case_note`, `resolve_hr_case`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `case_id` | text | no | Stable public identifier. primary key |
| `subject_employee_id` | text | no | Employee the case concerns. FK → `employee.employee_id` |
| `subject_employee_name` | text | no | Subject display name. Suppressed when anonymous. |
| `case_type_code` | text | no | Case type. FK → `case_type.code` |
| `case_type` | text | no | Case type name. |
| `category` | text | no | Case category. |
| `status` | text | yes | Case status. one of: `open`, `investigating`, `pending_review`, `resolved`, `closed` |
| `severity` | text | yes | Assessed severity. one of: `low`, `medium`, `high`, `critical` |
| `confidential` | boolean | no | Restricted handling. |
| `anonymous` | boolean | no | Reported anonymously. |
| `assigned_to_id` | text | yes | Assigned HR partner. FK → `employee.employee_id` |
| `assigned_to_name` | text | no | Assigned HR partner name. |
| `opened_on` | date | no | Date the case was opened. |
| `sla_due_on` | date | no | Date the case breaches its SLA. |
| `closed_on` | date | yes | Date the case was closed. |
| `days_open` | integer | no | Days between opening and closing, or today. |
| `sla_breached` | boolean | no | Whether the SLA was missed. |
| `summary` | text | yes | Intake summary. |
| `note_count` | integer | yes | Number of case notes. |
| `resolution` | text | yes | Recorded outcome. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `subject_employee_id` | id | `subject_employee_id` | Cases about one employee. |
| `status` | enum | `status` | Case status. |
| `severity` | enum | `severity` | Severity. |
| `case_type_code` | exact | `case_type_code` | Case type code. |
| `opened_after` | date-range | `opened_on` | Opened on or after this date. |
| `sla_breached` | boolean | `sla_breached` | Only cases past SLA. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/hr_case)

### hr_case_note

**HR case note** — Chronological notes recorded against an employee-relations case.

- **Rows in this instance:** 8,539
- **Primary key:** `note_id` (public ids are prefixed `CNOTE-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `recorded_on` desc
- **Writable through MCP:** yes
- **Read by:** `get_hr_case`, `describe_hris_schema`
- **Written by:** `add_case_note`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `note_id` | text | no | Stable public identifier. primary key |
| `case_id` | text | no | Parent case. FK → `hr_case.case_id` |
| `recorded_on` | date | no | Date the note was recorded. |
| `author_id` | text | no | Author. FK → `employee.employee_id` |
| `author_name` | text | no | Author display name. |
| `internal` | boolean | no | Visible only to HR. |
| `body` | text | yes | Note text. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `case_id` | id | `case_id` | Notes on one case. |
| `internal` | boolean | `internal` | Only internal notes. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/hr_case_note)

### job_requisition

**Job requisition** — Open and historical hiring requisitions with hiring manager, recruiter, target and fill state.

- **Rows in this instance:** 1,400
- **Primary key:** `requisition_id` (public ids are prefixed `REQ-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `opened_on` desc
- **Writable through MCP:** yes
- **Read by:** `list_job_requisitions`, `get_job_requisition`, `get_recruiting_funnel`, `describe_hris_schema`
- **Written by:** `open_job_requisition`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `requisition_id` | text | no | Stable public identifier. primary key |
| `job_title` | text | yes | Role being hired. |
| `job_code` | text | no | Job catalogue code. FK → `job.job_code` |
| `department_code` | text | no | Hiring department. FK → `department.code` |
| `department_name` | text | no | Department name. |
| `location_code` | text | no | Work location. FK → `location.code` |
| `job_level` | integer | no | Career level of the opening. |
| `status` | text | yes | Requisition status. one of: `draft`, `open`, `on_hold`, `filled`, `cancelled` |
| `priority` | text | no | Business priority. one of: `low`, `medium`, `high`, `critical` |
| `openings` | integer | no | Headcount approved. |
| `filled_count` | integer | yes | Headcount filled so far. |
| `remote_eligible` | boolean | no | Open to remote candidates. |
| `hiring_manager_id` | text | no | Hiring manager. FK → `employee.employee_id` |
| `hiring_manager_name` | text | no | Hiring manager name. |
| `recruiter_id` | text | no | Assigned recruiter. FK → `employee.employee_id` |
| `recruiter_name` | text | no | Recruiter name. |
| `opened_on` | date | no | Date the requisition opened. |
| `target_fill_date` | date | no | Committed fill date. |
| `days_open` | integer | no | Age of the requisition in days. |
| `salary_band_min` | numeric | no | Bottom of the advertised band. |
| `salary_band_max` | numeric | no | Top of the advertised band. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `status` | enum | `status` | Requisition status. |
| `department_code` | exact | `department_code` | Hiring department. |
| `location_code` | exact | `location_code` | Work location. |
| `priority` | enum | `priority` | Business priority. |
| `hiring_manager_id` | id | `hiring_manager_id` | Requisitions for one hiring manager. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/job_requisition)

### candidate

**Candidate** — Applicants against requisitions, with source, pipeline stage, rating and expected compensation.

- **Rows in this instance:** 26,000
- **Primary key:** `candidate_id` (public ids are prefixed `CAND-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `applied_on` desc
- **Writable through MCP:** yes
- **Read by:** `get_job_requisition`, `list_candidates`, `get_recruiting_funnel`, `describe_hris_schema`
- **Written by:** `advance_candidate`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `candidate_id` | text | no | Stable public identifier. primary key |
| `full_name` | text | no | Candidate name. |
| `email` | text | no | Contact email. |
| `phone` | text | no | Contact phone. |
| `requisition_id` | text | no | Requisition applied to. FK → `job_requisition.requisition_id` |
| `job_title` | text | no | Role applied for. |
| `department_code` | text | no | Hiring department. |
| `source` | text | no | How the candidate arrived. |
| `stage` | text | yes | Pipeline stage. one of: `applied`, `screen`, `interview`, `onsite`, `offer`, `hired`, `rejected`, `withdrawn` |
| `rating` | integer | yes | Interview rating, 1 to 5. Null before interview. |
| `years_experience` | integer | no | Self-reported years of experience. |
| `expected_salary` | numeric | no | Candidate compensation expectation. |
| `applied_on` | date | no | Application date. |
| `last_activity_on` | date | no | Most recent pipeline activity. |
| `days_in_pipeline` | integer | no | Days since applying. |
| `referred_by_id` | text | no | Referring employee, when referred. FK → `employee.employee_id` |
| `notes` | text | yes | Recruiter notes. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `requisition_id` | id | `requisition_id` | Candidates on one requisition. |
| `stage` | enum | `stage` | Pipeline stage. |
| `source` | exact | `source` | Sourcing channel. |
| `query` | text | `full_name` | Free text across candidate name and email. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/candidate)

### payslip

**Payslip** — Per-period earnings, taxes and deductions. Computed on demand from the employee record and the payroll calendar rather than stored: at roster scale this table would be tens of millions of rows per instance with no added information.

- **Rows in this instance:** approximately 13,219,008 (computed on demand)
- **Primary key:** `payslip_id` (public ids are prefixed `PAY-`)
- **Origin:** Computed on demand. Nothing is stored.
- **Default sort:** `pay_date` desc
- **Writable through MCP:** no
- **Note:** Derived entities are read-only: there is no stored row to patch.
- **Read by:** `get_payslips`, `describe_hris_schema`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `payslip_id` | text | no | Stable public identifier. primary key |
| `employee_id` | text | no | Paid employee. FK → `employee.employee_id` |
| `employee_seq` | integer | no | Roster position of the employee. Filtering on this instead of employee_id turns a scan of the whole roster into a primary-key lookup. |
| `employee_name` | text | no | Employee display name. |
| `payroll_run_id` | text | no | Payroll run. FK → `payroll_run.payroll_run_id` |
| `period_start` | date | no | Pay period start. |
| `period_end` | date | no | Pay period end. |
| `pay_date` | date | no | Date paid. |
| `gross_pay` | numeric | no | Gross earnings for the period. |
| `base_earnings` | numeric | no | Base salary component. |
| `bonus_earnings` | numeric | no | Bonus component, paid in the final period of a quarter. |
| `federal_tax` | numeric | no | Federal income tax withheld. |
| `state_tax` | numeric | no | State or regional tax withheld. |
| `social_contributions` | numeric | no | Social insurance contributions. |
| `benefit_deductions` | numeric | no | Pre-tax benefit deductions. |
| `retirement_deferral` | numeric | no | Retirement plan deferral. |
| `net_pay` | numeric | no | Take-home pay. |
| `currency` | text | no | Payment currency. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `employee_id` | id | `employee_id` | Payslips for one employee. |
| `payroll_run_id` | exact | `payroll_run_id` | Payslips in one payroll run. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/payslip)

### time_off_balance

**Time off balance** — Accrued, taken and available leave per employee per leave type. Computed from tenure, the accrual policy and approved absences rather than stored.

- **Rows in this instance:** approximately 2,203,168 (computed on demand)
- **Primary key:** `balance_id` (public ids are prefixed `BAL-`)
- **Origin:** Computed on demand. Nothing is stored.
- **Default sort:** `employee_id` asc
- **Writable through MCP:** no
- **Note:** Derived entities are read-only: there is no stored row to patch.
- **Read by:** `get_time_off_balances`, `describe_hris_schema`
- **Written by:** `submit_time_off_request`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `balance_id` | text | no | Stable public identifier. primary key |
| `employee_id` | text | no | Employee. FK → `employee.employee_id` |
| `employee_seq` | integer | no | Roster position of the employee. Filtering on this instead of employee_id turns a scan of the whole roster into a primary-key lookup. |
| `employee_name` | text | no | Employee display name. |
| `leave_type_code` | text | no | Leave type. FK → `time_off_type.code` |
| `leave_type` | text | no | Leave type name. |
| `accrual_days_per_year` | numeric | no | Annual accrual rate. |
| `accrued_days` | numeric | no | Days accrued in the current year. |
| `taken_days` | numeric | no | Days taken in the current year. |
| `scheduled_days` | numeric | no | Approved but not yet taken. |
| `available_days` | numeric | no | Days still available. |
| `max_carryover_days` | numeric | no | Cap on carryover into next year. |
| `as_of` | date | no | Date the balance was computed. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `employee_id` | id | `employee_id` | Balances for one employee. |
| `leave_type_code` | exact | `leave_type_code` | Leave type code. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/time_off_balance)

### audit_log

**Audit log entry** — Every write any MCP tool has performed against this instance, in order. Populated only by tool calls, so a freshly provisioned instance holds exactly one entry.

- **Rows in this instance:** 1
- **Primary key:** `audit_id` (public ids are prefixed `AUD-`)
- **Origin:** Exists only because a tool on this endpoint created it.
- **Default sort:** `occurred_at` desc
- **Writable through MCP:** no
- **Read by:** `list_recent_changes`, `describe_hris_schema`
- **Written by:** `submit_compensation_change`, `submit_time_off_request`, `decide_time_off_request`, `submit_performance_review`, `update_goal_progress`, `open_job_requisition`, `advance_candidate`, `transfer_employee`, `promote_employee`, `record_termination`, `onboard_employee`, `enroll_in_benefit`, `assign_training`, `open_hr_case`, `add_case_note`, `resolve_hr_case`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `audit_id` | text | no | Stable public identifier. primary key |
| `occurred_at` | timestamptz | no | When the write happened. |
| `tool` | text | no | MCP tool that performed the write. |
| `action` | text | no | Logical action. |
| `entity` | text | no | Entity affected. |
| `entity_id` | text | no | Record affected. |
| `actor` | text | no | Who the tool acted as. |
| `summary` | text | no | Human-readable description. |
| `details` | jsonb | no | Structured before/after payload. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `entity` | exact | `entity` | Entity name. |
| `entity_id` | id | `entity_id` | One record. |
| `tool` | exact | `tool` | Tool name. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/audit_log)

## Reference catalogues

### department

**Department** — Department catalogue. Headcount share is allocated per instance, so the same catalogue produces a differently shaped company each time.

- **Rows in this instance:** 19
- **Primary key:** `code` (public ids are prefixed `DEPT-`)
- **Origin:** Shared catalogue, identical in every instance, annotated with this instance's counts.
- **Default sort:** `headcount` desc
- **Writable through MCP:** no
- **Read by:** `get_org_snapshot`, `list_departments`, `describe_hris_schema`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `code` | text | no | Department code. primary key |
| `name` | text | no | Department name. |
| `function` | text | no | Function grouping. |
| `cost_center` | text | no | Finance cost centre. |
| `headcount` | integer | no | Employees in this department in this instance. |
| `active_headcount` | integer | no | Active employees. |
| `avg_base_salary` | numeric | no | Average base salary. |
| `leader_id` | text | no | Most senior person in the department. FK → `employee.employee_id` |
| `leader_name` | text | no | Department leader. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `function` | exact | `function` | Function grouping. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/department)

### location

**Location** — Work locations with timezone, currency and cost-of-living index. The index scales pay.

- **Rows in this instance:** 24
- **Primary key:** `code` (public ids are prefixed `LOC-`)
- **Origin:** Shared catalogue, identical in every instance, annotated with this instance's counts.
- **Default sort:** `headcount` desc
- **Writable through MCP:** no
- **Read by:** `get_org_snapshot`, `list_locations`, `describe_hris_schema`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `code` | text | no | Location code. primary key |
| `city` | text | no | City. |
| `region` | text | no | State or region. |
| `country` | text | no | Country. |
| `country_code` | text | no | ISO country code. |
| `timezone` | text | no | IANA timezone. |
| `currency` | text | no | Local currency. |
| `cost_of_living_index` | numeric | no | Pay multiplier relative to the reference market. |
| `is_headquarters` | boolean | no | Headquarters site. |
| `headcount` | integer | no | Employees at this location. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `country_code` | exact | `country_code` | ISO country code. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/location)

### job

**Job** — Job catalogue: every department and level combination with its title, FLSA status and pay band.

- **Rows in this instance:** 418
- **Primary key:** `job_code` (public ids are prefixed `JOB-`)
- **Origin:** Shared catalogue, identical in every instance, annotated with this instance's counts.
- **Default sort:** `job_code` asc
- **Writable through MCP:** no
- **Read by:** `get_compensation_detail`, `describe_hris_schema`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `job_code` | text | no | Job code. primary key |
| `title` | text | no | Job title. |
| `department_code` | text | no | Department. FK → `department.code` |
| `job_family` | text | no | Job family. |
| `job_level` | integer | no | Career level. |
| `level_name` | text | no | Level name. |
| `flsa_status` | text | no | Overtime eligibility. |
| `band_min` | numeric | no | Band minimum. |
| `band_mid` | numeric | no | Band midpoint. |
| `band_max` | numeric | no | Band maximum. |
| `incumbents` | integer | no | Employees currently in this job. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `department_code` | exact | `department_code` | Department code. |
| `job_level` | number-range | `job_level` | Career level. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/job)

### benefit_plan

**Benefit plan** — Benefit plan catalogue with carrier, tier, cost split, deductible and eligibility waiting period.

- **Rows in this instance:** 22
- **Primary key:** `plan_code` (public ids are prefixed `PLAN-`)
- **Origin:** Shared catalogue, identical in every instance, annotated with this instance's counts.
- **Default sort:** `category` asc
- **Writable through MCP:** no
- **Read by:** `list_benefit_plans`, `describe_hris_schema`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `plan_code` | text | no | Plan code. primary key |
| `plan_name` | text | no | Plan name. |
| `category` | text | no | Benefit category. |
| `carrier` | text | no | Carrier. |
| `coverage_tier` | text | no | Coverage tier. |
| `employee_monthly_cost` | numeric | no | Employee monthly contribution. |
| `employer_monthly_cost` | numeric | no | Employer monthly contribution. |
| `deductible` | numeric | no | Annual deductible. |
| `eligibility_days` | integer | no | Waiting period in days. |
| `enrolled_count` | integer | no | Employees enrolled in this instance. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `category` | exact | `category` | Benefit category. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/benefit_plan)

### training_course

**Training course** — Learning catalogue, including which courses are mandatory and how often they must be renewed.

- **Rows in this instance:** 25
- **Primary key:** `course_code` (public ids are prefixed `CRS-`)
- **Origin:** Shared catalogue, identical in every instance, annotated with this instance's counts.
- **Default sort:** `course_code` asc
- **Writable through MCP:** no
- **Read by:** `list_training_courses`, `get_compliance_training_status`, `describe_hris_schema`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `course_code` | text | no | Course code. primary key |
| `title` | text | no | Course title. |
| `category` | text | no | Category. |
| `delivery` | text | no | Delivery mode. |
| `duration_minutes` | integer | no | Duration in minutes. |
| `is_mandatory` | boolean | no | Required for all employees. |
| `renewal_months` | integer | no | Renewal cadence in months. |
| `provider` | text | no | Training provider. |
| `completion_count` | integer | no | Completions recorded in this instance. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `category` | exact | `category` | Category. |
| `is_mandatory` | boolean | `is_mandatory` | Only mandatory courses. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/training_course)

### policy_document

**Policy document** — HR policy library. Full text is returned so an assistant can answer policy questions from source.

- **Rows in this instance:** 12
- **Primary key:** `policy_code` (public ids are prefixed `POL-`)
- **Origin:** Shared catalogue, identical in every instance, annotated with this instance's counts.
- **Default sort:** `policy_code` asc
- **Writable through MCP:** no
- **Read by:** `search_policies`, `describe_hris_schema`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `policy_code` | text | no | Policy code. primary key |
| `title` | text | no | Policy title. |
| `category` | text | no | Policy category. |
| `summary` | text | no | One-paragraph summary. |
| `body` | text | no | Full policy text. |
| `owner_function` | text | no | Owning function. |
| `review_cycle_months` | integer | no | How often the policy is reviewed. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `category` | exact | `category` | Policy category. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/policy_document)

### payroll_run

**Payroll run** — The payroll calendar: two years of semi-monthly periods with status and totals.

- **Rows in this instance:** 48
- **Primary key:** `payroll_run_id` (public ids are prefixed `RUN-`)
- **Origin:** Projected from the shared master template and filtered to this instance's roster.
- **Default sort:** `pay_date` desc
- **Writable through MCP:** no
- **Read by:** `list_payroll_runs`, `describe_hris_schema`

#### Columns

| Column | Type | Writable | Description |
| --- | --- | --- | --- |
| `payroll_run_id` | text | no | Run identifier. primary key |
| `period_start` | date | no | Period start. |
| `period_end` | date | no | Period end. |
| `pay_date` | date | no | Payment date. |
| `status` | text | no | Run status. one of: `draft`, `processing`, `approved`, `paid` |
| `frequency` | text | no | Pay frequency. |
| `employee_count` | integer | no | Employees paid in this run. |
| `gross_total` | numeric | no | Total gross pay. |
| `net_total` | numeric | no | Total net pay. |

#### Filters

| Filter | Kind | Applies to | Description |
| --- | --- | --- | --- |
| `status` | exact | `status` | Run status. |

[Browse this data](https://hr-safe-space.cheek.org/i/ember-pier-3541/browse/payroll_run)

## Tools

52 tools are exposed on this endpoint. 36 are read-only; 16 change data.

| Tool | Kind | Reads / writes | Purpose |
| --- | --- | --- | --- |
| [`search_employees`](#search_employees) | read | `employee` | Search the worker directory by name, email, job title or id, with optional filters on department, location, status, employment type, manager, career level, hire date and performance rating. |
| [`get_employee`](#get_employee) | read | `employee` | Full worker record for one employee: identity, contact details, job and level, department, location, reporting line, employment status and dates, demographics and compensation. |
| [`list_direct_reports`](#list_direct_reports) | read | `employee` | Everyone who reports directly to a given manager. |
| [`get_reporting_chain`](#get_reporting_chain) | read | `employee` | The full management chain from an employee up to the CEO, one row per level. |
| [`get_org_snapshot`](#get_org_snapshot) | read | `employee`, `department`, `location` | Shape of the whole organisation: roster size, active headcount, management layers with the population and span of control at each, and the largest departments and locations. |
| [`list_departments`](#list_departments) | read | `department` | Department catalogue with headcount, active headcount, average base pay and the most senior leader. |
| [`list_locations`](#list_locations) | read | `location` | Work locations with country, timezone, currency, cost-of-living index and headcount. |
| [`get_headcount_summary`](#get_headcount_summary) | read | `employee` | Headcount grouped by any one of department, location, country, career level, employment type, work arrangement or status, with active counts and average base pay per group. |
| [`get_compensation_detail`](#get_compensation_detail) | read | `employee`, `job` | Current pay for one employee: base salary, currency, bonus target, equity, compa-ratio and where they sit in the pay band for their job and level. |
| [`list_compensation_history`](#list_compensation_history) | read | `compensation_event` | Pay changes over time: merit increases, promotions, market adjustments and retention awards. |
| [`submit_compensation_change`](#submit_compensation_change) | **write** | `employee`, `compensation_event`, `audit_log` | Change an employee's base salary. |
| [`get_pay_band_analysis`](#get_pay_band_analysis) | read | `employee` | Compensation distribution by career level for a department or the whole company: population, minimum, average and maximum base pay, average compa-ratio, and how many people sit outside the 0. |
| [`list_payroll_runs`](#list_payroll_runs) | read | `payroll_run` | The payroll calendar: pay periods, pay dates, status and totals. |
| [`get_payslips`](#get_payslips) | read | `payslip` | Payslips for one employee: gross, base and bonus earnings, tax and benefit deductions, and net pay for each pay period. |
| [`get_time_off_balances`](#get_time_off_balances) | read | `time_off_balance` | Accrued, taken, scheduled and available days for every leave type for one employee, derived from tenure, the accrual policy and approved absences. |
| [`list_time_off_requests`](#list_time_off_requests) | read | `time_off_request` | Absence requests filtered by employee, status, leave type or date range. |
| [`submit_time_off_request`](#submit_time_off_request) | **write** | `time_off_request`, `time_off_balance`, `audit_log` | Submit a time off request on behalf of an employee. |
| [`decide_time_off_request`](#decide_time_off_request) | **write** | `time_off_request`, `audit_log` | Approve, deny or cancel a pending time off request. |
| [`get_absence_summary`](#get_absence_summary) | read | `time_off_request` | Absence volume by leave type and status across the company or one department, with total days requested. |
| [`list_performance_reviews`](#list_performance_reviews) | read | `performance_review` | Completed reviews with rating, potential, calibration state and promotion readiness. |
| [`get_performance_review`](#get_performance_review) | read | `performance_review` | One review in full, including written strengths, growth areas and narrative summary. |
| [`submit_performance_review`](#submit_performance_review) | **write** | `performance_review`, `employee`, `audit_log` | Record a performance review for an employee in the current cycle. |
| [`list_goals`](#list_goals) | read | `goal` | Individual objectives with weighting, progress and status. |
| [`update_goal_progress`](#update_goal_progress) | **write** | `goal`, `audit_log` | Update how far along a goal is, and optionally its status. |
| [`list_job_requisitions`](#list_job_requisitions) | read | `job_requisition` | Hiring requisitions with status, priority, openings, hiring manager and age. |
| [`get_job_requisition`](#get_job_requisition) | read | `job_requisition`, `candidate` | One requisition in full, with its candidate pipeline broken down by stage. |
| [`open_job_requisition`](#open_job_requisition) | **write** | `job_requisition`, `audit_log` | Open a new hiring requisition. |
| [`list_candidates`](#list_candidates) | read | `candidate` | Applicants with source, pipeline stage, rating and days in pipeline. |
| [`advance_candidate`](#advance_candidate) | **write** | `candidate`, `audit_log` | Move a candidate to a new pipeline stage, for example from screen to interview, or to offer. |
| [`get_recruiting_funnel`](#get_recruiting_funnel) | read | `candidate`, `job_requisition` | Candidate volume by pipeline stage and source, plus open requisition counts, so you can see where the funnel narrows and which channels are producing. |
| [`transfer_employee`](#transfer_employee) | **write** | `employee`, `audit_log` | Move an employee to a different department, location or manager. |
| [`promote_employee`](#promote_employee) | **write** | `employee`, `compensation_event`, `audit_log` | Promote an employee to a higher level, with an optional pay increase. |
| [`record_termination`](#record_termination) | **write** | `employee`, `audit_log` | Record that an employee is leaving the organisation. |
| [`onboard_employee`](#onboard_employee) | **write** | `employee`, `training_record`, `audit_log` | Add a new hire to the roster, with their job, department, location, manager and start date. |
| [`list_benefit_plans`](#list_benefit_plans) | read | `benefit_plan` | Benefit plan catalogue with carrier, tier, employee and employer cost, deductible and enrollment counts. |
| [`get_benefit_enrollments`](#get_benefit_enrollments) | read | `benefit_enrollment` | Which plans an employee is enrolled in, with cost split and effective dates. |
| [`enroll_in_benefit`](#enroll_in_benefit) | **write** | `benefit_enrollment`, `audit_log` | Enroll an employee in a benefit plan. |
| [`list_training_courses`](#list_training_courses) | read | `training_course` | Learning catalogue with category, delivery mode, duration, mandatory flag and renewal cadence. |
| [`get_training_transcript`](#get_training_transcript) | read | `training_record` | An employee's learning history with completion status, scores and certification expiry. |
| [`assign_training`](#assign_training) | **write** | `training_record`, `audit_log` | Assign a course to an employee. |
| [`list_hr_cases`](#list_hr_cases) | read | `hr_case` | Employee-relations matters with type, severity, status, assignment, SLA due date and whether the SLA has been breached. |
| [`get_hr_case`](#get_hr_case) | read | `hr_case`, `hr_case_note` | One case in full, with its chronological notes. |
| [`open_hr_case`](#open_hr_case) | **write** | `hr_case`, `audit_log` | Open an employee-relations case: a conduct concern, grievance, accommodation request, safety report or policy question. |
| [`add_case_note`](#add_case_note) | **write** | `hr_case_note`, `hr_case`, `audit_log` | Record a note against an employee-relations case. |
| [`resolve_hr_case`](#resolve_hr_case) | **write** | `hr_case`, `audit_log` | Move a case forward: investigating, pending review, resolved or closed. |
| [`get_attrition_report`](#get_attrition_report) | read | `employee` | Leavers broken down by reason and whether the departure was voluntary, with attrition rate against the current roster, optionally scoped to a department. |
| [`get_diversity_report`](#get_diversity_report) | read | `employee` | Representation by gender or ethnicity, optionally cut by career level, so you can see how representation changes as seniority increases. |
| [`get_compliance_training_status`](#get_compliance_training_status) | read | `training_record`, `training_course` | Completion state for mandatory compliance training, by course, with the number overdue. |
| [`search_policies`](#search_policies) | read | `policy_document` | Search the HR policy library and return full policy text, so a question about leave, pay, conduct or accommodations can be answered from source rather than paraphrased. |
| [`list_recent_changes`](#list_recent_changes) | read | `audit_log` | Everything any MCP tool has written to this instance, newest first. |
| [`describe_hris_schema`](#describe_hris_schema) | read | `employee`, `compensation_event`, `time_off_request`, `performance_review`, … | The complete data dictionary for this endpoint: every entity, every column with its type and meaning, row counts for this instance, and which tools read or write each one. |
| [`get_instance_info`](#get_instance_info) | read | `employee` | What this endpoint is: the company it represents, its roster size, when it was provisioned, how many writes it has taken, and where to browse or document it. |

### Directory & org

#### search_employees

**Search employees** — read-only

Search the worker directory by name, email, job title or id, with optional filters on department, location, status, employment type, manager, career level, hire date and performance rating. The primary way to find a person before acting on them.

**Touches:** `employee`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `query` | string | no | Free text matched against name, work email, job title and employee id. |
| `department_code` | string | no | Department code, e.g. ENG. See list_departments. |
| `location_code` | string | no | Location code, e.g. US-NYC. See list_locations. |
| `employment_status` | `active` \| `on_leave` \| `terminated` | no | Employment status. |
| `employment_type` | string | no | Employment type, e.g. "Full-time regular". |
| `work_arrangement` | string | no | On-site, Hybrid or Remote. |
| `manager_id` | string | no | Return only the direct reports of this manager, e.g. EMP-0000042. |
| `job_level_min` | integer | no | Minimum career level, 0 (associate) to 10 (CEO). |
| `job_level_max` | integer | no | Maximum career level. |
| `hired_after` | string | no | Only employees hired on or after this date. |
| `hired_before` | string | no | Only employees hired on or before this date. |
| `performance_rating` | integer | no | Exact most-recent performance rating, 1 to 5. |
| `is_people_manager` | boolean | no | Only people managers. |
| `sort` | string | no | Column to sort by. Defaults to employee_id. |
| `direction` | `asc` \| `desc` | no | Sort direction. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### get_employee

**Get employee** — read-only

Full worker record for one employee: identity, contact details, job and level, department, location, reporting line, employment status and dates, demographics and compensation.

**Touches:** `employee`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee id, e.g. EMP-0000042. |

#### list_direct_reports

**List direct reports** — read-only

Everyone who reports directly to a given manager.

**Touches:** `employee`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `manager_id` | string | yes | Manager employee id, e.g. EMP-0000002. |
| `include_terminated` | boolean | no | Include reports who have left. Defaults to false. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### get_reporting_chain

**Get reporting chain** — read-only

The full management chain from an employee up to the CEO, one row per level. Useful for escalation, approval routing and understanding where someone sits in the organisation.

**Touches:** `employee`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee id to walk upward from. |

#### get_org_snapshot

**Get organisation snapshot** — read-only

Shape of the whole organisation: roster size, active headcount, management layers with the population and span of control at each, and the largest departments and locations.

**Touches:** `employee`, `department`, `location`

**Arguments:** none.

#### list_departments

**List departments** — read-only

Department catalogue with headcount, active headcount, average base pay and the most senior leader.

**Touches:** `department`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `function` | string | no | Restrict to one function grouping, e.g. Technology. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### list_locations

**List locations** — read-only

Work locations with country, timezone, currency, cost-of-living index and headcount.

**Touches:** `location`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `country_code` | string | no | ISO 3166-1 alpha-2 country code, e.g. US. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### get_headcount_summary

**Get headcount summary** — read-only

Headcount grouped by any one of department, location, country, career level, employment type, work arrangement or status, with active counts and average base pay per group.

**Touches:** `employee`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `group_by` | `department` \| `location` \| `country` \| `level` \| `employment_type` \| `work_arrangement` \| `status` | no | Dimension to group by. Defaults to department. |
| `department_code` | string | no | Restrict to one department. |
| `location_code` | string | no | Restrict to one location. |

### Compensation

#### get_compensation_detail

**Get compensation detail** — read-only

Current pay for one employee: base salary, currency, bonus target, equity, compa-ratio and where they sit in the pay band for their job and level.

**Touches:** `employee`, `job`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee id. |

#### list_compensation_history

**List compensation history** — read-only

Pay changes over time: merit increases, promotions, market adjustments and retention awards.

**Touches:** `compensation_event`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | no | Restrict to one employee. |
| `event_type` | string | no | Restrict to one kind of change, e.g. Promotion. |
| `effective_after` | string | no | Only changes effective on or after this date. |
| `effective_before` | string | no | Only changes effective on or before this date. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### submit_compensation_change

**Submit compensation change** — writes data

Change an employee's base salary. Records the new amount, the reason and the effective date, and warns if the result falls outside the pay band for their job and level.

**What it changes:** Writes the new base salary onto the employee record in this instance's overlay, appends a compensation event carrying the reason and percentage, and records an audit entry. The shared template is untouched, so no other instance sees the change.

**Touches:** `employee`, `compensation_event`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee whose pay is changing. |
| `new_base_salary` | number | yes | New annual base salary in the employee's pay currency. |
| `reason` | string | yes | Business justification, e.g. "Annual merit cycle" or "Promotion to Senior Manager". |
| `event_type` | `Merit increase` \| `Promotion` \| `Market adjustment` \| `Retention award` \| `Role change` \| `Cost-of-living adjustment` \| `Off-cycle adjustment` \| `Internal transfer adjustment` | no | Kind of change being recorded. |
| `effective_date` | string | no | Date the change takes effect. Defaults to today. |

#### get_pay_band_analysis

**Get pay band analysis** — read-only

Compensation distribution by career level for a department or the whole company: population, minimum, average and maximum base pay, average compa-ratio, and how many people sit outside the 0.85-1.15 compa-ratio range that normally triggers a pay review.

**Touches:** `employee`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `department_code` | string | no | Restrict to one department. |
| `location_code` | string | no | Restrict to one location. |

#### list_payroll_runs

**List payroll runs** — read-only

The payroll calendar: pay periods, pay dates, status and totals.

**Touches:** `payroll_run`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `status` | string | no | Restrict to one run status. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### get_payslips

**Get payslips** — read-only

Payslips for one employee: gross, base and bonus earnings, tax and benefit deductions, and net pay for each pay period. Computed on demand from the employee record and the payroll calendar.

**Touches:** `payslip`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee id. |
| `payroll_run_id` | string | no | Restrict to one payroll run, e.g. RUN-0048. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

### Time off

#### get_time_off_balances

**Get time off balances** — read-only

Accrued, taken, scheduled and available days for every leave type for one employee, derived from tenure, the accrual policy and approved absences.

**Touches:** `time_off_balance`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee id. |
| `leave_type_code` | string | no | Restrict to one leave type, e.g. PTO. |

#### list_time_off_requests

**List time off requests** — read-only

Absence requests filtered by employee, status, leave type or date range.

**Touches:** `time_off_request`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | no | Restrict to one employee. |
| `status` | `pending` \| `approved` \| `denied` \| `cancelled` \| `taken` | no | Request status. |
| `leave_type_code` | string | no | Leave type code, e.g. PTO or SICK. |
| `start_after` | string | no | Absences starting on or after this date. |
| `start_before` | string | no | Absences starting on or before this date. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### submit_time_off_request

**Submit time off request** — writes data

Submit a time off request on behalf of an employee. Validates the dates and warns if the request exceeds the available balance for that leave type.

**What it changes:** Creates a pending absence request in this instance's overlay and records an audit entry. The request immediately appears in list_time_off_requests and counts against the employee's scheduled days once approved.

**Touches:** `time_off_request`, `time_off_balance`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee taking the leave. |
| `leave_type_code` | string | yes | Leave type code, e.g. PTO, SICK, PARENT. See the schema documentation. |
| `start_date` | string | yes | First day of absence. |
| `end_date` | string | yes | Last day of absence. |
| `note` | string | no | Reason or context for the request. |

#### decide_time_off_request

**Approve or deny time off** — writes data

Approve, deny or cancel a pending time off request.

**What it changes:** Sets the request status to approved, denied or cancelled, stamps the decision date and the deciding manager, and records an audit entry.

**Touches:** `time_off_request`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `request_id` | string | yes | Request id, e.g. TOR-0000120-1 or TOR-N-000003. |
| `decision` | `approved` \| `denied` \| `cancelled` | yes | Outcome to record. |
| `decision_note` | string | no | Note explaining the decision. |
| `approver_id` | string | no | Employee id of the approver. Defaults to the employee's manager. |

#### get_absence_summary

**Get absence summary** — read-only

Absence volume by leave type and status across the company or one department, with total days requested. Useful for spotting leave concentration and pending-approval backlogs.

**Touches:** `time_off_request`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `status` | string | no | Restrict to one request status. |

### Performance

#### list_performance_reviews

**List performance reviews** — read-only

Completed reviews with rating, potential, calibration state and promotion readiness.

**Touches:** `performance_review`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | no | Restrict to one employee. |
| `cycle_code` | string | no | Review cycle code, e.g. FY-PRV-EOY. |
| `rating` | integer | no | Exact overall rating, 1 to 5. |
| `promotion_ready` | boolean | no | Only employees flagged ready for promotion. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### get_performance_review

**Get performance review** — read-only

One review in full, including written strengths, growth areas and narrative summary.

**Touches:** `performance_review`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `review_id` | string | yes | Review id, e.g. REV-0000012-0. |

#### submit_performance_review

**Submit performance review** — writes data

Record a performance review for an employee in the current cycle.

**What it changes:** Creates a review record in this instance's overlay, updates the employee's current performance rating, and records an audit entry.

**Touches:** `performance_review`, `employee`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee being reviewed. |
| `rating` | integer | yes | Overall rating, 1 (unsatisfactory) to 5 (outstanding). |
| `summary` | string | yes | Narrative summary of the review. |
| `strengths` | string | no | What the employee does well. |
| `growth_areas` | string | no | Where the employee should develop. |
| `potential` | `Low potential` \| `Moderate potential` \| `High potential` | no | Nine-box potential axis. |
| `promotion_ready` | boolean | no | Whether the employee is ready for the next level. |
| `cycle_code` | string | no | Review cycle. Defaults to the current mid-year cycle. |

#### list_goals

**List goals** — read-only

Individual objectives with weighting, progress and status.

**Touches:** `goal`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | no | Restrict to one employee. |
| `status` | `on_track` \| `at_risk` \| `off_track` \| `achieved` \| `cancelled` | no | Goal status. |
| `category` | string | no | Goal category, e.g. Business results. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### update_goal_progress

**Update goal progress** — writes data

Update how far along a goal is, and optionally its status.

**What it changes:** Writes the new progress and status onto the goal in this instance's overlay and records an audit entry.

**Touches:** `goal`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `goal_id` | string | yes | Goal id, e.g. GOL-0000018-0. |
| `progress_pct` | integer | yes | Percent complete, 0 to 100. |
| `status` | `on_track` \| `at_risk` \| `off_track` \| `achieved` \| `cancelled` | no | New status. |

### Recruiting

#### list_job_requisitions

**List job requisitions** — read-only

Hiring requisitions with status, priority, openings, hiring manager and age.

**Touches:** `job_requisition`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `status` | `draft` \| `open` \| `on_hold` \| `filled` \| `cancelled` | no | Requisition status. |
| `department_code` | string | no | Hiring department code. |
| `location_code` | string | no | Work location code. |
| `priority` | `low` \| `medium` \| `high` \| `critical` | no | Business priority. |
| `hiring_manager_id` | string | no | Restrict to one hiring manager. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### get_job_requisition

**Get job requisition** — read-only

One requisition in full, with its candidate pipeline broken down by stage.

**Touches:** `job_requisition`, `candidate`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `requisition_id` | string | yes | Requisition id, e.g. REQ-000042. |

#### open_job_requisition

**Open job requisition** — writes data

Open a new hiring requisition.

**What it changes:** Creates an open requisition in this instance's overlay with the supplied role, department, location and headcount, and records an audit entry.

**Touches:** `job_requisition`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `job_title` | string | yes | Role being hired. |
| `department_code` | string | yes | Hiring department code, e.g. ENG. |
| `location_code` | string | no | Work location code, e.g. US-NYC. |
| `hiring_manager_id` | string | yes | Hiring manager employee id. |
| `openings` | integer | no | Number of approved openings. Defaults to 1. |
| `job_level` | integer | no | Career level of the opening, 0 to 10. |
| `priority` | `low` \| `medium` \| `high` \| `critical` | no | Business priority. Defaults to medium. |
| `remote_eligible` | boolean | no | Whether the role is open to remote candidates. |

#### list_candidates

**List candidates** — read-only

Applicants with source, pipeline stage, rating and days in pipeline.

**Touches:** `candidate`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `requisition_id` | string | no | Restrict to one requisition. |
| `stage` | `applied` \| `screen` \| `interview` \| `onsite` \| `offer` \| `hired` \| `rejected` \| `withdrawn` | no | Pipeline stage. |
| `source` | string | no | Sourcing channel, e.g. Employee referral. |
| `query` | string | no | Free text across candidate name, email and role. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### advance_candidate

**Advance candidate** — writes data

Move a candidate to a new pipeline stage, for example from screen to interview, or to offer.

**What it changes:** Moves the candidate to the requested stage in this instance's overlay, stamps the activity date, optionally records an interview rating, and records an audit entry.

**Touches:** `candidate`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `candidate_id` | string | yes | Candidate id, e.g. CAND-001234. |
| `stage` | `applied` \| `screen` \| `interview` \| `onsite` \| `offer` \| `hired` \| `rejected` \| `withdrawn` | yes | New pipeline stage. |
| `rating` | integer | no | Interview rating, 1 to 5. |
| `notes` | string | no | Recruiter notes explaining the decision. |

#### get_recruiting_funnel

**Get recruiting funnel** — read-only

Candidate volume by pipeline stage and source, plus open requisition counts, so you can see where the funnel narrows and which channels are producing.

**Touches:** `candidate`, `job_requisition`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `requisition_id` | string | no | Restrict to one requisition. |

### Lifecycle

#### transfer_employee

**Transfer employee** — writes data

Move an employee to a different department, location or manager.

**What it changes:** Writes the new department, location and/or manager onto the employee record in this instance's overlay and records an audit entry. Reporting lines below the employee are unchanged; their reports move with them.

**Touches:** `employee`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee being transferred. |
| `new_department_name` | string | no | New department name. |
| `new_location_code` | string | no | New work location code, e.g. UK-LON. |
| `new_manager_id` | string | no | New manager employee id. |
| `effective_date` | string | no | Date the transfer takes effect. Defaults to today. |
| `reason` | string | no | Reason for the transfer. |

#### promote_employee

**Promote employee** — writes data

Promote an employee to a higher level, with an optional pay increase.

**What it changes:** Raises the employee's career level and title, optionally applies a new salary, writes a promotion compensation event, and records an audit entry.

**Touches:** `employee`, `compensation_event`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee being promoted. |
| `new_job_title` | string | yes | New job title. |
| `new_job_level` | integer | no | New career level, 0 to 10. Must be above the current level. |
| `new_base_salary` | number | no | New annual base salary. Optional. |
| `effective_date` | string | no | Date the promotion takes effect. Defaults to today. |
| `reason` | string | no | Justification for the promotion. |

#### record_termination

**Record termination** — writes data

Record that an employee is leaving the organisation.

**What it changes:** Marks the employee terminated with a last working day and reason in this instance's overlay, and records an audit entry. They stop counting toward active headcount but remain in the roster for reporting.

**Touches:** `employee`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Departing employee. |
| `termination_date` | string | yes | Last working day. |
| `reason` | string | yes | Reason for leaving, e.g. "Resignation - better opportunity". |
| `voluntary` | boolean | no | Whether the employee chose to leave. Defaults to true. |

#### onboard_employee

**Onboard employee** — writes data

Add a new hire to the roster, with their job, department, location, manager and start date. Mandatory onboarding training is assigned automatically.

**What it changes:** Creates a new employee record in this instance's overlay, assigns the mandatory onboarding courses, and records an audit entry. The new record is visible to every subsequent read on this endpoint and to no other instance.

**Touches:** `employee`, `training_record`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `full_name` | string | yes | New hire full name. |
| `job_title` | string | yes | Job title. |
| `department_name` | string | no | Department name. |
| `location_code` | string | no | Work location code, e.g. US-AUS. |
| `manager_id` | string | yes | Manager employee id. |
| `hire_date` | string | no | Start date. Defaults to today. |
| `base_salary` | number | no | Annual base salary. |
| `job_level` | integer | no | Career level, 0 to 10. |
| `employment_type` | string | no | Employment type. Defaults to "Full-time regular". |
| `work_arrangement` | string | no | On-site, Hybrid or Remote. |

### Benefits & learning

#### list_benefit_plans

**List benefit plans** — read-only

Benefit plan catalogue with carrier, tier, employee and employer cost, deductible and enrollment counts.

**Touches:** `benefit_plan`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `category` | string | no | Benefit category, e.g. Medical. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### get_benefit_enrollments

**Get benefit enrollments** — read-only

Which plans an employee is enrolled in, with cost split and effective dates.

**Touches:** `benefit_enrollment`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | no | Restrict to one employee. |
| `plan_code` | string | no | Restrict to one plan. |
| `category` | string | no | Restrict to one benefit category. |
| `status` | `active` \| `waived` \| `terminated` \| `pending` | no | Enrollment status. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### enroll_in_benefit

**Enroll in benefit** — writes data

Enroll an employee in a benefit plan.

**What it changes:** Creates an active enrollment in this instance's overlay with the plan's cost split, and records an audit entry.

**Touches:** `benefit_enrollment`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee enrolling. |
| `plan_code` | string | yes | Plan code, e.g. MED-PPO-EE. See list_benefit_plans. |
| `dependents` | integer | no | Number of covered dependents. |
| `effective_date` | string | no | Coverage start date. Defaults to today. |

#### list_training_courses

**List training courses** — read-only

Learning catalogue with category, delivery mode, duration, mandatory flag and renewal cadence.

**Touches:** `training_course`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `category` | string | no | Course category, e.g. Compliance. |
| `is_mandatory` | boolean | no | Only mandatory courses. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### get_training_transcript

**Get training transcript** — read-only

An employee's learning history with completion status, scores and certification expiry.

**Touches:** `training_record`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | no | Restrict to one employee. |
| `status` | `completed` \| `in_progress` \| `not_started` \| `overdue` | no | Completion status. |
| `course_code` | string | no | Restrict to one course. |
| `is_mandatory` | boolean | no | Only mandatory training. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### assign_training

**Assign training** — writes data

Assign a course to an employee.

**What it changes:** Creates a not-started training record in this instance's overlay and records an audit entry.

**Touches:** `training_record`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `employee_id` | string | yes | Employee to assign the course to. |
| `course_code` | string | yes | Course code, e.g. CMP-110. See list_training_courses. |
| `due_date` | string | no | When the course must be completed by. |

### Employee relations

#### list_hr_cases

**List HR cases** — read-only

Employee-relations matters with type, severity, status, assignment, SLA due date and whether the SLA has been breached.

**Touches:** `hr_case`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `subject_employee_id` | string | no | Cases concerning one employee. |
| `status` | `open` \| `investigating` \| `pending_review` \| `resolved` \| `closed` | no | Case status. |
| `severity` | `low` \| `medium` \| `high` \| `critical` | no | Assessed severity. |
| `case_type_code` | string | no | Case type code, e.g. HARASS or ACCOM. |
| `opened_after` | string | no | Cases opened on or after this date. |
| `sla_breached` | boolean | no | Only cases past their SLA. |
| `query` | string | no | Free text across case summary and id. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### get_hr_case

**Get HR case** — read-only

One case in full, with its chronological notes.

**Touches:** `hr_case`, `hr_case_note`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `case_id` | string | yes | Case id, e.g. CASE-0000097-0. |
| `include_internal_notes` | boolean | no | Include notes marked HR-only. Defaults to true. |

#### open_hr_case

**Open HR case** — writes data

Open an employee-relations case: a conduct concern, grievance, accommodation request, safety report or policy question.

**What it changes:** Creates an open case in this instance's overlay with an SLA due date derived from the case type, and records an audit entry.

**Touches:** `hr_case`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `case_type_code` | string | yes | Case type code, e.g. CONDUCT, ACCOM, SAFETY, GRIEV. |
| `summary` | string | yes | What the case is about. |
| `subject_employee_id` | string | no | Employee the case concerns. Omit for an anonymous report. |
| `severity` | `low` \| `medium` \| `high` \| `critical` | no | Assessed severity. Defaults to the type default. |
| `assigned_to_id` | string | no | HR partner to assign the case to. |
| `anonymous` | boolean | no | Whether the report was made anonymously. |

#### add_case_note

**Add case note** — writes data

Record a note against an employee-relations case.

**What it changes:** Appends a note to the case in this instance's overlay, increments the case note count, and records an audit entry.

**Touches:** `hr_case_note`, `hr_case`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `case_id` | string | yes | Case id. |
| `body` | string | yes | Note text. |
| `author_id` | string | no | Employee id of the author. |
| `internal` | boolean | no | Mark the note HR-only. Defaults to true. |

#### resolve_hr_case

**Resolve HR case** — writes data

Move a case forward: investigating, pending review, resolved or closed.

**What it changes:** Sets the case status and resolution, stamps the closed date when closing, and records an audit entry.

**Touches:** `hr_case`, `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `case_id` | string | yes | Case id. |
| `status` | `open` \| `investigating` \| `pending_review` \| `resolved` \| `closed` | yes | New case status. |
| `resolution` | string | no | Outcome and any corrective action taken. |

### Analytics

#### get_attrition_report

**Get attrition report** — read-only

Leavers broken down by reason and whether the departure was voluntary, with attrition rate against the current roster, optionally scoped to a department.

**Touches:** `employee`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `department_code` | string | no | Restrict to one department. |

#### get_diversity_report

**Get diversity report** — read-only

Representation by gender or ethnicity, optionally cut by career level, so you can see how representation changes as seniority increases. Mock data only.

**Touches:** `employee`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `dimension` | `gender` \| `ethnicity` | no | Dimension to report on. Defaults to gender. |
| `by_level` | boolean | no | Break the result down by career level as well. |
| `department_code` | string | no | Restrict to one department. |

#### get_compliance_training_status

**Get compliance training status** — read-only

Completion state for mandatory compliance training, by course, with the number overdue. The report an auditor asks for.

**Touches:** `training_record`, `training_course`

**Arguments:** none.

#### search_policies

**Search HR policies** — read-only

Search the HR policy library and return full policy text, so a question about leave, pay, conduct or accommodations can be answered from source rather than paraphrased.

**Touches:** `policy_document`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `query` | string | no | Free text matched against policy title, summary and body. |
| `category` | string | no | Policy category, e.g. Time off. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

#### list_recent_changes

**List recent changes** — read-only

Everything any MCP tool has written to this instance, newest first. A freshly provisioned endpoint has exactly one entry: its own creation.

**Touches:** `audit_log`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `entity` | string | no | Restrict to one entity, e.g. employee. |
| `entity_id` | string | no | Restrict to one record. |
| `tool` | string | no | Restrict to one tool name. |
| `limit` | integer | no | Maximum rows to return. Default 25, maximum 200. |
| `offset` | integer | no | Rows to skip, for paging through a large result. |

### Reference

#### describe_hris_schema

**Describe HRIS schema** — read-only

The complete data dictionary for this endpoint: every entity, every column with its type and meaning, row counts for this instance, and which tools read or write each one. Call this first to understand what is available before querying.

**Touches:** `employee`, `compensation_event`, `time_off_request`, `performance_review`, `goal`, `benefit_enrollment`, `training_record`, `hr_case`, `hr_case_note`, `job_requisition`, `candidate`, `payslip`, `time_off_balance`, `audit_log`, `department`, `location`, `job`, `benefit_plan`, `training_course`, `policy_document`, `payroll_run`

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `entity` | string | no | Describe one entity in full. Omit for the whole schema summary. |

#### get_instance_info

**Get instance info** — read-only

What this endpoint is: the company it represents, its roster size, when it was provisioned, how many writes it has taken, and where to browse or document it.

**Touches:** `employee`

**Arguments:** none.

## Connecting

Add this endpoint as a custom MCP connector. No token, header or sign-in is required.

```
https://hr-safe-space.cheek.org/i/ember-pier-3541/mcp
```

Claude Code:

```bash
claude mcp add --transport http ember-pier-3541 https://hr-safe-space.cheek.org/i/ember-pier-3541/mcp
```

Any MCP client that speaks Streamable HTTP, as JSON configuration:

```json
{
  "mcpServers": {
    "ember-pier-3541": {
      "type": "http",
      "url": "https://hr-safe-space.cheek.org/i/ember-pier-3541/mcp"
    }
  }
}
```

Pick any new key to get a different company:

```
https://hr-safe-space.cheek.org/i/<your-key>/mcp
```

Valid keys are 4–64 characters of lowercase letters, digits and single hyphens.
