providers/claude/plugin/skills/apideck-mcp-onboard-employee/SKILL.md
Task playbook for converting a hired ATS applicant into an HRIS employee via the Apideck MCP server's `apideck-onboard-employee` workflow tool. First cross-unified-API workflow — requires both ATS and HRIS connections active on the consumer. Optionally moves the applicant to a "hired" stage in the ATS to close the loop.
npx skillsauth add apideck-libraries/api-skills apideck-mcp-onboard-employeeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
When the user has decided to hire a candidate and wants the new employee record created in their HRIS, prefer apideck-onboard-employee over manually mapping ATS fields onto an HRIS create call. The workflow fetches the applicant, maps name/contact/address fields onto the HRIS shape, creates the employee, and optionally updates the ATS stage.
| User intent | Tool |
|---|---|
| "Onboard candidate Alice from Greenhouse to BambooHR", "Convert applicant 42 into an employee starting Monday" | apideck-onboard-employee ✓ |
| "Create an employee from scratch (no ATS lineage)" | hris-employees-create directly |
| "Move applicant to a different ATS stage without HRIS work" | ats-applicants-update directly |
| "Re-hire an existing employee" | Out of scope — usually a different HRIS endpoint per connector |
x-apideck-ats-service-id and x-apideck-hris-service-id separately — the underlying connectors are different, and the routing has to be set per call.hired_stage_id IS OPTIONAL AND SOFT-FAILS. If you pass it, the workflow tries to move the applicant to that stage in the ATS after creating the employee. If the ATS update fails, the workflow returns isError: false with a warnings[] entry — the employee was already created, and rolling back would leave the workspace in a worse state than partial success. Surface the warning to the user so they can move the applicant manually.failingStep: "validate-applicant" before touching the HRIS — the connector would reject a blank-name employee anyway, and we'd rather fail fast.| Arg | Required | Default | Notes |
|---|---|---|---|
| applicant_id | yes | — | From ats-applicants-list. |
| employment_start_date | yes | — | First day of employment, YYYY-MM-DD. Most HRIS connectors require this. |
| department_id | no | — | From hris-departments-list. Some HRIS connectors require it; others derive from job. |
| title | no | applicant's headline or title | Job title. |
| manager_id | no | — | Reporting manager's HRIS employee id. |
| employment_status | no | "active" | One of active, inactive, pending, leave, terminated. |
| hired_stage_id | no | — | If set, moves the ATS applicant to this stage after employee creation. Soft-fails. |
| x-apideck-ats-service-id | no | first ATS connection | E.g. "greenhouse", "lever". |
| x-apideck-hris-service-id | no | first HRIS connection | E.g. "bamboohr", "workday". |
{
"applicant_id": "app-1",
"employee_id": "emp-99",
"first_name": "Ada",
"last_name": "Lovelace",
"employment_start_date": "2026-05-01",
"title": "Senior Engineer",
"department_id": "dept-eng",
"ats_service_id": "greenhouse",
"hris_service_id": "bamboohr"
}
{
"applicant_id": "app-1",
"employee_id": "emp-99",
"first_name": "Ada",
"last_name": "Lovelace",
...
"warnings": [
"Employee created but ATS stage update failed: Greenhouse momentarily unavailable. Move the applicant to the Hired stage manually."
]
}
isError: false. Tell the user the employee landed in HRIS, and they need to mark the applicant Hired manually.
{
"applicant_id": "app-X",
"error": "...",
"failingStep": "ats-applicants-get" | "validate-applicant" | "hris-employees-create",
"upstream": { ... }
}
failingStep values:
ats-applicants-get — applicant ID wrong, ATS connection missing, or ATS connector down. Likely an elicitation if connection-level.validate-applicant — applicant has no first/last name; can't create a usable employee.hris-employees-create — HRIS rejected the body. Inspect upstream for the per-connector reason (often department_id required or manager_id invalid).User: "Onboard applicant app-1 (Ada Lovelace) into BambooHR starting May 1, engineering department, manager mgr-7. Move them to the Hired stage in Greenhouse."
stage-hired. Confirm?"{
"name": "apideck-onboard-employee",
"arguments": {
"applicant_id": "app-1",
"employment_start_date": "2026-05-01",
"department_id": "dept-eng",
"manager_id": "mgr-7",
"hired_stage_id": "stage-hired",
"x-apideck-ats-service-id": "greenhouse",
"x-apideck-hris-service-id": "bamboohr"
}
}
employee_id to the user. If warnings[] is present, tell them what didn't happen.| Symptom | Cause | Fix |
|---|---|---|
| failingStep: validate-applicant | Applicant record has empty name fields | Verify applicant ID; consider whether the ATS exposes the name under a different field name |
| failingStep: hris-employees-create with department_id required | Connector requires explicit department | Pass department_id from hris-departments-list |
| warnings[] with stage-update failure | Optional ATS update failed after employee was created | Tell user to mark applicant Hired manually; don't retry the workflow (would create a duplicate employee) |
| UrlElicitationRequiredError for ATS or HRIS | Either connection missing | Surface consent URL for the named unified API, retry |
apideck-mcp — front-door skillats, HRIS connectors: hris — for understanding which downstream services support what fieldsdevelopment
Jira Teams via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to Jira Teams's native API. Use when the user wants to call Jira Teams (no unified API resource mapping). Routes through Apideck with serviceId "jira-teams".
development
Jira Service Desk via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to Jira Service Desk's native API. Use when the user wants to call Jira Service Desk (no unified API resource mapping). Routes through Apideck with serviceId "jira-service-desk".
development
Jira Data Center via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to Jira Data Center's native API. Use when the user wants to call Jira Data Center (no unified API resource mapping). Routes through Apideck with serviceId "jira-data-center".
development
JetBrains YouTrack via Apideck's Proxy API + managed Vault auth — Apideck handles auth and proxies HTTP calls to JetBrains YouTrack's native API. Use when the user wants to call JetBrains YouTrack (no unified API resource mapping). Routes through Apideck with serviceId "jetbrains-youtrack".