Skip to content

Deputy MCP by usefulapi

by usefulapi.io · remote · no sign-in to list tools · v1.16.4 · published by io.usefulapi

See rosters, timesheets, leave and staff in Deputy, and create shifts, leave and memos.

Deletes · 8Changes · 1

21 tools: 8 can delete or cancel things, 1 change things and 12 only read.

Scanned Oct 22, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

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

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "deputy_query_resource" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true}; The name "deputy_query_resource" says "query": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

21 tools

Deletes or cancels 8Claude Code: deny
  • deputy_add_unavailabilityRecord a time an employee cannot work (one-off, or recurring with an RFC 5545-style rule such as FREQ WEEKLY, INTERVAL 1, BYDAY MO).No findings

    Why it is in this group

    • The name "deputy_add_unavailability" says "add": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Record a time an employee cannot work (one-off, or recurring with an RFC 5545-style rule such as FREQ WEEKLY, INTERVAL 1, BYDAY MO). Auto-scheduling then skips them. Deputy: POST /api/v1/supervise/unavail.

    Annotations the server declares

    • title: Add unavailability for an employee
    • destructiveHint: true
  • deputy_approve_timesheetApprove one timesheet's times as a supervisor.No findings

    Why it is in this group

    • The name "deputy_approve_timesheet" says "approve": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Approve one timesheet's times as a supervisor. Approved timesheets flow toward payroll export, so check it first with deputy_get_timesheet. Deputy: POST /api/v1/supervise/timesheet/approve.

    Annotations the server declares

    • title: Approve a timesheet
    • destructiveHint: true
  • deputy_create_leave_requestAdd a leave request for an employee.No findings

    Why it is in this group

    • The name "deputy_create_leave_request" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Add a leave request for an employee. By default it waits for manager approval (status 0); pass status 1 only when your system is the source of truth and the leave is already approved. Deputy tracks leave in hours, so give exact start and end times. Find leave type ids with deputy_query_resource on LeaveRules. Deputy: POST /api/v1/resource/Leave.

    Annotations the server declares

    • title: Create a leave request
    • destructiveHint: true
  • deputy_create_memoPost a memo to a location's news feed, optionally requiring staff to confirm they read it, or targeted to specific locations or users.No findings

    Why it is in this group

    • The name "deputy_create_memo" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Post a memo to a location's news feed, optionally requiring staff to confirm they read it, or targeted to specific locations or users. Visible to staff immediately. Deputy: PUT /api/v1/supervise/memo.

    Annotations the server declares

    • title: Post a memo
    • destructiveHint: true
  • deputy_create_shiftAdd a shift to the roster, assigned to an employee or left open.No findings

    Why it is in this group

    • The name "deputy_create_shift" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Add a shift to the roster, assigned to an employee or left open. Created as a DRAFT unless publish is true (publishing can notify the employee). Deputy returns an empty 200 on success — use deputy_list_shifts to find the new shift's id. Deputy: POST /api/v1/supervise/roster.

    Annotations the server declares

    • title: Create a shift
    • destructiveHint: true
  • deputy_publish_shiftsPublish draft shifts so employees see them, choosing how they are notified: 1 SMS and email, 2 SMS, 3 email, 4 no notification, 5 confirmation required.Can send data outNo findings

    Why it is in this group

    • The name "deputy_publish_shifts" says "publish": a word for a change that another call does not undo.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • outboundThe name "deputy_publish_shifts" says "publish": it sends or publishes something to other people.
    Description, as the server wrote it
    Publish draft shifts so employees see them, choosing how they are notified: 1 SMS and email, 2 SMS, 3 email, 4 no notification, 5 confirmation required. Only the listed shift ids are published. Deputy: POST /api/v1/supervise/roster/publish.

    Annotations the server declares

    • title: Publish shifts
    • destructiveHint: true
  • deputy_update_shiftChange an existing shift's times, area, employee, break or comment.No findings

    Why it is in this group

    • The name "deputy_update_shift" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Change an existing shift's times, area, employee, break or comment. Send the full intended shift (same fields as create) — Deputy's update is the add call with the shift id. Deputy: POST /api/v1/supervise/roster with intRosterId.

    Annotations the server declares

    • title: Update a shift
    • destructiveHint: true
  • deputy_update_timesheetCorrect an existing timesheet's start/end time, area, meal break or supervisor comment.No findings

    Why it is in this group

    • The name "deputy_update_timesheet" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Correct an existing timesheet's start/end time, area, meal break or supervisor comment. Times cannot be in the future. Deputy: POST /api/v1/supervise/timesheet/update.

    Annotations the server declares

    • title: Update a timesheet
    • destructiveHint: true
Changes things 1Claude Code: ask
  • deputy_query_resourceRun a Resource API search on any business object (leave types, pay rules, public holidays, memos, events, shift templates, pay lines, availability, sales data, …).1 finding

    Why it is in this group

    • The name "deputy_query_resource" says "query": a word for reading.
    • The description's first verb is "run": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "deputy_query_resource" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true}; The name "deputy_query_resource" says "query": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Run a Resource API search on any business object (leave types, pay rules, public holidays, memos, events, shift templates, pay lines, availability, sales data, …). `search` is Deputy's clause map, e.g. {"s1":{"field":"Employee","data":12,"type":"eq"}}; operators: eq ne gt lt ge le is 'is not' in 'not in' starts contains. Use deputy_describe_resource to see an object's fields and joins. Read-only. Deputy: POST /api/v1/resource/{Object}/QUERY.

    Annotations the server declares

    • title: Query any Deputy resource
    • readOnlyHint: true
Only reads 12Claude Code: allow
  • deputy_describe_resourceReturn a Resource API object's field list, field types and joinable associations — what deputy_query_resource can filter, sort and join on.No findings

    Why it is in this group

    • The name "deputy_describe_resource" says "describe": a word for reading.
    Description, as the server wrote it
    Return a Resource API object's field list, field types and joinable associations — what deputy_query_resource can filter, sort and join on. Deputy: GET /api/v1/resource/{Object}/INFO.

    Annotations the server declares

    • title: Describe a Deputy resource
    • readOnlyHint: true
  • deputy_get_employeeFetch one employee's details as a supervisor sees them — contact, locations, role and employment.Reads private dataNo findings

    Why it is in this group

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

    What it can reach

    • private-dataThe description's first sentence says "fetch" and "contact": it reads contacts.
    Description, as the server wrote it
    Fetch one employee's details as a supervisor sees them — contact, locations, role and employment. Deputy: GET /api/v1/supervise/employee/{id}.

    Annotations the server declares

    • title: Get one employee
    • readOnlyHint: true
  • deputy_get_employee_unavailabilityList the times one employee has marked themselves (or been marked) unavailable to work — check before rostering them.No findings

    Why it is in this group

    • The name "deputy_get_employee_unavailability" says "get": a word for reading.
    Description, as the server wrote it
    List the times one employee has marked themselves (or been marked) unavailable to work — check before rostering them. Deputy: GET /api/v1/supervise/unavail/{employeeId}.

    Annotations the server declares

    • title: Get an employee's unavailability
    • readOnlyHint: true
  • deputy_get_shiftFetch one shift (Roster record) by id.No findings

    Why it is in this group

    • The name "deputy_get_shift" says "get": a word for reading.
    Description, as the server wrote it
    Fetch one shift (Roster record) by id. Deputy: GET /api/v1/resource/Roster/{id}.

    Annotations the server declares

    • title: Get one shift
    • readOnlyHint: true
  • deputy_get_timesheetFetch one timesheet's full details, including breaks and approval state.No findings

    Why it is in this group

    • The name "deputy_get_timesheet" says "get": a word for reading.
    Description, as the server wrote it
    Fetch one timesheet's full details, including breaks and approval state. Deputy: GET /api/v1/supervise/timesheet/{id}/details.

    Annotations the server declares

    • title: Get one timesheet
    • readOnlyHint: true
  • deputy_list_areasList areas (Deputy OperationalUnits — the rosterable sections of a location, e.g.No findings

    Why it is in this group

    • The name "deputy_list_areas" says "list": a word for reading.
    Description, as the server wrote it
    List areas (Deputy OperationalUnits — the rosterable sections of a location, e.g. Kitchen, Front of house). Shifts and timesheets belong to an area. Optionally only one location's areas. Deputy: GET /api/v1/resource/OperationalUnit, or POST .../OperationalUnit/QUERY when filtered.

    Annotations the server declares

    • title: List areas
    • readOnlyHint: true
  • deputy_list_employeesSearch employees by name, location or active status.No findings

    Why it is in this group

    • The name "deputy_list_employees" says "list": a word for reading.
    Description, as the server wrote it
    Search employees by name, location or active status. Returns Id, DisplayName, Company (main location), Active, StartDate, Role and more. Deputy: POST /api/v1/resource/Employee/QUERY.

    Annotations the server declares

    • title: List employees
    • readOnlyHint: true
  • deputy_list_leaveSearch leave requests by employee, location, status and time window.No findings

    Why it is in this group

    • The name "deputy_list_leave" says "list": a word for reading.
    Description, as the server wrote it
    Search leave requests by employee, location, status and time window. Status: 0 awaiting approval, 1 approved, 2 declined, 3 cancelled, 4 date approved without pay, 5 pay approved without date. Start/End are unix; LeaveRule is the leave type id. Deputy: POST /api/v1/resource/Leave/QUERY.

    Annotations the server declares

    • title: List leave requests
    • readOnlyHint: true
  • deputy_list_locationsList the install's locations (workplaces).No findings

    Why it is in this group

    • The name "deputy_list_locations" says "list": a word for reading.
    Description, as the server wrote it
    List the install's locations (workplaces). Deputy calls a location a Company; its Id is what other tools take as location_id. Deputy: GET /api/v1/resource/Company.

    Annotations the server declares

    • title: List locations
    • readOnlyHint: true
  • deputy_list_shiftsSearch the roster (scheduled shifts) by time window, employee, area, and published/open state.No findings

    Why it is in this group

    • The name "deputy_list_shifts" says "list": a word for reading.
    Description, as the server wrote it
    Search the roster (scheduled shifts) by time window, employee, area, and published/open state. Each record has StartTime/EndTime (unix), StartTimeLocalized, Employee (0 or null when open), OperationalUnit (area), Published, Open, Cost and _DPMetaData with names. Deputy: POST /api/v1/resource/Roster/QUERY.

    Annotations the server declares

    • title: List shifts
    • readOnlyHint: true
  • deputy_list_timesheetsSearch timesheets (actual worked time) by time window, employee, area and approval state.No findings

    Why it is in this group

    • The name "deputy_list_timesheets" says "list": a word for reading.
    Description, as the server wrote it
    Search timesheets (actual worked time) by time window, employee, area and approval state. Each record has StartTime/EndTime (unix; EndTime null while in progress), TotalTime (hours), Cost, TimeApproved, PayRuleApproved, IsInProgress, IsLeave, Roster (linked shift) and Exported. Deputy: POST /api/v1/resource/Timesheet/QUERY.

    Annotations the server declares

    • title: List timesheets
    • readOnlyHint: true
  • deputy_whoamiReturn the Deputy user the token belongs to — name, employee id, company and permissions.No findings

    Why it is in this group

    • The name "deputy_whoami" says "whoami": a word for reading.
    Description, as the server wrote it
    Return the Deputy user the token belongs to — name, employee id, company and permissions. A cheap way to confirm DEPUTY_INSTALL and the token are right. Deputy: GET /api/v1/me.

    Annotations the server declares

    • title: Who am I
    • readOnlyHint: 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 untrusted-input.

Reads private data1
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write0
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out1
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.

Remote posture

What anyone on the internet sees at the remote endpoint: an anonymous initialize and tools/list, and the public OAuth metadata.

Looked at Oct 22, 2026, 15:27 UTC, unchanged since Oct 22, 2026. No credentials were sent and no tool was called. What is looked at.

Reachable
yes
HTTP status of an anonymous initialize
200
tools/list served without credentials
yes
Tools that change things, listed without credentials
9
Protocol version
2025-06-18
WWW-Authenticate on 401
not observed
resource_metadata in WWW-Authenticate
none
RFC 9728 protected resource metadata
https://deputy.usefulapi.io/.well-known/oauth-protected-resource/mcp
Authorization servers
https://deputy.usefulapi.io
Legacy HTTP+SSE transport
no
Dynamic client registration
yes
Client ID metadata documents
no
  • HighThe whole server

    The endpoint served tools/list without credentials, and the list has 9 tools that change things (8 destructive, 1 write). Whether a call also works without credentials was not tested: tools are never called.

    Matched text

    https://deputy.usefulapi.io/mcp: tools/list returned 21 tools to an anonymous client, including deputy_create_shift (destructive), deputy_update_shift (destructive), deputy_publish_shifts (destructive), deputy_create_leave_request (destructive), deputy_add_unavailability (destructive) and 4 more

    What this check looks for

Install

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

claude mcp add --transport http deputy https://deputy.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__deputy__deputy_whoami",
      "mcp__deputy__deputy_list_locations",
      "mcp__deputy__deputy_list_areas",
      "mcp__deputy__deputy_list_employees",
      "mcp__deputy__deputy_get_employee",
      "mcp__deputy__deputy_list_shifts",
      "mcp__deputy__deputy_get_shift",
      "mcp__deputy__deputy_list_timesheets",
      "mcp__deputy__deputy_get_timesheet",
      "mcp__deputy__deputy_list_leave",
      "mcp__deputy__deputy_get_employee_unavailability",
      "mcp__deputy__deputy_describe_resource"
    ],
    "ask": [
      "mcp__deputy__deputy_query_resource"
    ],
    "deny": [
      "mcp__deputy__deputy_create_shift",
      "mcp__deputy__deputy_update_shift",
      "mcp__deputy__deputy_publish_shifts",
      "mcp__deputy__deputy_create_leave_request",
      "mcp__deputy__deputy_add_unavailability",
      "mcp__deputy__deputy_create_memo",
      "mcp__deputy__deputy_update_timesheet",
      "mcp__deputy__deputy_approve_timesheet"
    ]
  }
}

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

Capability tags behind 2 rules
  • mcp__deputy__deputy_get_employee private-data
  • mcp__deputy__deputy_publish_shifts outbound