HR Safe Space

How it works

Every endpoint key owns a complete, isolated HRIS. There is no authentication because the key is the tenant, and there is nothing real behind it.

Per-endpoint documentation lives on the endpoint. This page describes the architecture. For the actual data dictionary of a specific company — every table, column, type and row count — open https://hr-safe-space.cheek.org/i/<key>/docs.

The addressing model

An endpoint is /i/<key>/mcp where the key is 4–64 characters of lowercase letters, digits and single hyphens. The first request to a key provisions it. Every request afterwards resolves the same company: the same name, the same roster size, the same people.

Because the key selects the dataset and nothing else does, an unshared key behaves like an unlisted URL. Keys are not secrets and the records behind them are synthetic, so nothing is protected by obscurity that would matter if it were not.

One template, many companies

Copying 50,000425,000 employee rows per instance would mean millions of rows per tenant and billions across a few thousand tenants. No single Postgres survives that, so the roster is not copied.

A master template holds the worker records once. An instance is a deterministic projection over a prefix of that template, re-parameterised by its own row: a different company name and domain, a different roster size, a different department and location mix, a different pay multiplier, a different date offset, and rotated name pools so the same template row surfaces as a different person.

The reporting tree is pure arithmetic on a worker’s position in the roster, which is what makes a prefix safe to take: a manager’s position is always lower than their reports’, so truncating the roster never orphans anyone.

Provisioning is one INSERT. A 425,000-person company appears in milliseconds and occupies one row until something is written to it.

Writes are copy-on-write

16 of the 52 tools change data. Each writes a diff — a patch, a new row, or a tombstone — into that instance’s private overlay. Reads merge the overlay over the projection: tombstones removed, patches applied, created rows unioned in.

The shared template is immutable at runtime. A write through one key is structurally incapable of appearing under another, and every write lands in that instance’s audit log.

Every call is logged, not just the writes

The audit log answers “what is different now”. It cannot answer “what did my agent do”, because an agent that reads twenty tables and writes nothing leaves no trace in it. So every JSON-RPC message an endpoint receives is recorded separately: the method, the tool, the arguments it was called with, whether it wrote, whether it failed, and how long it took.

That log is at /i/<key>/activity, newest first. It is written by the server rather than by whatever is driving the agent, which makes it an independent account of a run: a figure in an agent’s output with no call behind it here did not come from the data. It keeps the most recent 1,000 calls per key; writes are also in the audit log, which is never pruned and is readable back through list_recent_changes.

What is in the schema

21 entities covering the HRIS surface: worker records and the org chart, compensation and its history, payroll and payslips, time off and balances, performance reviews and goals, benefits, learning and compliance training, recruiting requisitions and candidates, and employee-relations cases with their notes.

EntityOriginWritableDescription
employeetemplate projectionyesThe worker record.
compensation_eventtemplate projectionyesHistorical pay changes: merit increases, promotions, market adjustments and retention awards.
time_off_requesttemplate projectionyesAbsence requests across every leave type, from submitted through approved, denied or taken.
performance_reviewtemplate projectionyesCompleted review-cycle records with rating, potential, calibration state and written feedback.
goaltemplate projectionyesIndividual objectives with weighting, progress and status.
benefit_enrollmenttemplate projectionyesWhich employees are enrolled in which benefit plans, with employee and employer cost.
training_recordtemplate projectionyesAssigned and completed learning, including mandatory compliance training and its renewal state.
hr_casetemplate projectionyesEmployee-relations matters: conduct concerns, grievances, accommodation requests, safety reports and ethics-hotline intake, with severity, SLA and assignment.
hr_case_notetemplate projectionyesChronological notes recorded against an employee-relations case.
job_requisitiontemplate projectionyesOpen and historical hiring requisitions with hiring manager, recruiter, target and fill state.
candidatetemplate projectionyesApplicants against requisitions, with source, pipeline stage, rating and expected compensation.
payslipderivednoPer-period earnings, taxes and deductions.
time_off_balancederivednoAccrued, taken and available leave per employee per leave type.
audit_logoverlaynoEvery write any MCP tool has performed against this instance, in order.
departmentreferencenoDepartment catalogue.
locationreferencenoWork locations with timezone, currency and cost-of-living index.
jobreferencenoJob catalogue: every department and level combination with its title, FLSA status and pay band.
benefit_planreferencenoBenefit plan catalogue with carrier, tier, cost split, deductible and eligibility waiting period.
training_coursereferencenoLearning catalogue, including which courses are mandatory and how often they must be renewed.
policy_documentreferencenoHR policy library.
payroll_runtemplate projectionnoThe payroll calendar: two years of semi-monthly periods with status and totals.

The tool surface

Directory & org

ToolKindPurpose
search_employeesreadSearch 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_employeereadFull worker record for one employee: identity, contact details, job and level, department, location, reporting line, employment status and dates, demographics and compensation.
list_direct_reportsreadEveryone who reports directly to a given manager.
get_reporting_chainreadThe full management chain from an employee up to the CEO, one row per level.
get_org_snapshotreadShape 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_departmentsreadDepartment catalogue with headcount, active headcount, average base pay and the most senior leader.
list_locationsreadWork locations with country, timezone, currency, cost-of-living index and headcount.
get_headcount_summaryreadHeadcount 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.

Compensation

ToolKindPurpose
get_compensation_detailreadCurrent 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_historyreadPay changes over time: merit increases, promotions, market adjustments and retention awards.
submit_compensation_changewriteChange an employee's base salary.
get_pay_band_analysisreadCompensation 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_runsreadThe payroll calendar: pay periods, pay dates, status and totals.
get_payslipsreadPayslips for one employee: gross, base and bonus earnings, tax and benefit deductions, and net pay for each pay period.

Time off

ToolKindPurpose
get_time_off_balancesreadAccrued, taken, scheduled and available days for every leave type for one employee, derived from tenure, the accrual policy and approved absences.
list_time_off_requestsreadAbsence requests filtered by employee, status, leave type or date range.
submit_time_off_requestwriteSubmit a time off request on behalf of an employee.
decide_time_off_requestwriteApprove, deny or cancel a pending time off request.
get_absence_summaryreadAbsence volume by leave type and status across the company or one department, with total days requested.

Performance

ToolKindPurpose
list_performance_reviewsreadCompleted reviews with rating, potential, calibration state and promotion readiness.
get_performance_reviewreadOne review in full, including written strengths, growth areas and narrative summary.
submit_performance_reviewwriteRecord a performance review for an employee in the current cycle.
list_goalsreadIndividual objectives with weighting, progress and status.
update_goal_progresswriteUpdate how far along a goal is, and optionally its status.

Recruiting

ToolKindPurpose
list_job_requisitionsreadHiring requisitions with status, priority, openings, hiring manager and age.
get_job_requisitionreadOne requisition in full, with its candidate pipeline broken down by stage.
open_job_requisitionwriteOpen a new hiring requisition.
list_candidatesreadApplicants with source, pipeline stage, rating and days in pipeline.
advance_candidatewriteMove a candidate to a new pipeline stage, for example from screen to interview, or to offer.
get_recruiting_funnelreadCandidate volume by pipeline stage and source, plus open requisition counts, so you can see where the funnel narrows and which channels are producing.

Lifecycle

ToolKindPurpose
transfer_employeewriteMove an employee to a different department, location or manager.
promote_employeewritePromote an employee to a higher level, with an optional pay increase.
record_terminationwriteRecord that an employee is leaving the organisation.
onboard_employeewriteAdd a new hire to the roster, with their job, department, location, manager and start date.

Benefits & learning

ToolKindPurpose
list_benefit_plansreadBenefit plan catalogue with carrier, tier, employee and employer cost, deductible and enrollment counts.
get_benefit_enrollmentsreadWhich plans an employee is enrolled in, with cost split and effective dates.
enroll_in_benefitwriteEnroll an employee in a benefit plan.
list_training_coursesreadLearning catalogue with category, delivery mode, duration, mandatory flag and renewal cadence.
get_training_transcriptreadAn employee's learning history with completion status, scores and certification expiry.
assign_trainingwriteAssign a course to an employee.

Employee relations

ToolKindPurpose
list_hr_casesreadEmployee-relations matters with type, severity, status, assignment, SLA due date and whether the SLA has been breached.
get_hr_casereadOne case in full, with its chronological notes.
open_hr_casewriteOpen an employee-relations case: a conduct concern, grievance, accommodation request, safety report or policy question.
add_case_notewriteRecord a note against an employee-relations case.
resolve_hr_casewriteMove a case forward: investigating, pending review, resolved or closed.

Analytics

ToolKindPurpose
get_attrition_reportreadLeavers broken down by reason and whether the departure was voluntary, with attrition rate against the current roster, optionally scoped to a department.
get_diversity_reportreadRepresentation by gender or ethnicity, optionally cut by career level, so you can see how representation changes as seniority increases.
get_compliance_training_statusreadCompletion state for mandatory compliance training, by course, with the number overdue.
search_policiesreadSearch 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_changesreadEverything any MCP tool has written to this instance, newest first.

Reference

ToolKindPurpose
describe_hris_schemareadThe 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_inforeadWhat 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.

Connecting

claude mcp add --transport http acme https://hr-safe-space.cheek.org/i/acme-demo-4821/mcp

Or as JSON, for any client that speaks Streamable HTTP:

{
  "mcpServers": {
    "acme": {
      "type": "http",
      "url": "https://hr-safe-space.cheek.org/i/acme-demo-4821/mcp"
    }
  }
}

Limits worth knowing

How it works — HR Safe Space