Skip to content

Sortly MCP by usefulapi

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

Search inventory items and folders, low-stock alerts, jobs and purchase orders, and update stock.

Deletes · 8

20 tools: 8 can delete or cancel things and 12 only read.

Scanned Oct 21, 2026

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

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

Tools

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

20 tools

Deletes or cancels 8Claude Code: deny
  • sortly_create_alertCreate a stock alert on an item (type Quantity, e.g.No findings

    Why it is in this group

    • The name "sortly_create_alert" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Create a stock alert on an item (type Quantity, e.g. threshold_method quantity_less_than with threshold_value 5, or less_than_or_equal_to_min_quantity), or a DateReminder on a datetime custom field (custom_attribute_id + before/after/same_day + threshold_interval). WRITE. Sortly: POST /api/v1/alerts.

    Annotations the server declares

    • title: Create an alert
    • destructiveHint: true
  • sortly_create_itemCreate a trackable item (type item) or a folder (type folder), optionally inside a folder via parent_id, with quantity, price, tags, custom fields, barcodes and a measured quantity…No findings

    Why it is in this group

    • The name "sortly_create_item" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Create a trackable item (type item) or a folder (type folder), optionally inside a folder via parent_id, with quantity, price, tags, custom fields, barcodes and a measured quantity. WRITE. Sortly: POST /api/v1/items.

    Annotations the server declares

    • title: Create an item or folder
    • destructiveHint: true
  • sortly_create_jobCreate a job (and its job folder) in not_started status.No findings

    Why it is in this group

    • The name "sortly_create_job" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Create a job (and its job folder) in not_started status. Name must be unique in the company. Then use sortly_pull_items_into_job to record the stock it uses. WRITE. Sortly: POST /api/v1/jobs.

    Annotations the server declares

    • title: Create a job
    • destructiveHint: true
  • sortly_create_purchase_orderCreate a purchase order in draft status (no stock or ordering happens until it is moved on in Sortly).No findings

    Why it is in this group

    • The name "sortly_create_purchase_order" says "create": a word for a change.
    • The name "sortly_create_purchase_order" also says "purchase": a word that usually means money moves, which cannot be taken back.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Create a purchase order in draft status (no stock or ordering happens until it is moved on in Sortly). Sortly computes amounts, sub_total and total from the lines; omit purchase_order_number to have one generated. Needs Purchase Orders on the plan (else 402). WRITE. Sortly: POST /api/v1/purchase_orders.

    Annotations the server declares

    • title: Draft a purchase order
    • destructiveHint: true
  • sortly_move_itemMove some or all of an item's quantity to another folder (items only — relocate a folder with sortly_update_item parent_id).No findings

    Why it is in this group

    • The name "sortly_move_item" says "move": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Move some or all of an item's quantity to another folder (items only — relocate a folder with sortly_update_item parent_id). A partial move splits off a new item with the same sid; a full move relocates the item; a matching item at the destination is merged, and the returned id is the destination's. Undo by moving it back. WRITE. Sortly: POST /api/v1/items/{item_id}/move.

    Annotations the server declares

    • title: Move stock to another folder
    • destructiveHint: true
  • sortly_pull_items_into_jobMove quantities of existing items (from any folders) into a job's folder — how usage on a job is recorded.No findings

    Why it is in this group

    • The description's first verb is "move": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Move quantities of existing items (from any folders) into a job's folder — how usage on a job is recorded. Up to 100 items per call; items are processed independently, so ALWAYS check data.errors (a partial failure still returns 200). Undo with sortly_return_items_from_job. Returns 403 on a completed job. WRITE. Sortly: POST /api/v1/jobs/{job_id}/items.

    Annotations the server declares

    • title: Pull items into a job
    • destructiveHint: true
  • sortly_return_items_from_jobMove items off a job's folder back into inventory (destination_folder_id, or All Items if omitted).No findings

    Why it is in this group

    • The description's first verb is "move": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Move items off a job's folder back into inventory (destination_folder_id, or All Items if omitted). Up to 100 per call; check data.errors — items are processed one by one. WRITE. Sortly: POST /api/v1/jobs/{job_id}/items/return.

    Annotations the server declares

    • title: Return items from a job
    • destructiveHint: true
  • sortly_update_itemChange fields on an existing item or folder — e.g.No findings

    Why it is in this group

    • The name "sortly_update_item" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Change fields on an existing item or folder — e.g. set a new quantity after a stock count, rename it, or relocate a folder via parent_id. Only the fields you pass change; pass null to clear a nullable field. Sending tags or custom_attribute_values replaces them. WRITE. Sortly: PUT /api/v1/items/{item_id} (returns 204).

    Annotations the server declares

    • title: Update an item or folder
    • destructiveHint: true
Only reads 12Claude Code: allow
  • sortly_get_itemFetch a single item or folder by numeric id: quantity, min_quantity, price, tags, sid, barcodes, and optionally custom field values and photos.No findings

    Why it is in this group

    • The name "sortly_get_item" says "get": a word for reading.
    Description, as the server wrote it
    Fetch a single item or folder by numeric id: quantity, min_quantity, price, tags, sid, barcodes, and optionally custom field values and photos. Sortly: GET /api/v1/items/{item_id}.

    Annotations the server declares

    • title: Get one item or folder
    • readOnlyHint: true
  • sortly_get_jobFetch a single job: status, folder_id (where its pulled items sit), dates, notes, custom field values and the version needed for updates.No findings

    Why it is in this group

    • The name "sortly_get_job" says "get": a word for reading.
    Description, as the server wrote it
    Fetch a single job: status, folder_id (where its pulled items sit), dates, notes, custom field values and the version needed for updates. Sortly: GET /api/v1/jobs/{job_id}.

    Annotations the server declares

    • title: Get one job
    • readOnlyHint: true
  • sortly_get_purchase_orderFetch a single purchase order with its line_items (quantity vs received_quantity), vendor, addresses, charges, totals and version.No findings

    Why it is in this group

    • The name "sortly_get_purchase_order" says "get": a word for reading.
    Description, as the server wrote it
    Fetch a single purchase order with its line_items (quantity vs received_quantity), vendor, addresses, charges, totals and version. Sortly: GET /api/v1/purchase_orders/{purchase_order_id}.

    Annotations the server declares

    • title: Get one purchase order
    • readOnlyHint: true
  • sortly_get_purchase_order_receive_statusReport the most recent receive against a purchase order: pending / completed / failed, with the line ids received, pending and failed (and why).No findings

    Why it is in this group

    • The name "sortly_get_purchase_order_receive_status" says "get": a word for reading.
    Description, as the server wrote it
    Report the most recent receive against a purchase order: pending / completed / failed, with the line ids received, pending and failed (and why). Returns 404 until something has been received. Sortly: GET /api/v1/purchase_orders/{purchase_order_id}/receive/status.

    Annotations the server declares

    • title: Get a purchase order's receive status
    • readOnlyHint: true
  • sortly_list_alertsList stock (Quantity) and date (DateReminder) alerts, with is_fired showing which have already triggered — the quick way to find low-stock items.No findings

    Why it is in this group

    • The name "sortly_list_alerts" says "list": a word for reading.
    Description, as the server wrote it
    List stock (Quantity) and date (DateReminder) alerts, with is_fired showing which have already triggered — the quick way to find low-stock items. Sortly: GET /api/v1/alerts.

    Annotations the server declares

    • title: List alerts
    • readOnlyHint: true
  • sortly_list_custom_fieldsList the account's custom fields (id, name, type, applies_to).No findings

    Why it is in this group

    • The name "sortly_list_custom_fields" says "list": a word for reading.
    Description, as the server wrote it
    List the account's custom fields (id, name, type, applies_to). Call this before writing custom_attribute_values to get the right custom_attribute_id. Sortly: GET /api/v1/custom_fields.

    Annotations the server declares

    • title: List custom fields
    • readOnlyHint: true
  • sortly_list_itemsList items and folders, newest first.No findings

    Why it is in this group

    • The name "sortly_list_items" says "list": a word for reading.
    Description, as the server wrote it
    List items and folders, newest first. By default the root level; pass folder_id for a folder's direct contents, plus include_subfolders for everything nested under it. Paginated via meta.next_page_url / total_pages. Sortly: GET /api/v1/items.

    Annotations the server declares

    • title: List items and folders
    • readOnlyHint: true
  • sortly_list_jobsList jobs (work orders that pull stock out), most recently updated first, filterable by name prefix and status.No findings

    Why it is in this group

    • The name "sortly_list_jobs" says "list": a word for reading.
    Description, as the server wrote it
    List jobs (work orders that pull stock out), most recently updated first, filterable by name prefix and status. Paginated via meta.pagination.has_next. Sortly: GET /api/v1/jobs.

    Annotations the server declares

    • title: List jobs
    • readOnlyHint: true
  • sortly_list_purchase_ordersList purchase orders, most recently updated first, filterable by PO number and status.No findings

    Why it is in this group

    • The name "sortly_list_purchase_orders" says "list": a word for reading.
    Description, as the server wrote it
    List purchase orders, most recently updated first, filterable by PO number and status. The list leaves out notes, terms, sub_total and line_items — use sortly_get_purchase_order for those. Needs Purchase Orders on the plan (else 402). Sortly: GET /api/v1/purchase_orders.

    Annotations the server declares

    • title: List purchase orders
    • readOnlyHint: true
  • sortly_list_recently_updated_itemsList items and folders changed since a Unix timestamp — the incremental-sync read ('what moved since yesterday?').No findings

    Why it is in this group

    • The name "sortly_list_recently_updated_items" says "list": a word for reading.
    Description, as the server wrote it
    List items and folders changed since a Unix timestamp — the incremental-sync read ('what moved since yesterday?'). Without updated_since it behaves like sortly_list_items. Sortly: GET /api/v1/items/recent.

    Annotations the server declares

    • title: List recently updated items
    • readOnlyHint: true
  • sortly_list_unitsList the units of measure available to the account (unit_name, unit_type, scale) — the values measured_quantity and purchase-order lines expect.No findings

    Why it is in this group

    • The name "sortly_list_units" says "list": a word for reading.
    Description, as the server wrote it
    List the units of measure available to the account (unit_name, unit_type, scale) — the values measured_quantity and purchase-order lines expect. Sortly: GET /api/v1/units.

    Annotations the server declares

    • title: List units of measure
    • readOnlyHint: true
  • sortly_search_itemsSearch items and folders by name, optionally limited to items or folders and scoped to specific folders.No findings

    Why it is in this group

    • The name "sortly_search_items" says "search": a word for reading.
    Description, as the server wrote it
    Search items and folders by name, optionally limited to items or folders and scoped to specific folders. Read-only despite being a POST. Paginated: send the same arguments with the next page number. Sortly: POST /api/v1/items/search.

    Annotations the server declares

    • title: Search inventory
    • 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.

Install

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

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

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__sortly__sortly_list_items",
      "mcp__sortly__sortly_get_item",
      "mcp__sortly__sortly_search_items",
      "mcp__sortly__sortly_list_recently_updated_items",
      "mcp__sortly__sortly_list_custom_fields",
      "mcp__sortly__sortly_list_units",
      "mcp__sortly__sortly_list_alerts",
      "mcp__sortly__sortly_list_jobs",
      "mcp__sortly__sortly_get_job",
      "mcp__sortly__sortly_list_purchase_orders",
      "mcp__sortly__sortly_get_purchase_order",
      "mcp__sortly__sortly_get_purchase_order_receive_status"
    ],
    "ask": [],
    "deny": [
      "mcp__sortly__sortly_create_item",
      "mcp__sortly__sortly_update_item",
      "mcp__sortly__sortly_move_item",
      "mcp__sortly__sortly_create_alert",
      "mcp__sortly__sortly_create_job",
      "mcp__sortly__sortly_pull_items_into_job",
      "mcp__sortly__sortly_return_items_from_job",
      "mcp__sortly__sortly_create_purchase_order"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as sortly. Review it before you use it.