UpKeep MCP by usefulapi
io.usefulapi/upkeepusefulapi.iostreamable-httpv1.0.0Scanned
Read UpKeep work orders, assets, parts and meters; create requests and work orders.
29 tools: 7 can delete or cancel things and 22 only read.
- Reads private data · 4
- Reads text others write · 29
- Can send data out · 1
- No findings
Anlyon alternative
7 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.
29 tools
Deletes or cancels 7Claude Code: deny
upkeep_add_meter_readingWRITE: record a new reading on a meter (for example engine hours or mileage).Reads text others writeNo findings
Why it is in this group
- The name "upkeep_add_meter_reading" says "add": 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 a new reading on a meter (for example engine hours or mileage). A reading cannot be removed with this server, and a meter notification can create a work order automatically when its condition is met. POST /meters/{id}/readings.
Annotations the server declares
- title: Add meter reading
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
upkeep_add_work_order_messageWRITE: post a message (comment) on a work order's activity thread; people following the work order may be notified.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "upkeep_add_work_order_message" says "add": 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.
- outboundThe name "upkeep_add_work_order_message" says "add" and "message": it writes something other people read.
Description, as the server wrote it WRITE: post a message (comment) on a work order's activity thread; people following the work order may be notified. POST /work-orders/{id}/update-messages.
Annotations the server declares
- title: Add work order message
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
upkeep_approve_requestWRITE: approve a pending work request, which converts it into a work order (it may notify the assignee).Reads text others writeNo findings
Why it is in this group
- The name "upkeep_approve_request" says "approve": 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: approve a pending work request, which converts it into a work order (it may notify the assignee). Needs a token whose role may approve requests. Approving a request that is already approved or declined fails with HTTP 409. POST /requests/{id}/approve.
Annotations the server declares
- title: Approve work request
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
upkeep_create_requestWRITE: submit a new work request for the maintenance team to approve (it appears in UpKeep's Requests list and may notify the approvers or the assignee).Reads text others writeNo findings
Why it is in this group
- The name "upkeep_create_request" 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: submit a new work request for the maintenance team to approve (it appears in UpKeep's Requests list and may notify the approvers or the assignee). It is not a work order until approved. If the account has a request form configured, pass its field labels in `fields`. POST /requests.
Annotations the server declares
- title: Create work request
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
upkeep_create_work_orderWRITE: create a new work order (it may notify the assignee and appears in UpKeep's work order board).Reads text others writeNo findings
Why it is in this group
- The name "upkeep_create_work_order" 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: create a new work order (it may notify the assignee and appears in UpKeep's work order board). Ids for asset, location and assignee come from the list tools. POST /work-orders.
Annotations the server declares
- title: Create work order
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
upkeep_update_part_quantityWRITE: set the quantity on hand (and optionally the minimum quantity that triggers a low-stock notification) of a part.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_update_part_quantity" says "update": 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: set the quantity on hand (and optionally the minimum quantity that triggers a low-stock notification) of a part. This overwrites the stored number: read the part first and pass the new total, not the difference. PATCH /parts/{id}.
Annotations the server declares
- title: Update part quantity
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
upkeep_update_work_orderWRITE: change fields of an existing work order: status (open, onHold, inProgress, complete), title, description, priority, due date or assignee.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_update_work_order" says "update": 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: change fields of an existing work order: status (open, onHold, inProgress, complete), title, description, priority, due date or assignee. Only the fields you pass change; completing a work order may trigger the account's integrations (for example Zapier). Archiving and deleting are not offered. PATCH /work-orders/{id}.
Annotations the server declares
- title: Update work order
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
Only reads 22Show 22 read-only tools
upkeep_get_accountConfirm the UpKeep API token is active: returns the company id, the token's name, when it was created and when it was last used.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_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 Confirm the UpKeep API token is active: returns the company id, the token's name, when it was created and when it was last used. GET /api/v1/organization-api-tokens/introspect.
Annotations the server declares
- title: Check API token
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_get_assetOne asset by id with purchase and warranty details, custom fields and (optionally) assigned users, teams, vendors, parts, files and sub-assets.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "upkeep_get_asset" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "file": it reads files.
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One asset by id with purchase and warranty details, custom fields and (optionally) assigned users, teams, vendors, parts, files and sub-assets. GET /assets/{id}.
Annotations the server declares
- title: Get asset
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_get_locationOne location by id.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_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
upkeep_get_meterOne meter by id.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_get_meter" 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 meter by id. GET /meters/{id}.
Annotations the server declares
- title: Get meter
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_get_partOne part by id with quantity, cost, location and custom fields.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_get_part" 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 part by id with quantity, cost, location and custom fields. GET /parts/{id}.
Annotations the server declares
- title: Get part
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_get_purchase_orderOne purchase order by id with its parts, quantities, costs and shipping details.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_get_purchase_order" 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 purchase order by id with its parts, quantities, costs and shipping details. GET /purchase-orders/{id}.
Annotations the server declares
- title: Get purchase order
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_get_requestOne work request by id with its form fields and, once approved, the linked work order id.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_get_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 work request by id with its form fields and, once approved, the linked work order id. GET /requests/{id}.
Annotations the server declares
- title: Get work request
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_get_userOne user by id.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_get_user" 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 user by id. GET /users/{id}.
Annotations the server declares
- title: Get user
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_get_work_orderOne work order by id with its checklist items, custom fields, time log, parts and files.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "upkeep_get_work_order" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "file": it reads files.
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One work order by id with its checklist items, custom fields, time log, parts and files. GET /work-orders/{id}.
Annotations the server declares
- title: Get work order
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_assetsList assets (equipment) with name, model, serial and barcode, location, status, downtime status, warranty and number of open work orders.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_list_assets" 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 assets (equipment) with name, model, serial and barcode, location, status, downtime status, warranty and number of open work orders. Filter by name, serial number, barcode, location, status, category or assignee. GET /assets.
Annotations the server declares
- title: List assets
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_customersList customers (the parties whose assets or locations you maintain) with contact details.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "upkeep_list_customers" says "list": a word for reading.
What it can reach
- private-dataThe description's first sentence says "list" and "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 List customers (the parties whose assets or locations you maintain) with contact details. GET /customers.
Annotations the server declares
- title: List customers
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_locationsList locations (sites, buildings, rooms) with address, barcode, parent location and hierarchy level.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_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 locations (sites, buildings, rooms) with address, barcode, parent location and hierarchy level. GET /locations.
Annotations the server declares
- title: List locations
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_meter_readingsReadings recorded for one meter (value, date, who recorded it), newest first.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_list_meter_readings" 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 Readings recorded for one meter (value, date, who recorded it), newest first. GET /meters/{id}/readings.
Annotations the server declares
- title: List meter readings
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_metersList meters (usage counters such as hours, mileage, temperature) with units, reading frequency and the asset or location they belong to.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_list_meters" 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 meters (usage counters such as hours, mileage, temperature) with units, reading frequency and the asset or location they belong to. GET /meters.
Annotations the server declares
- title: List meters
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_partsList spare parts with quantity on hand, minimum quantity, cost, category, location and part number.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_list_parts" 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 spare parts with quantity on hand, minimum quantity, cost, category, location and part number. Compare quantity with minimumQuantity to find parts to reorder. GET /parts.
Annotations the server declares
- title: List parts
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_preventive_maintenanceList preventive maintenance (PM) templates, the recurring work that generates scheduled work orders, with their schedules.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_list_preventive_maintenance" 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 preventive maintenance (PM) templates, the recurring work that generates scheduled work orders, with their schedules. Filter by text, asset, location, assignee, team or priority. Pages are 1-based. GET /pm.
Annotations the server declares
- title: List preventive maintenance plans
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_purchase_ordersList purchase orders with status (awaiting, approved, declined, fulfilled), vendor, dates, total cost and quantities.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_list_purchase_orders" 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 purchase orders with status (awaiting, approved, declined, fulfilled), vendor, dates, total cost and quantities. GET /purchase-orders.
Annotations the server declares
- title: List purchase orders
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_requestsList work requests submitted by staff or through the request portal (before they become work orders), with status open/approved/rejected.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_list_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 work requests submitted by staff or through the request portal (before they become work orders), with status open/approved/rejected. GET /requests.
Annotations the server declares
- title: List work requests
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_teamsList teams with name and description.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_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 teams with name and description. Use the ids to assign work. GET /teams.
Annotations the server declares
- title: List teams
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_usersList UpKeep users (technicians, admins, requesters) with account type, job title, status and last login.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_list_users" 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 UpKeep users (technicians, admins, requesters) with account type, job title, status and last login. Use the ids to assign work orders. GET /users.
Annotations the server declares
- title: List users
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_vendorsList vendors (suppliers and contractors) with contact details.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "upkeep_list_vendors" says "list": a word for reading.
What it can reach
- private-dataThe description's first sentence says "list" and "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 List vendors (suppliers and contractors) with contact details. GET /vendors.
Annotations the server declares
- title: List vendors
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
upkeep_list_work_ordersList work orders (reactive and preventive), newest first, with status, priority, due date, asset, location, assignee, parts, time and cost.Reads text others writeNo findings
Why it is in this group
- The name "upkeep_list_work_orders" 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 work orders (reactive and preventive), newest first, with status, priority, due date, asset, location, assignee, parts, time and cost. Filter by status, completion, priority, category, asset, location, assignee, title or date ranges. GET /work-orders.
Annotations the server declares
- title: List work orders
- 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.
116 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 1 outbound tool breaks every one.
- Reads private data4
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write29
- 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.
{
"permissions": {
"deny": [
"mcp__upkeep__upkeep_add_work_order_message"
]
}
}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 upkeep https://upkeep.usefulapi.io/mcpclaude mcp add --transport http upkeep https://upkeep.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__upkeep__upkeep_get_account",
"mcp__upkeep__upkeep_list_work_orders",
"mcp__upkeep__upkeep_get_work_order",
"mcp__upkeep__upkeep_list_assets",
"mcp__upkeep__upkeep_get_asset",
"mcp__upkeep__upkeep_list_locations",
"mcp__upkeep__upkeep_get_location",
"mcp__upkeep__upkeep_list_parts",
"mcp__upkeep__upkeep_get_part",
"mcp__upkeep__upkeep_list_meters",
"mcp__upkeep__upkeep_get_meter",
"mcp__upkeep__upkeep_list_meter_readings",
"mcp__upkeep__upkeep_list_requests",
"mcp__upkeep__upkeep_get_request",
"mcp__upkeep__upkeep_list_users",
"mcp__upkeep__upkeep_get_user",
"mcp__upkeep__upkeep_list_teams",
"mcp__upkeep__upkeep_list_vendors",
"mcp__upkeep__upkeep_list_customers",
"mcp__upkeep__upkeep_list_purchase_orders",
"mcp__upkeep__upkeep_get_purchase_order",
"mcp__upkeep__upkeep_list_preventive_maintenance"
],
"ask": [],
"deny": [
"mcp__upkeep__upkeep_add_meter_reading",
"mcp__upkeep__upkeep_create_request",
"mcp__upkeep__upkeep_approve_request",
"mcp__upkeep__upkeep_create_work_order",
"mcp__upkeep__upkeep_update_work_order",
"mcp__upkeep__upkeep_add_work_order_message",
"mcp__upkeep__upkeep_update_part_quantity"
]
}
}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 upkeep. Review it before you use it.
Capability tags behind 29 rules
- mcp__upkeep__upkeep_get_account untrusted-input
- mcp__upkeep__upkeep_list_work_orders untrusted-input
- mcp__upkeep__upkeep_get_work_order private-data, untrusted-input
- mcp__upkeep__upkeep_list_assets untrusted-input
- mcp__upkeep__upkeep_get_asset private-data, untrusted-input
- mcp__upkeep__upkeep_list_locations untrusted-input
- mcp__upkeep__upkeep_get_location untrusted-input
- mcp__upkeep__upkeep_list_parts untrusted-input
- mcp__upkeep__upkeep_get_part untrusted-input
- mcp__upkeep__upkeep_list_meters untrusted-input
- mcp__upkeep__upkeep_get_meter untrusted-input
- mcp__upkeep__upkeep_list_meter_readings untrusted-input
- mcp__upkeep__upkeep_add_meter_reading untrusted-input
- mcp__upkeep__upkeep_list_requests untrusted-input
- mcp__upkeep__upkeep_get_request untrusted-input
- mcp__upkeep__upkeep_create_request untrusted-input
- mcp__upkeep__upkeep_approve_request untrusted-input
- mcp__upkeep__upkeep_create_work_order untrusted-input
- mcp__upkeep__upkeep_update_work_order untrusted-input
- mcp__upkeep__upkeep_add_work_order_message untrusted-input, outbound
- mcp__upkeep__upkeep_update_part_quantity untrusted-input
- mcp__upkeep__upkeep_list_users untrusted-input
- mcp__upkeep__upkeep_get_user untrusted-input
- mcp__upkeep__upkeep_list_teams untrusted-input
- mcp__upkeep__upkeep_list_vendors private-data, untrusted-input
- mcp__upkeep__upkeep_list_customers private-data, untrusted-input
- mcp__upkeep__upkeep_list_purchase_orders untrusted-input
- mcp__upkeep__upkeep_get_purchase_order untrusted-input
- mcp__upkeep__upkeep_list_preventive_maintenance 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/upkeep/verify?hash=b3ca50a220aa054fa473ee3c1a715bfa3c2c4ded4d078dcb01b148cb403e815c" | jq -e '.changed == false'Pinned hash b3ca50a220aa, 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/upkeep/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.usefulapi/upkeep)Source: MCP Registry · repository. Synced Oct 24, 2026, 11:18 UTC.