Skip to content

CharlieHR MCP by usefulapi

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

Read CharlieHR team members, leave, allowances, offices, teams and salaries; add team member notes.

27 tools: 1 can delete or cancel things and 26 only read.

Tools: 1 delete, 0 irreversible, 0 write, 26 read.
  • Reads private data · 6
  • Reads text others write · 27
  • Can send data out · 0
  • No findings

Anlyon alternative

1 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.

27 tools

Deletes or cancels 1Claude Code: deny
  • charliehr_create_team_member_noteWRITE: add a custom note (a value for one note type, e.g.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_create_team_member_note" says "create": 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: add a custom note (a value for one note type, e.g. an employee number) to a team member in Charlie. It is created immediately and visible to whoever the note type's permissions allow. Use charliehr_list_team_member_note_types for the note type id. POST /team_members/{id}/notes.

    Annotations the server declares

    • title: Add team member note
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
Only reads 26Show 26 read-only tools
  • charliehr_get_companyThe Charlie company the API keys belong to: id, name, subdomain and logo.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_get_company" 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 Charlie company the API keys belong to: id, name, subdomain and logo. GET /company.

    Annotations the server declares

    • title: Get company
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_get_leave_requestOne leave request by id.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_get_leave_request" 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 leave request by id. GET /leave_requests/{id}.

    Annotations the server declares

    • title: Get leave request
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_get_leave_typeOne leave type by id.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_get_leave_type" 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 leave type by id. GET /leave_types/{id}.

    Annotations the server declares

    • title: Get leave type
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_get_officeOne office by id.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_get_office" 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 office by id. GET /offices/{id}.

    Annotations the server declares

    • title: Get office
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_get_teamOne team by id, with the ids of its team members.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_get_team" 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 team by id, with the ids of its team members. GET /teams/{id}.

    Annotations the server declares

    • title: Get team
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_get_team_memberOne team member by id with the full profile (contact details, address, office, manager, teams, dates, employment status, job title, notes).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "contact": it reads contacts.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One team member by id with the full profile (contact details, address, office, manager, teams, dates, employment status, job title, notes). Sensitive fields included: date_of_birth, gender, married, personal email, phone, home address and notes. National Insurance numbers (also inside notes), payroll id, starter declaration and student-loan flags are never returned. GET /team_members/{id}.

    Annotations the server declares

    • title: Get team member
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_get_team_member_leave_allowanceThe current holiday allowance of one team member (allowance, used, remaining, in days and hours, with the period).Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_get_team_member_leave_allowance" 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 current holiday allowance of one team member (allowance, used, remaining, in days and hours, with the period). GET /team_members/{id}/leave_allowance.

    Annotations the server declares

    • title: Get team member leave allowance
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_get_team_member_note_typeOne note type by id.Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe name "charliehr_get_team_member_note_type" says "get" and "note": it reads notes.
    • 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
    One note type by id. GET /team_member_note_types/{id}.

    Annotations the server declares

    • title: Get team member note type
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_get_team_member_working_locationWhere one team member works on a date (custom overrides win over the default assignment).Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_get_team_member_working_location" 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
    Where one team member works on a date (custom overrides win over the default assignment). Defaults to today. GET /team_members/{id}/working_location.

    Annotations the server declares

    • title: Get team member working location
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_get_team_member_working_weeksThe working-week segments of one team member (which days are full_day/morning/afternoon, weekly hours, from/to dates), company defaults and custom overrides.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_get_team_member_working_weeks" 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 working-week segments of one team member (which days are full_day/morning/afternoon, weekly hours, from/to dates), company defaults and custom overrides. Not paginated. GET /team_members/{id}/working_weeks.

    Annotations the server declares

    • title: Get team member working weeks
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_allowance_adjustmentsAll holiday allowance adjustments of one team member across every leave period (description, days/hours, carryover flag, creator, period).Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_allowance_adjustments" 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
    All holiday allowance adjustments of one team member across every leave period (description, days/hours, carryover flag, creator, period). GET /team_members/{id}/allowance_adjustments.

    Annotations the server declares

    • title: List allowance adjustments
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_company_holidaysThe company's holidays (bank holidays and closures): name, start/end date, duration, deductible.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_company_holidays" 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
    The company's holidays (bank holidays and closures): name, start/end date, duration, deductible. Optionally only those in a date window. GET /company_holidays.

    Annotations the server declares

    • title: List company holidays
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_leave_allowancesThe current holiday allowance of every team member: allowance, used and remaining, in days and hours, with the leave period.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_leave_allowances" 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
    The current holiday allowance of every team member: allowance, used and remaining, in days and hours, with the leave period. GET /leave_allowances.

    Annotations the server declares

    • title: List leave allowances
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_leave_requestsList leave requests of the whole company (id, team member, approver, status, request type, start/end date, amount and units, duration, details).Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_leave_requests" 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 leave requests of the whole company (id, team member, approver, status, request type, start/end date, amount and units, duration, details). Optionally only those in a date window. GET /leave_requests.

    Annotations the server declares

    • title: List leave requests
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_leave_typesThe enabled leave types (Holiday, Sick...): id, name, deductible, default, auto-approved, sensitive.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_leave_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
    The enabled leave types (Holiday, Sick...): id, name, deductible, default, auto-approved, sensitive. GET /leave_types.

    Annotations the server declares

    • title: List leave types
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_non_holiday_leave_allowancesDays taken and limit for each non-holiday leave type (sick, compassionate...) of one team member.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_non_holiday_leave_allowances" 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
    Days taken and limit for each non-holiday leave type (sick, compassionate...) of one team member. GET /team_members/{id}/non_holiday_leave_allowances.

    Annotations the server declares

    • title: List non-holiday leave allowances
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_officesList the company's offices: id, name, whether it is the head office, address, timezone, phone and email.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_offices" 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 the company's offices: id, name, whether it is the head office, address, timezone, phone and email. GET /offices.

    Annotations the server declares

    • title: List offices
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_restricted_datesThe dates on which leave is restricted (e.g.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_restricted_dates" 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
    The dates on which leave is restricted (e.g. a year-end freeze): name, start/end date, duration. Optionally only those in a date window. GET /restricted_dates.

    Annotations the server declares

    • title: List restricted dates
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_salariesSENSITIVE: the salary records of all team members (job title, pay rate, pay period, frequency, currency, effective date, employment type).Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_salaries" 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
    SENSITIVE: the salary records of all team members (job title, pay rate, pay period, frequency, currency, effective date, employment type). Needs API keys with access to salary data. GET /salaries.

    Annotations the server declares

    • title: List salaries
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_team_member_leave_requestsThe leave requests of one team member, optionally only those in a date window.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_team_member_leave_requests" 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
    The leave requests of one team member, optionally only those in a date window. GET /team_members/{id}/leave_requests.

    Annotations the server declares

    • title: List team member leave requests
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_team_member_note_typesThe custom note types (fields such as Employee No.Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe name "charliehr_list_team_member_note_types" says "list" and "note": it reads notes.
    • 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
    The custom note types (fields such as Employee No. or Laptop Serial Number) with who may see them. GET /team_member_note_types.

    Annotations the server declares

    • title: List team member note types
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_team_member_notesThe custom notes (label and content) stored on one team member (the content of a note labelled as a National Insurance number, and NI-number-looking text, is redacted).Reads private dataReads text others writeNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe name "charliehr_list_team_member_notes" says "list" and "note": it reads notes.
    • 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
    The custom notes (label and content) stored on one team member (the content of a note labelled as a National Insurance number, and NI-number-looking text, is redacted). GET /team_members/{id}/notes.

    Annotations the server declares

    • title: List team member notes
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_team_member_salariesSENSITIVE: the salary history of one team member (job title, pay rate, currency, effective date).Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_team_member_salaries" 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
    SENSITIVE: the salary history of one team member (job title, pay rate, currency, effective date). GET /team_members/{id}/salaries.

    Annotations the server declares

    • title: List team member salaries
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_team_membersList the company's team members (employees): name, work and personal email, phone, address, office, manager, teams, job title, start date, employment status and leaving date.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_team_members" 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 the company's team members (employees): name, work and personal email, phone, address, office, manager, teams, job title, start date, employment status and leaving date. Sensitive fields included: date_of_birth, gender, married, personal email, phone and home address. National Insurance numbers, payroll id, starter declaration and student-loan flags are never returned. GET /team_members.

    Annotations the server declares

    • title: List team members
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_teamsList the company's teams with the ids of their team members.Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_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 the company's teams with the ids of their team members. GET /teams.

    Annotations the server declares

    • title: List teams
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • charliehr_list_working_locationsList the active working locations (the catalog).Reads text others writeNo findings

    Why it is in this group

    • The name "charliehr_list_working_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 the active working locations (the catalog). With a date, instead returns where each active team member works on that date. GET /working_locations.

    Annotations the server declares

    • title: List working locations
    • 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.

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 charliehr https://charliehr.usefulapi.io/mcp
claude mcp add --transport http charliehr https://charliehr.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__charliehr__charliehr_get_company",
      "mcp__charliehr__charliehr_list_offices",
      "mcp__charliehr__charliehr_get_office",
      "mcp__charliehr__charliehr_list_teams",
      "mcp__charliehr__charliehr_get_team",
      "mcp__charliehr__charliehr_list_team_members",
      "mcp__charliehr__charliehr_get_team_member",
      "mcp__charliehr__charliehr_get_team_member_working_location",
      "mcp__charliehr__charliehr_get_team_member_working_weeks",
      "mcp__charliehr__charliehr_list_working_locations",
      "mcp__charliehr__charliehr_list_leave_requests",
      "mcp__charliehr__charliehr_get_leave_request",
      "mcp__charliehr__charliehr_list_team_member_leave_requests",
      "mcp__charliehr__charliehr_list_leave_allowances",
      "mcp__charliehr__charliehr_get_team_member_leave_allowance",
      "mcp__charliehr__charliehr_list_allowance_adjustments",
      "mcp__charliehr__charliehr_list_non_holiday_leave_allowances",
      "mcp__charliehr__charliehr_list_leave_types",
      "mcp__charliehr__charliehr_get_leave_type",
      "mcp__charliehr__charliehr_list_company_holidays",
      "mcp__charliehr__charliehr_list_restricted_dates",
      "mcp__charliehr__charliehr_list_salaries",
      "mcp__charliehr__charliehr_list_team_member_salaries",
      "mcp__charliehr__charliehr_list_team_member_note_types",
      "mcp__charliehr__charliehr_get_team_member_note_type",
      "mcp__charliehr__charliehr_list_team_member_notes"
    ],
    "ask": [],
    "deny": [
      "mcp__charliehr__charliehr_create_team_member_note"
    ]
  }
}

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 charliehr. Review it before you use it.

Capability tags behind 27 rules
  • mcp__charliehr__charliehr_get_company untrusted-input
  • mcp__charliehr__charliehr_list_offices private-data, untrusted-input
  • mcp__charliehr__charliehr_get_office untrusted-input
  • mcp__charliehr__charliehr_list_teams untrusted-input
  • mcp__charliehr__charliehr_get_team untrusted-input
  • mcp__charliehr__charliehr_list_team_members private-data, untrusted-input
  • mcp__charliehr__charliehr_get_team_member private-data, untrusted-input
  • mcp__charliehr__charliehr_get_team_member_working_location untrusted-input
  • mcp__charliehr__charliehr_get_team_member_working_weeks untrusted-input
  • mcp__charliehr__charliehr_list_working_locations untrusted-input
  • mcp__charliehr__charliehr_list_leave_requests untrusted-input
  • mcp__charliehr__charliehr_get_leave_request untrusted-input
  • mcp__charliehr__charliehr_list_team_member_leave_requests untrusted-input
  • mcp__charliehr__charliehr_list_leave_allowances untrusted-input
  • mcp__charliehr__charliehr_get_team_member_leave_allowance untrusted-input
  • mcp__charliehr__charliehr_list_allowance_adjustments untrusted-input
  • mcp__charliehr__charliehr_list_non_holiday_leave_allowances untrusted-input
  • mcp__charliehr__charliehr_list_leave_types untrusted-input
  • mcp__charliehr__charliehr_get_leave_type untrusted-input
  • mcp__charliehr__charliehr_list_company_holidays untrusted-input
  • mcp__charliehr__charliehr_list_restricted_dates untrusted-input
  • mcp__charliehr__charliehr_list_salaries untrusted-input
  • mcp__charliehr__charliehr_list_team_member_salaries untrusted-input
  • mcp__charliehr__charliehr_list_team_member_note_types private-data, untrusted-input
  • mcp__charliehr__charliehr_get_team_member_note_type private-data, untrusted-input
  • mcp__charliehr__charliehr_list_team_member_notes private-data, untrusted-input
  • mcp__charliehr__charliehr_create_team_member_note 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/charliehr/verify?hash=4f56a7aa284de1d76fac15321d78090319b56491e845988d68199df3dccc8510" | jq -e '.changed == false'

Pinned hash 4f56a7aa284d, from Oct 23, 2026, 10:18 UTC.

Watch

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

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

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

Badge

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

Source: MCP Registry · repository. Synced Oct 23, 2026, 10:18 UTC.