Skip to content

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.

Tools: 7 delete, 0 irreversible, 0 write, 22 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.
Can send data out1
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
deny to break every path
{
  "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/mcp
claude mcp add --transport http upkeep https://upkeep.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__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.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for io.usefulapi/upkeep
[![anlyon.dev](https://anlyon.dev/badge/io.usefulapi/upkeep.svg)](https://anlyon.dev/servers/io.usefulapi/upkeep)

Source: MCP Registry · repository. Synced Oct 24, 2026, 11:18 UTC.