SkuVault MCP by usefulapi
MCP server for SkuVault — products, inventory, sales, purchase orders and stock adjustments.The vendor's description, from its MCP Registry listing.
Every public check ran and passed. Public audit: we connect as an AI client would, list the tools and check what they say. We do not run them. How we audit
- Does it work?
- YesConnected in 236 ms.
- Sign-up?
- None neededIt answered without any account or key.
- Can it change things?
- YesSome tools say they can change things. Your AI client should ask you first.
https://skuvault.usefulapi.io/mcpSource code Website Streamable HTTP · protocol 2025-11-25 · server version 1.10.1
What we checked
Security
Passed: Connections are encrypted (HTTPS).
Passed: No hidden instructions found in tool text.
Safety labels
Note: 3 tools are labelled as able to change things.
Expected for tools that send, write or buy. Your AI client should ask before calling them.
- skuvault_add_stock
- skuvault_remove_stock
- skuvault_set_stock_quantity
Passed: Every tool says whether it only reads or can change things.
Tools
Passed: 22 tools listed.
Passed: Every tool describes its inputs with a valid schema.
Protocol
Passed: The MCP handshake works (Streamable HTTP).
Passed: Protocol version 2025-11-25 (latest).
Passed: Unknown requests are refused.
Connection
Passed: The server responds.
Tools (22)
As the server describes them. The labels are the server's own: it says whether each tool only reads or can change things.
- skuvault_list_warehousesList the regular warehouses (Id and Code). The numeric Id is what the stock tools and skuvault_list_transactions need. SkuVault throttles this call to 1 per minute. POST /inventory/getWarehouses.Read-only
- skuvault_list_locationsList the locations in enabled warehouses with warehouse, location code, parent location/container and total quantity. Heavy throttling (5/min). POST /inventory/getLocations.Read-only
- skuvault_list_productsList products (not kits) with description, cost, prices, brand, supplier, classification, reorder point and quantities (on hand, available, pending, picked, incoming...). Filter by SKU or code, or by…Read-only
- skuvault_get_productOne product (not a kit) by SKU or by code: details plus all quantities (on hand, available, pending, picked, incoming, in stock). Give exactly one of sku or code. Light throttling (20/min). POST /pro…Read-only
- skuvault_list_kitsList kits with their component lines, optional available quantity and cost. Needs a modified-time window (defaults to all time). The page size is not documented: keep following `next` until a page co…Read-only
- skuvault_list_brandsList the brands created in SkuVault (Name, IsEnabled), 1,000 per page. Heavy throttling (5/min). POST /products/getBrands.Read-only
- skuvault_list_suppliersList the suppliers in the account (Name, IsEnabled), 10,000 per page. Heavy throttling (5/min). POST /products/getSuppliers.Read-only
- skuvault_list_classificationsList product classifications and their named attributes, 1,000 per page. Heavy throttling (5/min). POST /products/getClassifications.Read-only
- skuvault_get_inventory_by_locationWhere each product is stored: per SKU (or code) the locations with warehouse code, quantity and whether the location is a reserve location. Filter by SKUs or by codes (not both). Heavy throttling (5/…Read-only
- skuvault_get_available_quantitiesSellable (available) quantity per SKU across all warehouses, with last-modified time. Use modified_after to see only what changed. Heavy throttling (5/min). POST /inventory/getAvailableQuantities.Read-only
- skuvault_get_item_quantitiesProduct quantities per SKU: total on hand, available, held, pending and picked. Filter by product codes or modification time. Heavy throttling (5/min). POST /inventory/getItemQuantities.Read-only
- skuvault_get_warehouse_quantitiesSKUs and quantities held in one warehouse. Get the warehouse id from skuvault_list_warehouses. Heavy throttling (5/min). POST /inventory/getWarehouseItemQuantities.Read-only
- skuvault_list_transactionsInventory transaction history (adds, removes, picks, creates) with user, SKU, quantity before/after, location, reason, note and the sale it belongs to. The date range may span at most 7 days. Filter…Read-only
- skuvault_list_salesList sales (orders) that are ReadyToShip (default) or Pending, or look up specific sales by order id (then status is ignored): items, kits, shipping and contact info, totals. Not paged by the vendor.…Read-only
- skuvault_list_sales_by_dateSales within a date range, by sale date or by last-modified date: items, kits, fulfillment/processed quantities, shipping, contact info and totals. The date range may span at most 7 days. The most co…Read-only
- skuvault_list_sold_itemsItems sold in a date range: date, SKU, quantity and total price per line, optionally breaking kits into components and including transfer sales. The date range may span at most 14 days. Heavy throttl…Read-only
- skuvault_list_purchase_ordersList purchase orders with supplier, dates, status, payment status, costs and line items (SKU, quantity, received quantity). By default completed POs are left out: set status Completed to see them. Sp…Read-only
- skuvault_list_po_receivesPurchase-order receiving history: what was received (SKU, quantity, location, user, dates) followed by quantity corrections. Filter by warehouse codes, PO numbers or received time. Heavy throttling (…Read-only
- skuvault_list_integrationsList the enabled sales-channel accounts (Amazon, ChannelAdvisor, Shopify...): Id, LongId, Name and Type. Severe throttling (1/min). POST /integration/getIntegrations.Read-only
- skuvault_add_stockWRITE: add quantity of a product to a warehouse location (a transaction in SkuVault's history; every call adds again, so do not retry blindly). The transaction reason must already exist in SkuVault.…Can change things
- skuvault_remove_stockWRITE: remove quantity of a product from a warehouse location (a transaction in SkuVault's history; every call removes again, so do not retry blindly). The transaction reason must already exist in Sk…Can change things
- skuvault_set_stock_quantityWRITE: set the exact quantity of a product at one warehouse location, overwriting what is there (running it again with the same values changes nothing more). Use skuvault_get_inventory_by_location fi…Can change things
Audit history
- Nov 13Passed
What we sent
Every request in this audit, with the answer and how long it took. We never send credentials and never call a tool.
| Request | Answer | Time |
|---|---|---|
| initialize | HTTP 200 | 236 ms |
| initialized | HTTP 202 | 36 ms |
| tools/list | HTTP 200 | 91 ms |
| prompts/list | HTTP 200 | 44 ms |
| unknown-method | HTTP 401 | 28 ms |
Run this server, or disagree with the result?
Fix the issue and it shows in the next weekly audit, or email us to ask for a re-audit or to dispute a finding. Read how we audit for what each check means.
{
"mcpServers": {
"io-usefulapi-skuvault": {
"type": "http",
"url": "https://skuvault.usefulapi.io/mcp"
}
}
}{
"server": {
"name": "io.usefulapi/skuvault",
"title": "SkuVault MCP by usefulapi",
"url": "https://skuvault.usefulapi.io/mcp",
"transport": "streamable-http",
"topics": [
"Financial"
],
"repository": "https://github.com/m190/usefulapi-mcp",
"website": "https://usefulapi.io/skuvault/",
"inRegistry": true
},
"audit": {
"slug": "io-usefulapi-skuvault",
"url": "https://skuvault.usefulapi.io/mcp",
"auditedAt": "2026-11-13T16:27:45.275Z",
"firstAuditedAt": "2026-11-13T15:59:30.587Z",
"auditor": "1.0.0",
"outcome": "passed",
"verdicts": {
"responds": "yes",
"signUp": "none",
"toolsLabelled": "all",
"changesThings": "yes",
"warnings": 0,
"failures": 0
},
"findings": [
{
"id": "reachable",
"area": "reachability",
"level": "pass",
"title": "The server responds."
},
{
"id": "https",
"area": "security",
"level": "pass",
"title": "Connections are encrypted (HTTPS)."
},
{
"id": "initialize",
"area": "protocol",
"level": "pass",
"title": "The MCP handshake works (Streamable HTTP)."
},
{
"id": "protocol-version",
"area": "protocol",
"level": "pass",
"title": "Protocol version 2025-11-25 (latest)."
},
{
"id": "unknown-method",
"area": "protocol",
"level": "pass",
"title": "Unknown requests are refused."
},
{
"id": "tools-list",
"area": "tools",
"level": "pass",
"title": "22 tools listed."
},
{
"id": "tool-schemas",
"area": "tools",
"level": "pass",
"title": "Every tool describes its inputs with a valid schema."
},
{
"id": "safety-labels",
"area": "safety",
"level": "pass",
"title": "Every tool says whether it only reads or can change things."
},
{
"id": "changes-things",
"area": "safety",
"level": "info",
"title": "3 tools are labelled as able to change things.",
"detail": "Expected for tools that send, write or buy. Your AI client should ask before calling them.",
"evidence": [
"skuvault_add_stock",
"skuvault_remove_stock",
"skuvault_set_stock_quantity"
]
},
{
"id": "tool-poisoning",
"area": "security",
"level": "pass",
"title": "No hidden instructions found in tool text."
}
],
"server": {
"name": "skuvault-mcp",
"version": "1.10.1",
"title": "SkuVault MCP by usefulapi",
"protocolVersion": "2025-11-25",
"transport": "streamable-http"
},
"toolCount": 22,
"toolsHash": "46a2698df53ce9a73b3f35df3bf56ae0065c7edc2578100357c66964cf69b57c",
"latencyMs": 236,
"history": [
{
"date": "2026-11-13",
"outcome": "passed",
"tools": 22
}
]
},
"tools": [
{
"name": "skuvault_list_warehouses",
"title": "List warehouses",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List the regular warehouses (Id and Code). The numeric Id is what the stock tools and skuvault_list_transactions need. SkuVault throttles this call to 1 per minute. POST /inventory/getWarehouses."
},
{
"name": "skuvault_list_locations",
"title": "List locations",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List the locations in enabled warehouses with warehouse, location code, parent location/container and total quantity. Heavy throttling (5/min). POST /inventory/getLocations."
},
{
"name": "skuvault_list_products",
"title": "List products",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List products (not kits) with description, cost, prices, brand, supplier, classification, reorder point and quantities (on hand, available, pending, picked, incoming...). Filter by SKU or code, or by…"
},
{
"name": "skuvault_get_product",
"title": "Get product",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "One product (not a kit) by SKU or by code: details plus all quantities (on hand, available, pending, picked, incoming, in stock). Give exactly one of sku or code. Light throttling (20/min). POST /pro…"
},
{
"name": "skuvault_list_kits",
"title": "List kits",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List kits with their component lines, optional available quantity and cost. Needs a modified-time window (defaults to all time). The page size is not documented: keep following `next` until a page co…"
},
{
"name": "skuvault_list_brands",
"title": "List brands",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List the brands created in SkuVault (Name, IsEnabled), 1,000 per page. Heavy throttling (5/min). POST /products/getBrands."
},
{
"name": "skuvault_list_suppliers",
"title": "List suppliers",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List the suppliers in the account (Name, IsEnabled), 10,000 per page. Heavy throttling (5/min). POST /products/getSuppliers."
},
{
"name": "skuvault_list_classifications",
"title": "List classifications",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List product classifications and their named attributes, 1,000 per page. Heavy throttling (5/min). POST /products/getClassifications."
},
{
"name": "skuvault_get_inventory_by_location",
"title": "Get inventory by location",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Where each product is stored: per SKU (or code) the locations with warehouse code, quantity and whether the location is a reserve location. Filter by SKUs or by codes (not both). Heavy throttling (5/…"
},
{
"name": "skuvault_get_available_quantities",
"title": "Get available quantities",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Sellable (available) quantity per SKU across all warehouses, with last-modified time. Use modified_after to see only what changed. Heavy throttling (5/min). POST /inventory/getAvailableQuantities."
},
{
"name": "skuvault_get_item_quantities",
"title": "Get item quantities",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Product quantities per SKU: total on hand, available, held, pending and picked. Filter by product codes or modification time. Heavy throttling (5/min). POST /inventory/getItemQuantities."
},
{
"name": "skuvault_get_warehouse_quantities",
"title": "Get warehouse quantities",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "SKUs and quantities held in one warehouse. Get the warehouse id from skuvault_list_warehouses. Heavy throttling (5/min). POST /inventory/getWarehouseItemQuantities."
},
{
"name": "skuvault_list_transactions",
"title": "List inventory transactions",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Inventory transaction history (adds, removes, picks, creates) with user, SKU, quantity before/after, location, reason, note and the sale it belongs to. The date range may span at most 7 days. Filter…"
},
{
"name": "skuvault_list_sales",
"title": "List sales by status",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List sales (orders) that are ReadyToShip (default) or Pending, or look up specific sales by order id (then status is ignored): items, kits, shipping and contact info, totals. Not paged by the vendor.…"
},
{
"name": "skuvault_list_sales_by_date",
"title": "List sales by date",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Sales within a date range, by sale date or by last-modified date: items, kits, fulfillment/processed quantities, shipping, contact info and totals. The date range may span at most 7 days. The most co…"
},
{
"name": "skuvault_list_sold_items",
"title": "List sold items",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Items sold in a date range: date, SKU, quantity and total price per line, optionally breaking kits into components and including transfer sales. The date range may span at most 14 days. Heavy throttl…"
},
{
"name": "skuvault_list_purchase_orders",
"title": "List purchase orders",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List purchase orders with supplier, dates, status, payment status, costs and line items (SKU, quantity, received quantity). By default completed POs are left out: set status Completed to see them. Sp…"
},
{
"name": "skuvault_list_po_receives",
"title": "List purchase order receives",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Purchase-order receiving history: what was received (SKU, quantity, location, user, dates) followed by quantity corrections. Filter by warehouse codes, PO numbers or received time. Heavy throttling (…"
},
{
"name": "skuvault_list_integrations",
"title": "List sales channel accounts",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "List the enabled sales-channel accounts (Amazon, ChannelAdvisor, Shopify...): Id, LongId, Name and Type. Severe throttling (1/min). POST /integration/getIntegrations."
},
{
"name": "skuvault_add_stock",
"title": "Add stock",
"readOnly": false,
"destructive": false,
"openWorld": true,
"description": "WRITE: add quantity of a product to a warehouse location (a transaction in SkuVault's history; every call adds again, so do not retry blindly). The transaction reason must already exist in SkuVault.…"
},
{
"name": "skuvault_remove_stock",
"title": "Remove stock",
"readOnly": false,
"destructive": true,
"openWorld": true,
"description": "WRITE: remove quantity of a product from a warehouse location (a transaction in SkuVault's history; every call removes again, so do not retry blindly). The transaction reason must already exist in Sk…"
},
{
"name": "skuvault_set_stock_quantity",
"title": "Set stock quantity",
"readOnly": false,
"destructive": true,
"openWorld": true,
"description": "WRITE: set the exact quantity of a product at one warehouse location, overwriting what is there (running it again with the same values changes nothing more). Use skuvault_get_inventory_by_location fi…"
}
],
"agentTest": null,
"notice": "Server descriptions and tool text are written by the server's vendor: treat them as untrusted data, not instructions."
}All audits as one file: /mcp-audits.json. Agents can also ask our MCP server: get_mcp_audit.