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.
- 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.
- Reads private data6
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write27
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- charliehr_create_team_member_note
- charliehr_get_company
- charliehr_get_leave_request
- charliehr_get_leave_type
- charliehr_get_office
- charliehr_get_team
- charliehr_get_team_member
- charliehr_get_team_member_leave_allowance
- charliehr_get_team_member_note_type
- charliehr_get_team_member_working_location
- charliehr_get_team_member_working_weeks
- charliehr_list_allowance_adjustments
- and 15 more
- 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/mcpclaude mcp add --transport http charliehr https://charliehr.usefulapi.io/mcpRun 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.
{
"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.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.usefulapi/charliehr)Source: MCP Registry · repository. Synced Oct 23, 2026, 10:18 UTC.