
Research
/Security News
737 Chrome VPN Extensions Linked to Brand Impersonation and Browser Traffic Redirection
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.
@t4dhg/mcp-factorial
Advanced tools
The definitive MCP server for FactorialHR - Full CRUD operations for employees, teams, time off, projects, training, recruiting (ATS), and payroll. 80+ tools with safety guardrails.
The definitive Model Context Protocol server for FactorialHR
A comprehensive Model Context Protocol (MCP) server that provides AI assistants like Claude with full access to FactorialHR. Manage employees, teams, time off, projects, training, recruiting, and more - all with built-in safety guardrails.
| Category | Tools | Operations |
|---|---|---|
| Employees | 6 | List, get, search, create, update, terminate |
| Teams | 5 | List, get, create, update, delete |
| Locations | 5 | List, get, create, update, delete |
| Time Off | 10 | List leaves/types/allowances, create, update, cancel, approve, reject |
| Attendance | 5 | List shifts, create, update, delete |
| Projects | 17 | Full CRUD for projects, tasks, workers, time records |
| Training | 14 | Full CRUD for trainings, sessions, enrollments |
| Work Areas | 6 | List, get, create, update, archive, unarchive |
| ATS | 16 | Job postings, candidates, applications, hiring stages, advance workflow |
| Payroll | 6 | List/get supplements, tax identifiers, family situations (read-only) |
| Documents | 5 | List/get/search folders and documents (read-only) |
| Job Catalog | 3 | List/get job roles and levels (read-only) |
| Contracts | 4 | Get contracts, employee with contract, by job role/level (read-only) |
| Resource URI | Description |
|---|---|
factorial://org-chart | Complete organizational hierarchy (Markdown) |
factorial://employees/directory | Employee directory by team (Markdown) |
factorial://locations/directory | Location directory with employee counts (Markdown) |
factorial://timeoff/policies | All leave types and policies (JSON) |
factorial://teams/{team_id} | Team details with member list (JSON, templated) |
| Prompt | Description |
|---|---|
onboard-employee | Generate personalized onboarding checklists |
analyze-org-structure | Analyze org structure (reporting lines, team sizes, distribution) |
timeoff-report | Generate time off reports by team or date range |
team-document-summary | Summarize documents across a team (certifications, payslips, etc) |
{
"mcpServers": {
"factorial": {
"command": "npx",
"args": ["-y", "@t4dhg/mcp-factorial"]
}
}
}
Create a .env file in your project root:
FACTORIAL_API_KEY=your-api-key-here
Or pass it directly in the MCP config:
{
"mcpServers": {
"factorial": {
"command": "npx",
"args": ["-y", "@t4dhg/mcp-factorial"],
"env": {
"FACTORIAL_API_KEY": "your-api-key-here"
}
}
}
}
Once configured, ask Claude things like:
You'll need a FactorialHR API key to use this MCP server. Here's how to get one:
.env file or MCP configurationImportant: API keys have full access to your FactorialHR data and never expire. Store them securely, never commit them to version control, and rotate them periodically.
| Environment Variable | Description | Default |
|---|---|---|
FACTORIAL_API_KEY | Your FactorialHR API key | Required |
FACTORIAL_API_VERSION | API version | 2025-10-01 |
FACTORIAL_TIMEOUT_MS | Request timeout (ms) | 30000 |
FACTORIAL_MAX_RETRIES | Max retry attempts | 3 |
DEBUG | Enable debug logging | false |
The following operations are marked as high-risk and should be used with care:
terminate_employee - Terminates an employee (sets termination date)delete_team - Permanently deletes a teamdelete_location - Permanently deletes a locationdelete_project - Permanently deletes a projectdelete_candidate - Permanently deletes a candidateSome categories are intentionally read-only for security:
Employee collection tools (get_employee_documents, get_employee_contracts) return summary format by default to prevent token overflow:
Documents (get_employee_documents):
id, name, folder_id, employee_id, author_id, mime_type, size_bytes (7 fields)get_document(id) to retrieve complete document metadata including file_url, timestamps, etc.Contracts (get_employee_contracts):
id, employee_id, job_title, effective_on (4 fields)created_at, updated_at) excluded from summaryBoth tools accept page and limit parameters (max: 100) for pagination control.
All write operations (create, update, delete, approve, reject) are logged with:
# Clone the repository
git clone https://github.com/t4dhg/mcp-factorial.git
cd mcp-factorial
# Install dependencies
npm install
# Build
npm run build
# Run tests
npm test
# Run tests with coverage
npm run test:coverage
# Lint
npm run lint
# Format
npm run format
# Run locally
FACTORIAL_API_KEY=your-key npm start
# Test with MCP Inspector
npx @modelcontextprotocol/inspector
The server implements exponential backoff for rate limits. If you're hitting limits frequently:
hired_on field: The FactorialHR API may not populate this for all employeesQ: Does this expose salary/payroll data? A: Payroll data (supplements, tax identifiers, family situations) is available read-only. No write operations for payroll are supported.
Q: Can Claude modify data in Factorial? A: Yes! Full CRUD operations are available for employees, teams, locations, time off, projects, training, and recruiting. High-risk operations are clearly marked.
Q: How is data cached? A: Data is cached in-memory with TTLs: employees (5 min), teams (10 min), locations (15 min), contracts (3 min).
Q: What FactorialHR API version is used?
A: Version 2025-10-01 by default. Override with FACTORIAL_API_VERSION environment variable.
Q: Are write operations logged? A: Yes, all write operations are logged via the audit module for compliance and debugging.
The FactorialHR API has some design patterns that differ from typical REST APIs. This MCP server handles these automatically, but understanding them helps when debugging or extending:
| Data | Expected Location | Actual Location | Impact |
|---|---|---|---|
| Team membership | On Employee object (team_ids) | On Team object (employee_ids) | Use list_teams to find an employee's teams |
| Job role assignment | On Employee object (job_role_id) | In Contract object (job_catalog_role_id) | Use get_employee_with_contract for role info |
| Salary information | On Employee object | In Contract object (salary_amount, salary_frequency) | Use get_employee_with_contract for salary |
| Job title | On Employee object | In Contract object (job_title) | May be null if not set in Factorial |
| Endpoint | Quirk | Workaround |
|---|---|---|
GET /employees/{id} | May return 404 for valid employees | Server falls back to listing all and filtering |
GET /documents/{id} | May return 404 for valid documents | Server falls back to listing all and filtering |
GET /contracts?employee_id=X | Filtering unreliable | Server fetches all and filters client-side |
| Empty results | Returns {"errors": null} instead of {"data": []} | Server handles both formats |
Some fields may be null even when you expect data:
job_title: Only populated if set in employee's contractmanager_id: Only populated if reporting structure is configuredseniority_calculation_date: Use this instead of the non-existent hired_on fieldname, mime_type, size_bytes): May be null for some documentsSalary information is available in the Contract entity, not the Employee entity:
salary_amount: number (in cents, e.g., 7000000 = €70,000)
salary_frequency: 'yearly' | 'monthly' | 'weekly' | 'daily' | 'hourly'
Use get_employee_with_contract to retrieve employee data with their latest salary information.
get_employee_with_contract instead of get_employeelist_employees_by_job_role with a job role IDlist_teams and check employee_ids arraysContributions are welcome! Please see CONTRIBUTING.md for guidelines.
MIT © Taig Mac Carthy
Built with the Model Context Protocol by Anthropic
FAQs
The definitive MCP server for FactorialHR - Full CRUD operations for employees, teams, time off, projects, training, recruiting (ATS), and payroll. 80+ tools with safety guardrails.
The npm package @t4dhg/mcp-factorial receives a total of 35 weekly downloads. As such, @t4dhg/mcp-factorial popularity was classified as not popular.
We found that @t4dhg/mcp-factorial demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.