Papershift MCP by usefulapi
io.usefulapi/papershiftusefulapi.iostreamable-httpv1.0.0Scanned
Read Papershift absences, vacation, time tracking and shifts; request and review absences.
26 tools: 6 can delete or cancel things and 20 only read.
- Reads private data · 2
- Reads text others write · 26
- Can send data out · 0
- No findings
Anlyon alternative
6 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.
26 tools
Deletes or cancels 6Claude Code: deny
papershift_assign_user_to_shiftWRITE: put an employee on a shift (or, with application true, record them as having applied for it).Reads text others writeNo findings
Why it is in this group
- The name "papershift_assign_user_to_shift" says "assign": 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: put an employee on a shift (or, with application true, record them as having applied for it). The employee is typically notified of the assignment. An already assigned user is re-assigned. Returns the shift's assigned and applied users. POST /assignments.
Annotations the server declares
- title: Assign employee to shift
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
papershift_confirm_time_trackingWRITE: confirm (approve) a worked-time entry so it counts as final for payroll and balances.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: confirm (approve) a worked-time entry so it counts as final for payroll and balances. Find ids with papershift_list_time_trackings. PUT /working_sessions/confirm.
Annotations the server declares
- title: Confirm time tracking
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
papershift_create_absenceWRITE: record an absence (vacation, sick leave, ...) for an employee.Reads text others writeNo findings
Why it is in this group
- The name "papershift_create_absence" 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: record an absence (vacation, sick leave, ...) for an employee. Get the absence type id from papershift_list_absence_types and the user id from papershift_list_users. Whether it counts immediately or waits for approval depends on the absence type and the account's approval rules; the employee may be notified. Papershift calculates the paid hours and vacation days. POST /absences.
Annotations the server declares
- title: Create absence
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
papershift_create_shiftWRITE: plan a new shift in a location and working area for a number of employees.Reads text others writeNo findings
Why it is in this group
- The name "papershift_create_shift" 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: plan a new shift in a location and working area for a number of employees. Set visible to true only if employees should see it right away (default: left to the account's setting). Assign people afterwards with papershift_assign_user_to_shift. POST /shifts.
Annotations the server declares
- title: Create shift
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
papershift_create_time_trackingWRITE: add a worked-time entry for an employee after the fact (start, end and break minutes) in a location and working area.Reads text others writeNo findings
Why it is in this group
- The name "papershift_create_time_tracking" 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 worked-time entry for an employee after the fact (start, end and break minutes) in a location and working area. It changes the employee's recorded hours and balance. Ids from papershift_list_locations, papershift_list_working_areas and papershift_list_users. POST /working_sessions.
Annotations the server declares
- title: Create time tracking
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
papershift_review_absenceWRITE: decide on an absence request.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: decide on an absence request. action 'confirm' approves it (it then counts against vacation days and the plan), 'reject' declines it, 'reset' puts a decided absence back to pending. The employee is typically notified of the decision. Find ids with papershift_list_absences. PUT /absences/{confirm|reject|reset}.
Annotations the server declares
- title: Review absence
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
Only reads 20Show 20 read-only tools
papershift_get_absenceOne absence by id, with its status, confirmation, hours and vacation days.Reads text others writeNo findings
Why it is in this group
- The name "papershift_get_absence" 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 absence by id, with its status, confirmation, hours and vacation days. GET /absences?id=.
Annotations the server declares
- title: Get absence
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_get_accountThe Papershift account this API key belongs to (id and name).Reads text others writeNo findings
Why it is in this group
- The name "papershift_get_account" 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 Papershift account this API key belongs to (id and name). A quick way to check the connection. GET /accounts.
Annotations the server declares
- title: Get account
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_get_locationOne location by id.Reads text others writeNo findings
Why it is in this group
- The name "papershift_get_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 One location by id. GET /locations?id=.
Annotations the server declares
- title: Get location
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_get_shiftOne shift by id.Reads text others writeNo findings
Why it is in this group
- The name "papershift_get_shift" 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 shift by id. GET /shifts?id=.
Annotations the server declares
- title: Get shift
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_get_time_trackingOne worked-time entry by id, with its breaks, tags and break total.Reads text others writeNo findings
Why it is in this group
- The name "papershift_get_time_tracking" 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 worked-time entry by id, with its breaks, tags and break total. GET /working_sessions?id=.
Annotations the server declares
- title: Get time tracking
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_get_userOne employee by id: contact data, status, locations, working areas, tags and profile fields.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "papershift_get_user" 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 employee by id: contact data, status, locations, working areas, tags and profile fields. GET /users?id=.
Annotations the server declares
- title: Get employee
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_absence_typesList the absence types of a location (vacation, sick leave, ...) with id, title and rules.Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_absence_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 the absence types of a location (vacation, sick leave, ...) with id, title and rules. Use the ids to create absences. GET /absence_types.
Annotations the server declares
- title: List absence types
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_absencesList absences (vacation, sick leave, ...) that fall between two dates, optionally for one employee or location.Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_absences" 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 absences (vacation, sick leave, ...) that fall between two dates, optionally for one employee or location. Shows type title, times, hours, vacation days and whether it is confirmed. 25 per page. GET /absences.
Annotations the server declares
- title: List absences
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_availabilitiesThe times an employee has marked as available between two dates.Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_availabilities" 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 times an employee has marked as available between two dates. 25 per page. GET /availabilities.
Annotations the server declares
- title: List availabilities
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_evaluationsAn employee's daily evaluations: target, planned and actual hours, vacation and compensation per day.Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_evaluations" 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 An employee's daily evaluations: target, planned and actual hours, vacation and compensation per day. Use it for overtime and balance questions. 25 per page. GET /evaluations.
Annotations the server declares
- title: List evaluations
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_locationsList all locations (sites/companies inside the account) with id, name and status.Reads text others writeNo findings
Why it is in this group
- The name "papershift_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 all locations (sites/companies inside the account) with id, name and status. Most other tools need a location id from here. GET /locations.
Annotations the server declares
- title: List locations
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_payrollsAn employee's payroll entries (paid hours, salary, bonus, time-account start/end per period).Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_payrolls" 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 An employee's payroll entries (paid hours, salary, bonus, time-account start/end per period). Sensitive pay data. 25 per page. GET /payrolls.
Annotations the server declares
- title: List payrolls
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_shift_assignmentsWho is assigned to a shift and who has applied for it (user id and name).Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_shift_assignments" 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 Who is assigned to a shift and who has applied for it (user id and name). GET /assignments?shift_id=.
Annotations the server declares
- title: List shift assignments
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_shiftsList planned shifts of a location between two dates, optionally for one working area or tags.Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_shifts" 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 planned shifts of a location between two dates, optionally for one working area or tags. Shows start, end, number of employees needed, note and visibility. Assigned employees: papershift_list_shift_assignments. 25 per page. GET /shifts.
Annotations the server declares
- title: List shifts
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_tagsList the tags of a location (labels on shifts, time trackings and employees).Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_tags" 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 tags of a location (labels on shifts, time trackings and employees). GET /filters.
Annotations the server declares
- title: List tags
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_target_hoursAn employee's contractual target hours (weekly/monthly rhythm and hours per weekday) over time.Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_target_hours" 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 An employee's contractual target hours (weekly/monthly rhythm and hours per weekday) over time. 25 per page. GET /target_hours.
Annotations the server declares
- title: List target hours
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_time_trackingsList worked-time entries (clock-ins) from a start date, optionally to an end date and for one employee.Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_time_trackings" 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 worked-time entries (clock-ins) from a start date, optionally to an end date and for one employee. Shows start, end, break time, location, employee and whether confirmed. 25 per page. GET /working_sessions.
Annotations the server declares
- title: List time trackings
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_usersList employees (users) with name, email, status, contract basics and their location, working-area and tag ids.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "papershift_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 employees (users) with name, email, status, contract basics and their location, working-area and tag ids. Filter by location, working area or tag. 25 per page. GET /users.
Annotations the server declares
- title: List employees
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_vacation_entitlementsAn employee's vacation entitlements (planned days, spent days, expiry, carry-over) for the given period.Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_vacation_entitlements" 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 An employee's vacation entitlements (planned days, spent days, expiry, carry-over) for the given period. Use it to answer 'how many vacation days does X have left'. 25 per page. GET /vacation_entitlements.
Annotations the server declares
- title: List vacation entitlements
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
papershift_list_working_areasList working areas (departments/stations shifts are planned in), optionally for one location.Reads text others writeNo findings
Why it is in this group
- The name "papershift_list_working_areas" 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 working areas (departments/stations shifts are planned in), optionally for one location. Use the ids for shifts and time trackings. GET /working_areas.
Annotations the server declares
- title: List working areas
- 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.
- Reads text others write26
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- papershift_assign_user_to_shift
- papershift_confirm_time_tracking
- papershift_create_absence
- papershift_create_shift
- papershift_create_time_tracking
- papershift_get_absence
- papershift_get_account
- papershift_get_location
- papershift_get_shift
- papershift_get_time_tracking
- papershift_get_user
- papershift_list_absence_types
- and 14 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 papershift https://papershift.usefulapi.io/mcpclaude mcp add --transport http papershift https://papershift.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__papershift__papershift_get_account",
"mcp__papershift__papershift_list_locations",
"mcp__papershift__papershift_get_location",
"mcp__papershift__papershift_list_working_areas",
"mcp__papershift__papershift_list_users",
"mcp__papershift__papershift_get_user",
"mcp__papershift__papershift_list_tags",
"mcp__papershift__papershift_list_absence_types",
"mcp__papershift__papershift_list_absences",
"mcp__papershift__papershift_get_absence",
"mcp__papershift__papershift_list_vacation_entitlements",
"mcp__papershift__papershift_list_time_trackings",
"mcp__papershift__papershift_get_time_tracking",
"mcp__papershift__papershift_list_evaluations",
"mcp__papershift__papershift_list_target_hours",
"mcp__papershift__papershift_list_payrolls",
"mcp__papershift__papershift_list_shifts",
"mcp__papershift__papershift_get_shift",
"mcp__papershift__papershift_list_shift_assignments",
"mcp__papershift__papershift_list_availabilities"
],
"ask": [],
"deny": [
"mcp__papershift__papershift_create_absence",
"mcp__papershift__papershift_review_absence",
"mcp__papershift__papershift_create_time_tracking",
"mcp__papershift__papershift_confirm_time_tracking",
"mcp__papershift__papershift_create_shift",
"mcp__papershift__papershift_assign_user_to_shift"
]
}
}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 papershift. Review it before you use it.
Capability tags behind 26 rules
- mcp__papershift__papershift_get_account untrusted-input
- mcp__papershift__papershift_list_locations untrusted-input
- mcp__papershift__papershift_get_location untrusted-input
- mcp__papershift__papershift_list_working_areas untrusted-input
- mcp__papershift__papershift_list_users private-data, untrusted-input
- mcp__papershift__papershift_get_user private-data, untrusted-input
- mcp__papershift__papershift_list_tags untrusted-input
- mcp__papershift__papershift_list_absence_types untrusted-input
- mcp__papershift__papershift_list_absences untrusted-input
- mcp__papershift__papershift_get_absence untrusted-input
- mcp__papershift__papershift_list_vacation_entitlements untrusted-input
- mcp__papershift__papershift_list_time_trackings untrusted-input
- mcp__papershift__papershift_get_time_tracking untrusted-input
- mcp__papershift__papershift_list_evaluations untrusted-input
- mcp__papershift__papershift_list_target_hours untrusted-input
- mcp__papershift__papershift_list_payrolls untrusted-input
- mcp__papershift__papershift_list_shifts untrusted-input
- mcp__papershift__papershift_get_shift untrusted-input
- mcp__papershift__papershift_list_shift_assignments untrusted-input
- mcp__papershift__papershift_list_availabilities untrusted-input
- mcp__papershift__papershift_create_absence untrusted-input
- mcp__papershift__papershift_review_absence untrusted-input
- mcp__papershift__papershift_create_time_tracking untrusted-input
- mcp__papershift__papershift_confirm_time_tracking untrusted-input
- mcp__papershift__papershift_create_shift untrusted-input
- mcp__papershift__papershift_assign_user_to_shift 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/papershift/verify?hash=e05c1d19a0c09b86507d8ae4269747a19b8359aa2577c2b1736c5297e63d7d9b" | jq -e '.changed == false'Pinned hash e05c1d19a0c0, from Oct 24, 2026, 11:18 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/io.usefulapi/papershift/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.usefulapi/papershift)Source: MCP Registry · repository. Synced Oct 24, 2026, 11:18 UTC.