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.
21 tools: 8 can delete or cancel things, 1 change things and 12 only read.
Scanned Oct 22, 2026
- Deletes or cancels8Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things1Claude Code: ask: see these tools
- Only reads12Claude Code: allow: see these tools
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/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "deputy_query_resource" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The name "deputy_query_resource" says "query": a word for reading.
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_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".
What this check looks forMatched text
annotations: {"readOnlyHint":true}; The name "deputy_query_resource" says "query": a word for reading.
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_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.
What this check looks forMatched 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
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/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__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