HR

Add or change people

hr_save_people · Changes data · Markdown

Adds people or changes them, up to 100 at a time, all or none: names, emails, job, department, location, manager, dates and allowances.

$1.00 per person added

From your agent’s balance. A call that fails costs nothing.

An example

Add Felix Wagner, our new warehouse operative: he starts November 2 in the warehouse, reports to Lena, probation until the end of April.

Your agent callshr_save_people$1.00 per person added

The example business is Hansen & Voss, a restaurant-equipment wholesaler in Hamburg with 60 staff. The reply is the one the tool really gives.

With these arguments
{
  "people": [
    {
      "first_name": "Felix",
      "last_name": "Wagner",
      "work_email": "felix.wagner@hansenvoss.example",
      "job_title": "Warehouse operative",
      "department": "Warehouse",
      "location": "Hamburg",
      "employment_type": "full_time",
      "manager": "lena.brandt@hansenvoss.example",
      "start_date": "2026-11-02",
      "probation_end": "2027-04-30"
    }
  ]
}
What comes back
{
  "people": [
    {
      "person_id": 4105,
      "name": "Felix Wagner",
      "first_name": "Felix",
      "last_name": "Wagner",
      "preferred_name": null,
      "work_email": "felix.wagner@hansenvoss.example",
      "job_title": "Warehouse operative",
      "department": "Warehouse",
      "location": "Hamburg",
      "manager": {
        "person_id": 4101,
        "name": "Lena Brandt"
      },
      "employment_type": "full_time",
      "start_date": "2026-11-02",
      "probation_end": "2027-04-30",
      "end_date": null,
      "status": "active",
      "created": true
    }
  ]
}

Use it when

Someone joins, changes role, gets a new manager or leaves.

What it does

Add people or change them, up to 100 at a time, all or none: matched by person_id, else by work email (any case); anyone not found is added (first_name needed). Give only what changes: "" clears text, null clears a date. A manager can be anyone on the account, also someone added later in the same call; loops are refused. Status left follows from a past end_date (their last day). Each saved person comes back with their person_id. When you add people partway through a leave year, record what they have already used or carried over with hr_adjust_leave.

What comes back

people: each saved person with their person_id and details. Every reply also carries cost_usd and balance_usd.

Inputs

NameTypeWhat it is
peopleRequiredarray of objects1 to 100 items.
people[].person_idintegerWho to change. Left out, work_email finds them; if nobody has it, a new person is added. At least 1.
people[].first_namestringUp to 100 characters.
people[].last_namestringUp to 100 characters.
people[].preferred_namestringWhat they like to be called. Up to 100 characters.
people[].work_emailstringOne person per address on the account, any case; "" clears it. Up to 254 characters.
people[].personal_emailstringUp to 254 characters.
people[].phonestringUp to 40 characters.
people[].job_titlestringUp to 120 characters.
people[].departmentstringUp to 120 characters.
people[].locationstringWhere they work, e.g. "Berlin". Holidays set for this location apply to them. Up to 120 characters.
people[].managerinteger or string or nullTheir manager: a person_id or work email on this account (someone added later in the same call is fine); null for none. 1 to 254 characters, at least 1.
people[].employment_typestringOne of: full_time,part_time,contractor,intern.
people[].start_datestring or nullYYYY-MM-DD, or null to clear it. Matches ^\d{4}-\d{2}-\d{2}$.
people[].probation_endstring or nullYYYY-MM-DD, or null to clear it. Matches ^\d{4}-\d{2}-\d{2}$.
people[].end_datestring or nullTheir last day, YYYY-MM-DD (null to clear). Once it has passed their status is left. Matches ^\d{4}-\d{2}-\d{2}$.
people[].statusstringon_leave for a long absence (parental leave, a sabbatical). "left" follows from end_date. One of: active,on_leave.
people[].birthdaystring or nullYYYY-MM-DD, or null to clear it. Matches ^\d{4}-\d{2}-\d{2}$.
people[].emergency_contactstringWho to call, how they are related and their number, as text. Up to 500 characters.
people[].notesstringUp to 5,000 characters.
people[].customobjectYour own fields as text, e.g. {"T-shirt": "M"}: merged into what is there, null removes one. Up to 20.
people[].allowancesobjectTheir own annual days per tracked leave type where they differ from the type's, e.g. {"Vacation": 28}; null goes back to the type's.

The call

Over MCP, call hr_save_people on https://api.conecto.chat/mcp/hr. Over REST:

Terminal
curl -X POST https://api.conecto.chat/v1/tools/hr_save_people \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"people":[{"first_name":"Felix","last_name":"Wagner","work_email":"felix.wagner@hansenvoss.example","job_title":"Warehouse operative","department":"Warehouse","location":"Hamburg","employment_type":"full_time","manager":"lena.brandt@hansenvoss.example","start_date":"2026-11-02","probation_end":"2027-04-30"}]}'

When it refuses

A refused call costs nothing and says what to do next.

CodeWhenWhat to do
not_found404No person of the business has that person_id or work email.Find them with hr_list_people.
invalid_input400An email or date is not valid, or a new person has no first_name.Fix what the message names for the person it labels.
email_taken409Another person has that work email.Change that person by person_id instead.
manager_cycle409The manager would end up reporting to the person, or to themselves.Pick another manager.
not_tracked409An allowance names a leave type that is not tracked.Set allowances only for tracked types.

Give this to your agent.

Set up Conecto from https://conecto.chat/SKILL.md