# MCP FactorialHR (npm · @t4dhg/mcp-factorial)

Full CRUD MCP server for FactorialHR: employees, teams, time off, projects, ATS, payroll.

- Trust score: 88/100 (high trust)
- Change this week: +8
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-11

## Components

- npm · `@t4dhg/mcp-factorial`: 88/100 (this document), [markdown](https://verifymcp.io/servers/t4dhg-mcp-factorial/t4dhg-mcp-factorial.md), [page](https://verifymcp.io/servers/t4dhg-mcp-factorial/t4dhg-mcp-factorial)

## Channel facts

- Registry: `npm`
- Package: `@t4dhg/mcp-factorial`
- Version: `7.1.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-11.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 30 of 97 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 96/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to t4dhg/mcp-factorial).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 227 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 82/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 5281 tokens (~52/item across 101 items; 101 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 50/100
  - Stability observed for 15 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add t4dhg-mcp-factorial -- npx -y @t4dhg/mcp-factorial
```

### Codex

```bash
codex mcp add t4dhg-mcp-factorial -- npx -y @t4dhg/mcp-factorial
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "t4dhg-mcp-factorial": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@t4dhg/mcp-factorial"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add t4dhg-mcp-factorial --command npx --arg -y --arg @t4dhg/mcp-factorial
```

### Hermes

```yaml
mcp_servers:
  t4dhg-mcp-factorial:
    command: "npx"
    args: ["-y", "@t4dhg/mcp-factorial"]
```

### Other

```json
{
  "mcpServers": {
    "t4dhg-mcp-factorial": {
      "command": "npx",
      "args": [
        "-y",
        "@t4dhg/mcp-factorial"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-11 (score 88, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-08-10 (score 88, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-08 (score 87, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-07 (score 86, +4)

- [security improvement] Known CVEs: partial → pass
- [functional] Dependency health: partial → 0.86

### 2026-08-05 (score 82, +2)

- [security improvement] CVE-2026-69207 no longer affects this package
- [security improvement] Known CVEs: fail → partial

### 2026-08-04 (score 80, +3)

- [security regression] CVE-2026-69207 affects this package: medium
- [security regression] Known CVEs: partial → fail
- [functional improvement] Stability: unverified → 0.27

### 2026-08-03 (score 77, +36)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [security] The attested source repository moved: t4dhg/mcp-factorial
- [functional improvement] License: unverified → pass
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional] Licence: MIT

### 2026-08-02 (score 41, +15)

- [security improvement] Malware scan: unverified → pass

## MCP tools (101)

### `list_employees` (~79 tokens)

List Employees

Get employees from FactorialHR. Can filter by team or location. Supports pagination.

Input parameters:

- `limit` (number): Items per page (max: 100)
- `location_id` (number): Filter by location ID
- `page` (number): Page number (default: 1)
- `team_id` (number): Filter by team ID

### `get_employee` (~29 tokens)

Get Employee

Get detailed information about a specific employee by their ID.

Input parameters:

- `id` (number, required): The employee ID

### `search_employees` (~30 tokens)

Search Employees

Search for employees by name or email.

Input parameters:

- `query` (string, required): Search query (name or email)

### `create_employee` (~147 tokens)

Create Employee

Create a new employee in FactorialHR.

Input parameters:

- `birthday_on` (string): Birthday (YYYY-MM-DD)
- `email` (string, required): Email address
- `first_name` (string, required): First name
- `gender` (string): Gender
- `hired_on` (string): Hire date (YYYY-MM-DD)
- `last_name` (string, required): Last name
- `location_id` (number): Location ID
- `manager_id` (number): Manager employee ID
- `nationality` (string): Nationality
- `role` (string): Job role/title
- `start_date` (string): Start date (YYYY-MM-DD)
- `team_ids` (array): Team IDs to assign

### `update_employee` (~159 tokens)

Update Employee

Update an existing employee in FactorialHR.

Input parameters:

- `birthday_on` (string): Birthday (YYYY-MM-DD)
- `email` (string): Email address
- `first_name` (string): First name
- `gender` (string): Gender
- `hired_on` (string): Hire date (YYYY-MM-DD)
- `id` (number, required): The employee ID to update
- `last_name` (string): Last name
- `location_id` (number): Location ID
- `manager_id` (number): Manager employee ID
- `nationality` (string): Nationality
- `role` (string): Job role/title
- `start_date` (string): Start date (YYYY-MM-DD)
- `team_ids` (array): Team IDs to assign

### `terminate_employee` (~80 tokens)

Terminate Employee

Terminate an employee (soft delete). This is a HIGH-RISK operation that requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this high-risk operation
- `id` (number, required): The employee ID to terminate
- `reason` (string): Termination reason
- `terminated_on` (string, required): Termination date (YYYY-MM-DD)

### `list_teams` (~38 tokens)

List Teams

Get all teams in the organization. Supports pagination.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number

### `get_team` (~29 tokens)

Get Team

Get detailed information about a specific team by its ID.

Input parameters:

- `id` (number, required): The team ID

### `create_team` (~58 tokens)

Create Team

Create a new team in the organization.

Input parameters:

- `description` (string): Team description
- `employee_ids` (array): Team member employee IDs
- `lead_ids` (array): Team lead employee IDs
- `name` (string, required): Team name

### `update_team` (~67 tokens)

Update Team

Update an existing team.

Input parameters:

- `description` (string): Team description
- `employee_ids` (array): Team member employee IDs
- `id` (number, required): The team ID to update
- `lead_ids` (array): Team lead employee IDs
- `name` (string): Team name

### `delete_team` (~51 tokens)

Delete Team

Delete a team. This is a HIGH-RISK operation that requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this high-risk operation
- `id` (number, required): The team ID to delete

### `list_locations` (~35 tokens)

List Locations

Get all company locations. Supports pagination.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number

### `get_location` (~29 tokens)

Get Location

Get detailed information about a specific location by its ID.

Input parameters:

- `id` (number, required): The location ID

### `create_location` (~99 tokens)

Create Location

Create a new company location.

Input parameters:

- `address_line_1` (string): Address line 1
- `address_line_2` (string): Address line 2
- `city` (string): City
- `country` (string): Country
- `name` (string, required): Location name
- `phone_number` (string): Phone number
- `postal_code` (string): Postal/ZIP code
- `state` (string): State/Province

### `update_location` (~110 tokens)

Update Location

Update an existing location.

Input parameters:

- `address_line_1` (string): Address line 1
- `address_line_2` (string): Address line 2
- `city` (string): City
- `country` (string): Country
- `id` (number, required): The location ID to update
- `name` (string): Location name
- `phone_number` (string): Phone number
- `postal_code` (string): Postal/ZIP code
- `state` (string): State/Province

### `delete_location` (~51 tokens)

Delete Location

Delete a location. This is a HIGH-RISK operation that requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this high-risk operation
- `id` (number, required): The location ID to delete

### `get_employee_contracts` (~72 tokens)

Get Employee Contracts

Get contract versions for an employee. Returns contract summary (id, employee_id, job_title, effective_on).

Input parameters:

- `employee_id` (number, required): The employee ID
- `limit` (number): Items per page (max: 100, default: 20)
- `page` (number): Page number

### `get_employee_with_contract` (~62 tokens)

Get Employee with Contract

Get an employee with their latest contract data including salary, job title, and job role. This combines employee data with compensation info from their most recent contract. Useful for getting complete employment details in one call.

Input parameters:

- `employee_id` (number, required): The employee ID

### `list_employees_by_job_role` (~88 tokens)

List Employees by Job Role

Get all employees assigned to a specific job role. Uses contract data to find employees since job role assignment is stored in contracts. Returns employees with their latest contract including salary and compensation.

Input parameters:

- `job_role_id` (number, required): The job role ID from job_catalog
- `limit` (number): Items per page (max: 100)
- `page` (number): Page number

### `list_employees_by_job_level` (~86 tokens)

List Employees by Job Level

Get all employees at a specific job level. Uses contract data to find employees since job level is stored in contracts. Returns employees with their latest contract including salary and compensation.

Input parameters:

- `job_level_id` (number, required): The job level ID from job_catalog
- `limit` (number): Items per page (max: 100)
- `page` (number): Page number

### `list_leaves` (~120 tokens)

List Leaves

Get time off/leave requests. Filter by employee, status, or date range. Supports pagination.

Input parameters:

- `employee_id` (number): Filter by employee ID
- `limit` (number): Items per page (max: 100)
- `page` (number): Page number
- `start_on_gte` (string): Filter leaves starting on or after this date (YYYY-MM-DD)
- `start_on_lte` (string): Filter leaves starting on or before this date (YYYY-MM-DD)
- `status` (string): Filter by leave status

### `get_leave` (~27 tokens)

Get Leave Details

Get detailed information about a specific leave request.

Input parameters:

- `id` (number, required): The leave ID

### `list_leave_types` (~27 tokens)

List Leave Types

Get all leave types (vacation, sick leave, etc.) configured in the organization.

### `get_leave_type` (~28 tokens)

Get Leave Type

Get details about a specific leave type.

Input parameters:

- `id` (number, required): The leave type ID

### `list_allowances` (~64 tokens)

List Time Off Allowances

Get time off balances/allowances for employees. Shows available, consumed, and total days.

Input parameters:

- `employee_id` (number): Filter by employee ID
- `limit` (number): Items per page (max: 100)
- `page` (number): Page number

### `create_leave` (~91 tokens)

Create Leave Request

Create a new time off/leave request for an employee.

Input parameters:

- `description` (string): Description/reason
- `employee_id` (number, required): Employee ID
- `finish_on` (string, required): End date (YYYY-MM-DD)
- `half_day` (string): Half day option
- `leave_type_id` (number, required): Leave type ID
- `start_on` (string, required): Start date (YYYY-MM-DD)

### `update_leave` (~87 tokens)

Update Leave Request

Update an existing leave request.

Input parameters:

- `description` (string): Description/reason
- `finish_on` (string): End date (YYYY-MM-DD)
- `half_day` (string): Half day option
- `id` (number, required): The leave ID to update
- `leave_type_id` (number): Leave type ID
- `start_on` (string): Start date (YYYY-MM-DD)

### `cancel_leave` (~44 tokens)

Cancel Leave Request

Cancel a leave request. This operation requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this operation
- `id` (number, required): The leave ID to cancel

### `approve_leave` (~36 tokens)

Approve Leave Request

Approve a pending leave request.

Input parameters:

- `id` (number, required): The leave ID to approve
- `reason` (string): Approval comment

### `reject_leave` (~55 tokens)

Reject Leave Request

Reject a pending leave request. This operation requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this operation
- `id` (number, required): The leave ID to reject
- `reason` (string): Rejection reason

### `list_shifts` (~107 tokens)

List Shifts

Get employee attendance shifts. Filter by employee or date range. Read-only access.

Input parameters:

- `clock_in_gte` (string): Filter shifts clocking in after this time (ISO 8601)
- `clock_in_lte` (string): Filter shifts clocking in before this time (ISO 8601)
- `employee_id` (number): Filter by employee ID
- `limit` (number): Items per page (max: 100)
- `page` (number): Page number

### `get_shift` (~26 tokens)

Get Shift Details

Get detailed information about a specific shift.

Input parameters:

- `id` (number, required): The shift ID

### `create_shift` (~90 tokens)

Create Shift

Create a new attendance shift (clock in/out record).

Input parameters:

- `break_minutes` (number): Break duration in minutes
- `clock_in` (string, required): Clock in time (ISO 8601)
- `clock_out` (string): Clock out time (ISO 8601)
- `employee_id` (number, required): Employee ID
- `location` (string): Work location
- `notes` (string): Notes

### `update_shift` (~86 tokens)

Update Shift

Update an existing shift.

Input parameters:

- `break_minutes` (number): Break duration in minutes
- `clock_in` (string): Clock in time (ISO 8601)
- `clock_out` (string): Clock out time (ISO 8601)
- `id` (number, required): The shift ID to update
- `location` (string): Work location
- `notes` (string): Notes

### `delete_shift` (~44 tokens)

Delete Shift

Delete a shift record. This operation requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this operation
- `id` (number, required): The shift ID to delete

### `list_folders` (~18 tokens)

List Folders

Get all document folders. Read-only access.

### `get_folder` (~25 tokens)

Get Folder

Get details about a specific folder.

Input parameters:

- `id` (number, required): The folder ID

### `list_documents` (~75 tokens)

List Documents

Get documents with folder and employee name enrichment. Filter by folder or employee. Read-only access.

Input parameters:

- `employee_ids` (array): Filter by employee IDs
- `folder_id` (number): Filter by folder ID
- `limit` (number): Items per page (max: 100)
- `page` (number): Page number

### `get_document` (~28 tokens)

Get Document

Get document metadata and URL. Read-only access.

Input parameters:

- `id` (number, required): The document ID

### `get_employee_documents` (~72 tokens)

Get Employee Documents

Get all documents for a specific employee. Returns document summary with folder_name enrichment. Use get_document for full details.

Input parameters:

- `employee_id` (number, required): The employee ID
- `limit` (number): Items per page (max: 100, default: 20)
- `page` (number): Page number

### `search_employee_documents` (~112 tokens)

Search Employee Documents

Search documents by employee name and optional document name pattern. Example: search for "Taig's resume" or "certifications for Saray".

Input parameters:

- `document_query` (string): Document name pattern to filter by (e.g., "resume", "certification")
- `employee_name` (string, required): Employee name to search for (partial match, min 2 chars)
- `limit` (number): Items per page (max: 100, default: 20)
- `page` (number): Page number

### `list_job_roles` (~19 tokens)

List Job Roles

Get all job roles defined in the job catalog.

### `get_job_role` (~28 tokens)

Get Job Role

Get details about a specific job role.

Input parameters:

- `id` (number, required): The job role ID

### `list_job_levels` (~19 tokens)

List Job Levels

Get all job levels defined in the job catalog.

### `list_projects` (~34 tokens)

List Projects

Get all projects. Supports pagination.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number

### `get_project` (~26 tokens)

Get Project

Get detailed information about a specific project.

Input parameters:

- `id` (number, required): The project ID

### `create_project` (~49 tokens)

Create Project

Create a new project.

Input parameters:

- `code` (string): Project code
- `description` (string): Description
- `employees_assignment` (string): Assignment mode
- `name` (string, required): Project name

### `update_project` (~57 tokens)

Update Project

Update an existing project.

Input parameters:

- `code` (string): Project code
- `description` (string): Description
- `id` (number, required): The project ID
- `name` (string): Project name
- `status` (string): Status

### `delete_project` (~51 tokens)

Delete Project

Delete a project. This is a HIGH-RISK operation that requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this high-risk operation
- `id` (number, required): The project ID to delete

### `list_project_tasks` (~46 tokens)

List Project Tasks

Get tasks for a project.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number
- `project_id` (number): Filter by project ID

### `create_project_task` (~58 tokens)

Create Project Task

Create a new task for a project.

Input parameters:

- `description` (string): Description
- `due_on` (string): Due date (YYYY-MM-DD)
- `name` (string, required): Task name
- `project_id` (number, required): Project ID

### `update_project_task` (~65 tokens)

Update Project Task

Update a project task.

Input parameters:

- `completed` (boolean): Mark as completed
- `description` (string): Description
- `due_on` (string): Due date (YYYY-MM-DD)
- `id` (number, required): The task ID
- `name` (string): Task name

### `delete_project_task` (~26 tokens)

Delete Project Task

Delete a project task.

Input parameters:

- `id` (number, required): The task ID to delete

### `list_project_workers` (~46 tokens)

List Project Workers

Get workers assigned to projects.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number
- `project_id` (number): Filter by project ID

### `assign_project_worker` (~36 tokens)

Assign Project Worker

Assign an employee to a project.

Input parameters:

- `employee_id` (number, required): Employee ID
- `project_id` (number, required): Project ID

### `remove_project_worker` (~29 tokens)

Remove Project Worker

Remove an employee from a project.

Input parameters:

- `id` (number, required): The project worker ID to remove

### `list_time_records` (~49 tokens)

List Time Records

Get time records for project workers.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number
- `project_worker_id` (number): Filter by project worker ID

### `create_time_record` (~57 tokens)

Create Time Record

Log time for a project worker.

Input parameters:

- `date` (string, required): Date (YYYY-MM-DD)
- `description` (string): Description
- `minutes` (number, required): Minutes worked
- `project_worker_id` (number, required): Project worker ID

### `update_time_record` (~53 tokens)

Update Time Record

Update a time record.

Input parameters:

- `date` (string): Date (YYYY-MM-DD)
- `description` (string): Description
- `id` (number, required): Time record ID
- `minutes` (number): Minutes worked

### `delete_time_record` (~26 tokens)

Delete Time Record

Delete a time record.

Input parameters:

- `id` (number, required): Time record ID to delete

### `list_trainings` (~33 tokens)

List Trainings

Get all training programs.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number

### `get_training` (~25 tokens)

Get Training

Get details about a training program.

Input parameters:

- `id` (number, required): The training ID

### `create_training` (~52 tokens)

Create Training

Create a new training program.

Input parameters:

- `category_id` (number): Category ID
- `description` (string): Description
- `name` (string, required): Training name
- `subsidized` (boolean): Is subsidized

### `update_training` (~61 tokens)

Update Training

Update a training program.

Input parameters:

- `category_id` (number): Category ID
- `description` (string): Description
- `id` (number, required): The training ID
- `name` (string): Training name
- `subsidized` (boolean): Is subsidized

### `delete_training` (~52 tokens)

Delete Training

Delete a training program. This is a HIGH-RISK operation that requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this high-risk operation
- `id` (number, required): The training ID to delete

### `list_training_sessions` (~47 tokens)

List Training Sessions

Get sessions for a training program.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number
- `training_id` (number): Filter by training ID

### `create_training_session` (~83 tokens)

Create Training Session

Create a session for a training program.

Input parameters:

- `end_date` (string): End date (YYYY-MM-DD)
- `location` (string): Location
- `max_attendees` (number): Max attendees
- `name` (string): Session name
- `start_date` (string): Start date (YYYY-MM-DD)
- `training_id` (number, required): Training ID

### `update_training_session` (~79 tokens)

Update Training Session

Update a training session.

Input parameters:

- `end_date` (string): End date (YYYY-MM-DD)
- `id` (number, required): Session ID
- `location` (string): Location
- `max_attendees` (number): Max attendees
- `name` (string): Session name
- `start_date` (string): Start date (YYYY-MM-DD)

### `delete_training_session` (~25 tokens)

Delete Training Session

Delete a training session.

Input parameters:

- `id` (number, required): Session ID to delete

### `list_training_enrollments` (~50 tokens)

List Training Enrollments

Get enrollments for a training program.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number
- `training_id` (number): Filter by training ID

### `enroll_in_training` (~48 tokens)

Enroll in Training

Enroll an employee in a training program.

Input parameters:

- `employee_id` (number, required): Employee ID
- `session_id` (number): Session ID
- `training_id` (number, required): Training ID

### `unenroll_from_training` (~28 tokens)

Unenroll from Training

Remove an enrollment from a training.

Input parameters:

- `id` (number, required): Enrollment ID to remove

### `list_work_areas` (~36 tokens)

List Work Areas

Get all work areas within locations.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number

### `get_work_area` (~27 tokens)

Get Work Area

Get details about a work area.

Input parameters:

- `id` (number, required): The work area ID

### `create_work_area` (~46 tokens)

Create Work Area

Create a new work area within a location.

Input parameters:

- `description` (string): Description
- `location_id` (number): Location ID
- `name` (string, required): Work area name

### `update_work_area` (~52 tokens)

Update Work Area

Update a work area.

Input parameters:

- `description` (string): Description
- `id` (number, required): Work area ID
- `location_id` (number): Location ID
- `name` (string): Work area name

### `archive_work_area` (~26 tokens)

Archive Work Area

Archive a work area.

Input parameters:

- `id` (number, required): Work area ID to archive

### `unarchive_work_area` (~29 tokens)

Unarchive Work Area

Unarchive a work area.

Input parameters:

- `id` (number, required): Work area ID to unarchive

### `list_job_postings` (~36 tokens)

List Job Postings

Get all job postings for recruiting.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number

### `get_job_posting` (~28 tokens)

Get Job Posting

Get details about a job posting.

Input parameters:

- `id` (number, required): The job posting ID

### `create_job_posting` (~82 tokens)

Create Job Posting

Create a new job posting.

Input parameters:

- `department` (string): Department
- `description` (string): Job description
- `employment_type` (string): Employment type
- `location_id` (number): Location ID
- `remote_status` (string): Remote status
- `team_id` (number): Team ID
- `title` (string, required): Job title

### `update_job_posting` (~79 tokens)

Update Job Posting

Update a job posting.

Input parameters:

- `department` (string): Department
- `description` (string): Job description
- `id` (number, required): Job posting ID
- `location_id` (number): Location ID
- `status` (string): Status
- `team_id` (number): Team ID
- `title` (string): Job title

### `delete_job_posting` (~54 tokens)

Delete Job Posting

Delete a job posting. This is a HIGH-RISK operation that requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this high-risk operation
- `id` (number, required): Job posting ID to delete

### `list_candidates` (~31 tokens)

List Candidates

Get all candidates.

Input parameters:

- `limit` (number): Items per page
- `page` (number): Page number

### `get_candidate` (~24 tokens)

Get Candidate

Get details about a candidate.

Input parameters:

- `id` (number, required): The candidate ID

### `create_candidate` (~68 tokens)

Create Candidate

Create a new candidate.

Input parameters:

- `email` (string): Email
- `first_name` (string, required): First name
- `last_name` (string, required): Last name
- `linkedin_url` (string): LinkedIn URL
- `phone` (string): Phone
- `source` (string): Source

### `update_candidate` (~76 tokens)

Update Candidate

Update a candidate.

Input parameters:

- `email` (string): Email
- `first_name` (string): First name
- `id` (number, required): Candidate ID
- `last_name` (string): Last name
- `linkedin_url` (string): LinkedIn URL
- `phone` (string): Phone
- `source` (string): Source

### `delete_candidate` (~50 tokens)

Delete Candidate

Delete a candidate. This is a HIGH-RISK operation that requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this high-risk operation
- `id` (number, required): Candidate ID to delete

### `list_applications` (~47 tokens)

List Applications

Get job applications.

Input parameters:

- `job_posting_id` (number): Filter by job posting ID
- `limit` (number): Items per page
- `page` (number): Page number

### `get_application` (~24 tokens)

Get Application

Get details about an application.

Input parameters:

- `id` (number, required): The application ID

### `create_application` (~47 tokens)

Create Application

Create a job application for a candidate.

Input parameters:

- `candidate_id` (number, required): Candidate ID
- `job_posting_id` (number, required): Job posting ID
- `notes` (string): Notes

### `update_application` (~54 tokens)

Update Application

Update a job application.

Input parameters:

- `hiring_stage_id` (number): Hiring stage ID
- `id` (number, required): Application ID
- `notes` (string): Notes
- `rating` (number): Rating (0-5)

### `delete_application` (~51 tokens)

Delete Application

Delete a job application. This is a HIGH-RISK operation that requires confirmation.

Input parameters:

- `confirm` (boolean): Set to true to confirm this high-risk operation
- `id` (number, required): Application ID to delete

### `advance_application` (~26 tokens)

Advance Application

Move an application to the next hiring stage.

Input parameters:

- `id` (number, required): Application ID

### `list_hiring_stages` (~20 tokens)

List Hiring Stages

Get all hiring stages for the recruiting workflow.

### `list_payroll_supplements` (~57 tokens)

List Payroll Supplements

Get payroll supplements (bonuses, allowances, etc.). Read-only.

Input parameters:

- `employee_id` (number): Filter by employee ID
- `limit` (number): Items per page
- `page` (number): Page number

### `get_payroll_supplement` (~32 tokens)

Get Payroll Supplement

Get details about a payroll supplement. Read-only.

Input parameters:

- `id` (number, required): The supplement ID

### `list_tax_identifiers` (~49 tokens)

List Tax Identifiers

Get employee tax identifiers. Read-only.

Input parameters:

- `employee_id` (number): Filter by employee ID
- `limit` (number): Items per page
- `page` (number): Page number

### `get_tax_identifier` (~30 tokens)

Get Tax Identifier

Get details about a tax identifier. Read-only.

Input parameters:

- `id` (number, required): The tax identifier ID

### `list_family_situations` (~50 tokens)

List Family Situations

Get employee family situations. Read-only.

Input parameters:

- `employee_id` (number): Filter by employee ID
- `limit` (number): Items per page
- `page` (number): Page number

### `get_family_situation` (~32 tokens)

Get Family Situation

Get details about an employee family situation. Read-only.

Input parameters:

- `id` (number, required): The family situation ID

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/t4dhg-mcp-factorial/t4dhg-mcp-factorial#diagnostics

## Score history

- 2026-08-11: 88
- 2026-08-10: 88
- 2026-08-09: 87
- 2026-08-08: 87
- 2026-08-07: 86
- 2026-08-06: 82
- 2026-08-05: 82
- 2026-08-04: 80
- 2026-08-03: 77
- 2026-08-02: 41
- 2026-08-01: 26
- 2026-07-31: 26
- 2026-07-30: 35
- 2026-07-28: 25
- 2026-07-27: 53

## Links

- npm package: https://www.npmjs.com/package/@t4dhg/mcp-factorial
- Socket report: https://socket.dev/npm/package/@t4dhg/mcp-factorial
- Repository: https://github.com/t4dhg/mcp-factorial
- Changelog RSS feed: https://verifymcp.io/servers/t4dhg-mcp-factorial/t4dhg-mcp-factorial.xml
- Changelog JSON feed: https://verifymcp.io/servers/t4dhg-mcp-factorial/t4dhg-mcp-factorial.json
- HTML version of this page: https://verifymcp.io/servers/t4dhg-mcp-factorial/t4dhg-mcp-factorial
