Skip to content

kiwiHR MCP by usefulapi

io.usefulapi/kiwihrusefulapi.iostreamable-httpv1.0.0Scanned

Read kiwiHR employees, time off, timesheets, projects; create and update employees, timesheets.

30 tools: 5 can delete or cancel things, 5 change things and 20 only read.

Tools: 5 delete, 0 irreversible, 5 write, 20 read.
  • Reads private data · 2
  • Reads text others write · 30
  • Can send data out · 0
  • No findings

Anlyon alternative

10 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

30 tools

Deletes or cancels 5Claude Code: deny
  • kiwihr_deactivate_userWRITE, ACCESS-CHANGING: deactivate an active employee (typically after they leave): they lose access to kiwiHR and drop out of active lists.Reads text others writeNo findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE, ACCESS-CHANGING: deactivate an active employee (typically after they leave): they lose access to kiwiHR and drop out of active lists. Reversible with kiwihr_activate_user. GraphQL mutation deactivateUser.

    Annotations the server declares

    • title: Deactivate employee
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • kiwihr_delete_timesheet_entryWRITE, DESTRUCTIVE: permanently delete one timesheet entry by id (get it from kiwihr_get_timesheet).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_delete_timesheet_entry" says "delete": a word for removing or ending something.
    • The description says "permanently delete".
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE, DESTRUCTIVE: permanently delete one timesheet entry by id (get it from kiwihr_get_timesheet). This cannot be undone. Returns true when deleted. GraphQL mutation deleteTimesheetEntry.

    Annotations the server declares

    • title: Delete timesheet entry
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • kiwihr_update_projectWRITE: rename a project or switch it ACTIVE/INACTIVE (INACTIVE projects can no longer be used for time tracking).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_update_project" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: rename a project or switch it ACTIVE/INACTIVE (INACTIVE projects can no longer be used for time tracking). Only the fields you pass are changed. GraphQL mutation updateProject.

    Annotations the server declares

    • title: Update project
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • kiwihr_update_timesheet_entryWRITE: change an existing timesheet entry (get its id from kiwihr_get_timesheet): times, part of day, project or note.Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_update_timesheet_entry" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: change an existing timesheet entry (get its id from kiwihr_get_timesheet): times, part of day, project or note. Only the fields you pass are changed. Setting the same values again gives the same result. Returns the updated day. GraphQL mutation updateTimesheetEntry.

    Annotations the server declares

    • title: Update timesheet entry
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • kiwihr_update_userWRITE: change an employee's work profile: name, start date, about-me, work phones, position, team(s), location, manager.Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_update_user" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: change an employee's work profile: name, start date, about-me, work phones, position, team(s), location, manager. Only the fields you pass are changed (team_ids replaces the whole team list). Private, payroll and bank data cannot be changed with this tool. GraphQL mutation updateUser.

    Annotations the server declares

    • title: Update employee
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
Changes things 5Claude Code: ask
  • kiwihr_activate_userWRITE: re-activate a deactivated employee so they appear in active lists and can use kiwiHR again.Reads text others writeNo findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: re-activate a deactivated employee so they appear in active lists and can use kiwiHR again. GraphQL mutation activateUser.

    Annotations the server declares

    • title: Activate employee
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • kiwihr_create_journeyWRITE: create an onboarding/offboarding journey for an employee from a journey type and optionally a template (ids from kiwihr_list_journey_types / kiwihr_list_journey_templates).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_create_journey" says "create": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: create an onboarding/offboarding journey for an employee from a journey type and optionally a template (ids from kiwihr_list_journey_types / kiwihr_list_journey_templates). Creates a new journey each call (not idempotent). It does not publish it; check the status in the reply. GraphQL mutation createJourney.

    Annotations the server declares

    • title: Create journey
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • kiwihr_create_projectWRITE: create a time-tracking project (name, status ACTIVE or INACTIVE; default ACTIVE).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_create_project" says "create": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: create a time-tracking project (name, status ACTIVE or INACTIVE; default ACTIVE). Creates a new project each call (not idempotent). GraphQL mutation createProject.

    Annotations the server declares

    • title: Create project
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • kiwihr_create_timesheet_entryWRITE: add a time entry to the timesheet of one employee on one day (user_id omitted = the admin user the key acts as).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_create_timesheet_entry" says "create": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: add a time entry to the timesheet of one employee on one day (user_id omitted = the admin user the key acts as). type MANUAL = worked time (give start_at and end_at as HH:mm:ss, or a part_of_day), BREAK = a break. Optional project and note. Creates a new entry each call (not idempotent). Returns the updated day. GraphQL mutation createTimesheetEntry.

    Annotations the server declares

    • title: Create timesheet entry
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • kiwihr_create_userWRITE: add a new employee record (first name, last name and work e-mail are required; optional start date, manager, teams, position, location and phones).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_create_user" says "create": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    WRITE: add a new employee record (first name, last name and work e-mail are required; optional start date, manager, teams, position, location and phones). Creates a new employee each call (not idempotent). No invitation is sent by this tool. Payroll and bank data cannot be set. GraphQL mutation createUser.

    Annotations the server declares

    • title: Create employee
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
Only reads 20Show 20 read-only tools
  • kiwihr_get_attendance_statementAttendance summary of ONE employee over a date range: expected, tracked, total, time off and holiday time (seconds) and days, balance, overtime, meal vouchers, and tracked time per…Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_get_attendance_statement" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Attendance summary of ONE employee over a date range: expected, tracked, total, time off and holiday time (seconds) and days, balance, overtime, meal vouchers, and tracked time per project. GraphQL query attendanceStatement.

    Annotations the server declares

    • title: Get attendance statement
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_get_journeyOne journey by id with its steps (name, description, fixed start and due dates).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_get_journey" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One journey by id with its steps (name, description, fixed start and due dates). With include_personal=true it also returns the private e-mail address stored on the journey. GraphQL query journey.

    Annotations the server declares

    • title: Get journey
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_get_projectOne time-tracking project by id (name, status).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_get_project" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One time-tracking project by id (name, status). GraphQL query project.

    Annotations the server declares

    • title: Get project
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_get_time_off_usageWho took (or requested) how much time off in a date range: per employee the request count and used days for each time off rule of the chosen time off types.Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_get_time_off_usage" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Who took (or requested) how much time off in a date range: per employee the request count and used days for each time off rule of the chosen time off types. Use it for absence reports ('who was off in March?'). Optional employee filters as in kiwihr_list_users. GraphQL query timeOffRequestUsageStatements.

    Annotations the server declares

    • title: Get time off usage
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_get_timesheetThe timesheet of ONE employee for ONE day (user_id omitted = the admin user the key acts as), with all entries and their ids (needed to update or delete an entry).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_get_timesheet" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    The timesheet of ONE employee for ONE day (user_id omitted = the admin user the key acts as), with all entries and their ids (needed to update or delete an entry). Times in seconds. GraphQL query timesheet.

    Annotations the server declares

    • title: Get timesheet
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_get_userOne employee by id: the list fields plus probation end, about-me, language, invitation status, work phones, all teams, work schedule and custom field values.Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_get_user" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One employee by id: the list fields plus probation end, about-me, language, invitation status, work phones, all teams, work schedule and custom field values. With include_personal=true it also returns birth date, private e-mail and phone, nationality, gender, pronouns, home address, emergency contact and custom fields of the personal sections. Payroll, bank (IBAN/BIC), tax and insurance data are never returned. GraphQL query user.

    Annotations the server declares

    • title: Get employee
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_attendance_statementsAttendance summaries of ALL employees over a date range (expected vs tracked time, time off, holidays, balance, overtime, tracked time per project).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_attendance_statements" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Attendance summaries of ALL employees over a date range (expected vs tracked time, time off, holidays, balance, overtime, tracked time per project). Optionally only employees with time tracked on a project, or with uncategorized time; inactive employees can be included. GraphQL query attendanceStatements.

    Annotations the server declares

    • title: List attendance statements
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_custom_fieldsList the company's custom employee profile fields (id, name, section, data type, choice options).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_custom_fields" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List the company's custom employee profile fields (id, name, section, data type, choice options). Payroll and bank sections are listed by name only; their values are never returned by any tool. GraphQL query customFields.

    Annotations the server declares

    • title: List custom fields
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_journey_templatesList journey templates (id, name, description, type).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_journey_templates" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List journey templates (id, name, description, type). Use a template id with kiwihr_create_journey. GraphQL query journeyTemplates.

    Annotations the server declares

    • title: List journey templates
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_journey_typesList journey types such as pre-onboarding, onboarding or offboarding (id, name, key, archived date).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_journey_types" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List journey types such as pre-onboarding, onboarding or offboarding (id, name, key, archived date). GraphQL query journeyTypes.

    Annotations the server declares

    • title: List journey types
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_journeysList onboarding/offboarding journeys (id, name, status DRAFT/ONGOING/COMPLETED/CANCELLED, assignee, journey type, custom date).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_journeys" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List onboarding/offboarding journeys (id, name, status DRAFT/ONGOING/COMPLETED/CANCELLED, assignee, journey type, custom date). Filter by status, assignee, type or team. GraphQL query journeys.

    Annotations the server declares

    • title: List journeys
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_locationsList office locations (id, name).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_locations" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List office locations (id, name). Use the ids to filter employees. GraphQL query locations.

    Annotations the server declares

    • title: List locations
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_overtime_balancesCurrent overtime balance (seconds) per employee.Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_overtime_balances" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Current overtime balance (seconds) per employee. GraphQL query overtimeBalanceStatements.

    Annotations the server declares

    • title: List overtime balances
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_positionsList job positions (id, name).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_positions" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List job positions (id, name). Use the ids to filter employees. GraphQL query positions.

    Annotations the server declares

    • title: List positions
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_projectsList time-tracking projects (id, name, status ACTIVE or INACTIVE).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_projects" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List time-tracking projects (id, name, status ACTIVE or INACTIVE). GraphQL query projects.

    Annotations the server declares

    • title: List projects
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_teamsList teams and departments (id, name, kind GROUP or DEPARTMENT).Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_teams" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List teams and departments (id, name, kind GROUP or DEPARTMENT). Use the ids to filter employees. GraphQL query teams.

    Annotations the server declares

    • title: List teams
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_time_off_balancesTime off balances of all employees: per employee and time off rule the allowance, accrued, used, requested, planned and available days, carry-over and the accrual/usage periods.Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_time_off_balances" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Time off balances of all employees: per employee and time off rule the allowance, accrued, used, requested, planned and available days, carry-over and the accrual/usage periods. Filter by time off type, active state and usage period. The API has no per-employee filter or paging for this query; read the result per user. GraphQL query timeOffBalances.

    Annotations the server declares

    • title: List time off balances
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_time_off_typesList time off (absence) types such as vacation or sick leave: id, name, colour, visibility to team members.Reads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_time_off_types" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List time off (absence) types such as vacation or sick leave: id, name, colour, visibility to team members. Use the ids with kiwihr_get_time_off_usage and kiwihr_list_time_off_balances. GraphQL query timeOffTypes.

    Annotations the server declares

    • title: List time off types
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_timesheetsDaily timesheets of one employee (or the key's admin user when user_id is omitted) in a date range: expected, tracked, time off, holiday and break time in SECONDS, approval flag, t…Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_timesheets" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "note": it reads notes.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Daily timesheets of one employee (or the key's admin user when user_id is omitted) in a date range: expected, tracked, time off, holiday and break time in SECONDS, approval flag, time offs, holidays, entries (start/end, type, note, project) and break-rule violations. GraphQL query timesheets.

    Annotations the server declares

    • title: List timesheets
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kiwihr_list_usersList or search employees (kiwiHR 'users') with name, work email, active flag, employee number, employment dates, position, team, location and manager.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "kiwihr_list_users" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "email": it reads mail.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe description's first sentence says "list" and "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    List or search employees (kiwiHR 'users') with name, work email, active flag, employee number, employment dates, position, team, location and manager. Filter by active state, team, location, position, e-mail or name. Payroll, bank, tax and insurance data are never included. GraphQL query users.

    Annotations the server declares

    • title: List employees
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.

Reads private data2
Reads files, mail, messages, databases, secrets, calendars or repositories.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

No check matched anything in these tool definitions. That is not a safety guarantee.

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http kiwihr https://kiwihr.usefulapi.io/mcp
claude mcp add --transport http kiwihr https://kiwihr.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__kiwihr__kiwihr_list_users",
      "mcp__kiwihr__kiwihr_get_user",
      "mcp__kiwihr__kiwihr_list_teams",
      "mcp__kiwihr__kiwihr_list_locations",
      "mcp__kiwihr__kiwihr_list_positions",
      "mcp__kiwihr__kiwihr_list_custom_fields",
      "mcp__kiwihr__kiwihr_list_time_off_types",
      "mcp__kiwihr__kiwihr_list_time_off_balances",
      "mcp__kiwihr__kiwihr_get_time_off_usage",
      "mcp__kiwihr__kiwihr_list_timesheets",
      "mcp__kiwihr__kiwihr_get_timesheet",
      "mcp__kiwihr__kiwihr_get_attendance_statement",
      "mcp__kiwihr__kiwihr_list_attendance_statements",
      "mcp__kiwihr__kiwihr_list_overtime_balances",
      "mcp__kiwihr__kiwihr_list_projects",
      "mcp__kiwihr__kiwihr_get_project",
      "mcp__kiwihr__kiwihr_list_journeys",
      "mcp__kiwihr__kiwihr_get_journey",
      "mcp__kiwihr__kiwihr_list_journey_templates",
      "mcp__kiwihr__kiwihr_list_journey_types"
    ],
    "ask": [
      "mcp__kiwihr__kiwihr_create_timesheet_entry",
      "mcp__kiwihr__kiwihr_create_project",
      "mcp__kiwihr__kiwihr_create_user",
      "mcp__kiwihr__kiwihr_activate_user",
      "mcp__kiwihr__kiwihr_create_journey"
    ],
    "deny": [
      "mcp__kiwihr__kiwihr_update_timesheet_entry",
      "mcp__kiwihr__kiwihr_delete_timesheet_entry",
      "mcp__kiwihr__kiwihr_update_project",
      "mcp__kiwihr__kiwihr_update_user",
      "mcp__kiwihr__kiwihr_deactivate_user"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as kiwihr. Review it before you use it.

Capability tags behind 30 rules
  • mcp__kiwihr__kiwihr_list_users private-data, untrusted-input
  • mcp__kiwihr__kiwihr_get_user untrusted-input
  • mcp__kiwihr__kiwihr_list_teams untrusted-input
  • mcp__kiwihr__kiwihr_list_locations untrusted-input
  • mcp__kiwihr__kiwihr_list_positions untrusted-input
  • mcp__kiwihr__kiwihr_list_custom_fields untrusted-input
  • mcp__kiwihr__kiwihr_list_time_off_types untrusted-input
  • mcp__kiwihr__kiwihr_list_time_off_balances untrusted-input
  • mcp__kiwihr__kiwihr_get_time_off_usage untrusted-input
  • mcp__kiwihr__kiwihr_list_timesheets private-data, untrusted-input
  • mcp__kiwihr__kiwihr_get_timesheet untrusted-input
  • mcp__kiwihr__kiwihr_get_attendance_statement untrusted-input
  • mcp__kiwihr__kiwihr_list_attendance_statements untrusted-input
  • mcp__kiwihr__kiwihr_list_overtime_balances untrusted-input
  • mcp__kiwihr__kiwihr_list_projects untrusted-input
  • mcp__kiwihr__kiwihr_get_project untrusted-input
  • mcp__kiwihr__kiwihr_list_journeys untrusted-input
  • mcp__kiwihr__kiwihr_get_journey untrusted-input
  • mcp__kiwihr__kiwihr_list_journey_templates untrusted-input
  • mcp__kiwihr__kiwihr_list_journey_types untrusted-input
  • mcp__kiwihr__kiwihr_create_timesheet_entry untrusted-input
  • mcp__kiwihr__kiwihr_update_timesheet_entry untrusted-input
  • mcp__kiwihr__kiwihr_delete_timesheet_entry untrusted-input
  • mcp__kiwihr__kiwihr_create_project untrusted-input
  • mcp__kiwihr__kiwihr_update_project untrusted-input
  • mcp__kiwihr__kiwihr_create_user untrusted-input
  • mcp__kiwihr__kiwihr_update_user untrusted-input
  • mcp__kiwihr__kiwihr_deactivate_user untrusted-input
  • mcp__kiwihr__kiwihr_activate_user untrusted-input
  • mcp__kiwihr__kiwihr_create_journey untrusted-input

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/io.usefulapi/kiwihr/verify?hash=5d01a5f41d8a6bce07bba82942f559cd7093b893b044141b3037a83fa1b274a1" | jq -e '.changed == false'

Pinned hash 5d01a5f41d8a, from Oct 24, 2026, 16:20 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/io.usefulapi/kiwihr/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for io.usefulapi/kiwihr
[![anlyon.dev](https://anlyon.dev/badge/io.usefulapi/kiwihr.svg)](https://anlyon.dev/servers/io.usefulapi/kiwihr)

Source: MCP Registry · repository. Synced Oct 24, 2026, 17:17 UTC.