# Papershift MCP by usefulapi (remote · papershift.usefulapi.io)

Read Papershift absences, vacation, time tracking and shifts; request and review absences.

- Trust score: 63/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-25

## Components

- remote · `papershift.usefulapi.io`: 63/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-papershift/papershift.md), [page](https://verifymcp.io/servers/io-usefulapi-papershift/papershift)

## Channel facts

- Endpoint: `https://papershift.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.2.3`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-25.

- **Endpoint Security**: 78/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly.
- **Schema Quality & AI Usability**: 84/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2923 tokens (~112/item across 26 items; 26 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 3/100
  - Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 26 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 27 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the Papershift MCP by usefulapi server?

Papershift MCP by usefulapi is a hosted endpoint at https://papershift.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http io-usefulapi-papershift 'https://papershift.usefulapi.io/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-papershift": {
      "url": "https://papershift.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-usefulapi-papershift": {
      "type": "http",
      "url": "https://papershift.usefulapi.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-usefulapi-papershift]
url = "https://papershift.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-papershift": {
      "type": "remote",
      "url": "https://papershift.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-papershift --url 'https://papershift.usefulapi.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-papershift:
    url: "https://papershift.usefulapi.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-papershift": {
      "Transport": "http",
      "Url": "https://papershift.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-papershift -t streamable-http -u 'https://papershift.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-papershift": {
      "type": "http",
      "url": "https://papershift.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-25 (score 63, 0)

- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 1.2.0 → 1.2.3

### 2026-10-24 (score 63)

First indexed and scored.

## MCP tools (26)

### `papershift_get_account` (~36 tokens)

Get account

The Papershift account this API key belongs to (id and name). A quick way to check the connection. GET /accounts.

### `papershift_list_locations` (~42 tokens)

List locations

List all locations (sites/companies inside the account) with id, name and status. Most other tools need a location id from here. GET /locations.

### `papershift_get_location` (~33 tokens)

Get location

One location by id. GET /locations?id=.

Input parameters:

- `location_id` (integer, required): Papershift location id.

### `papershift_list_working_areas` (~62 tokens)

List working areas

List working areas (departments/stations shifts are planned in), optionally for one location. Use the ids for shifts and time trackings. GET /working_areas.

Input parameters:

- `location_id` (integer): Only the working areas of this location.

### `papershift_list_users` (~143 tokens)

List employees

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.

Input parameters:

- `location_id` (integer): Only employees of this location.
- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.
- `tag_ids` (array): Only records with one of these tag ids (from papershift_list_tags). Include 0 to also match records without tags.
- `working_area_id` (integer): Only employees in this working area.

### `papershift_get_user` (~48 tokens)

Get employee

One employee by id: contact data, status, locations, working areas, tags and profile fields. GET /users?id=.

Input parameters:

- `user_id` (integer, required): Papershift user id.

### `papershift_list_tags` (~43 tokens)

List tags

List the tags of a location (labels on shifts, time trackings and employees). GET /filters.

Input parameters:

- `location_id` (integer, required): Papershift location id.

### `papershift_list_absence_types` (~90 tokens)

List absence types

List the absence types of a location (vacation, sick leave, ...) with id, title and rules. Use the ids to create absences. GET /absence_types.

Input parameters:

- `location_id` (integer, required): Papershift location id.
- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.

### `papershift_list_absences` (~148 tokens)

List absences

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.

Input parameters:

- `location_id` (integer): Only this location.
- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.
- `range_end` (string, required): Last day of the range, yyyy-mm-dd.
- `range_start` (string, required): First day of the range, yyyy-mm-dd.
- `user_id` (integer): Only this employee.

### `papershift_get_absence` (~46 tokens)

Get absence

One absence by id, with its status, confirmation, hours and vacation days. GET /absences?id=.

Input parameters:

- `absence_id` (integer, required): Papershift absence id.

### `papershift_list_vacation_entitlements` (~143 tokens)

List vacation entitlements

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.

Input parameters:

- `end_date` (string): Only entitlements up to this date, yyyy-mm-dd.
- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.
- `start_date` (string): Only entitlements from this date, yyyy-mm-dd.
- `user_id` (integer, required): Papershift user id.

### `papershift_list_time_trackings` (~135 tokens)

List time trackings

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.

Input parameters:

- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.
- `range_end` (string): Last day, yyyy-mm-dd (default: no end).
- `range_start` (string, required): First day, yyyy-mm-dd.
- `user_id` (integer): Only this employee.

### `papershift_get_time_tracking` (~52 tokens)

Get time tracking

One worked-time entry by id, with its breaks, tags and break total. GET /working_sessions?id=.

Input parameters:

- `time_tracking_id` (integer, required): Papershift time tracking (working session) id.

### `papershift_list_evaluations` (~124 tokens)

List evaluations (daily hours)

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.

Input parameters:

- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.
- `range_end` (string): Last day, yyyy-mm-dd (default: today).
- `range_start` (string, required): First day, yyyy-mm-dd.
- `user_id` (integer, required): Papershift user id.

### `papershift_list_target_hours` (~118 tokens)

List target hours

An employee's contractual target hours (weekly/monthly rhythm and hours per weekday) over time. 25 per page. GET /target_hours.

Input parameters:

- `end_date` (string): Only entries up to this date, yyyy-mm-dd.
- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.
- `start_date` (string): Only entries from this date, yyyy-mm-dd.
- `user_id` (integer, required): Papershift user id.

### `papershift_list_payrolls` (~90 tokens)

List payrolls

An employee's payroll entries (paid hours, salary, bonus, time-account start/end per period). Sensitive pay data. 25 per page. GET /payrolls.

Input parameters:

- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.
- `user_id` (integer, required): Papershift user id.

### `papershift_list_shifts` (~179 tokens)

List shifts

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.

Input parameters:

- `location_id` (integer, required): Papershift location id.
- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.
- `range_end` (string, required): Last day, yyyy-mm-dd.
- `range_start` (string, required): First day, yyyy-mm-dd.
- `tag_ids` (array): Only records with one of these tag ids (from papershift_list_tags). Include 0 to also match records without tags.
- `working_area_id` (integer): Only this working area.

### `papershift_get_shift` (~34 tokens)

Get shift

One shift by id. GET /shifts?id=.

Input parameters:

- `shift_id` (integer, required): Papershift shift id.

### `papershift_list_shift_assignments` (~51 tokens)

List shift assignments

Who is assigned to a shift and who has applied for it (user id and name). GET /assignments?shift_id=.

Input parameters:

- `shift_id` (integer, required): Papershift shift id.

### `papershift_list_availabilities` (~105 tokens)

List availabilities

The times an employee has marked as available between two dates. 25 per page. GET /availabilities.

Input parameters:

- `end_date` (string, required): Last day, yyyy-mm-dd.
- `page` (integer): Page number, from 1 (default 1; 25 records per page). Pass the previous reply's next_page.
- `start_date` (string, required): First day, yyyy-mm-dd.
- `user_id` (integer, required): Papershift user id.

### `papershift_create_absence` (~232 tokens)

Create absence

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.

Input parameters:

- `absence_type_id` (integer, required): Absence type id.
- `ends_at` (string, required): ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00.
- `full_day` (boolean): True for whole-day absences.
- `starts_at` (string, required): ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00.
- `time_zone` (string): IANA time zone of the times, e.g. Europe/Berlin (recommended).
- `user_id` (integer, required): Employee the absence is for.

### `papershift_review_absence` (~103 tokens)

Confirm, reject or reset an absence

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

Input parameters:

- `absence_id` (integer, required): Papershift absence id.
- `action` (string, required): The decision.

### `papershift_create_time_tracking` (~204 tokens)

Create time tracking

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.

Input parameters:

- `ends_at` (string, required): ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00.
- `location_id` (integer, required): Location the work was done in.
- `manual_pause` (integer): Break length in minutes.
- `starts_at` (string, required): ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00.
- `user_id` (integer, required): Employee who worked.
- `working_area_id` (integer, required): Working area the work was done in.

### `papershift_confirm_time_tracking` (~66 tokens)

Confirm time tracking

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.

Input parameters:

- `time_tracking_id` (integer, required): Papershift time tracking (working session) id.

### `papershift_create_shift` (~232 tokens)

Create shift

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.

Input parameters:

- `ends_at` (string, required): ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00.
- `location_id` (integer, required): Location of the shift.
- `note` (string): Optional note shown on the shift.
- `number_of_employees` (integer, required): How many employees the shift needs.
- `starts_at` (string, required): ISO 8601 date-time with a timezone, e.g. 2026-11-02T08:00:00+01:00.
- `tag_ids` (array): Tag ids to put on the shift (papershift_list_tags).
- `visible` (boolean): Whether employees can see the shift (published).
- `working_area_id` (integer, required): Working area of the shift.

### `papershift_assign_user_to_shift` (~107 tokens)

Assign employee to shift

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.

Input parameters:

- `application` (boolean): True = record as an application instead of assigning directly.
- `shift_id` (integer, required): Papershift shift id.
- `user_id` (integer, required): Employee to assign.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-papershift/papershift#diagnostics

## Score history

- 2026-10-25: 63
- 2026-10-24: 63

## Common questions

### What is the Papershift MCP by usefulapi server?

Papershift MCP by usefulapi is listed in the public MCP registry as io.usefulapi/papershift. Read Papershift absences, vacation, time tracking and shifts; request and review absences. This page covers its hosted endpoint (https://papershift.usefulapi.io/mcp).

### Is the Papershift MCP by usefulapi server safe to use?

Papershift MCP by usefulapi scores 63 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Papershift MCP by usefulapi server expose?

Papershift MCP by usefulapi exposes 26 tools: papershift_get_account, papershift_list_locations, papershift_get_location, papershift_list_working_areas, papershift_list_users, and 21 more. Their descriptions and schemas cost roughly 2,666 tokens of context every time the server is loaded.

### Does the Papershift MCP by usefulapi server require authentication?

Yes. Papershift MCP by usefulapi asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the Papershift MCP by usefulapi server still maintained?

Papershift MCP by usefulapi is still listed as active in the MCP registry. We last reached this channel on 25 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://papershift.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Website: https://usefulapi.io/papershift/
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-papershift/papershift.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-papershift/papershift.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-papershift/papershift
