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.
20 tools: 8 can delete or cancel things and 12 only read.
Scanned Oct 21, 2026
- Deletes or cancels8Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads12Claude Code: allow: see these tools
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/mcpTools
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/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .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.