Brightpearl MCP by usefulapi
Search Brightpearl orders, products, stock, contacts and payments; add notes, update order status.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 658 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://brightpearl.usefulapi.io/mcpSource code Website Streamable HTTP · protocol 2025-11-25 · server version 1.22.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.
- brightpearl_add_order_note
- brightpearl_update_order_status
- brightpearl_add_contact_note
Passed: Every tool says whether it only reads or can change things.
Tools
Passed: 25 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 (25)
As the server describes them. The labels are the server's own: it says whether each tool only reads or can change things.
- brightpearl_get_account_configurationThe Brightpearl account's configuration as key/value pairs: base currency, tax scheme, time zone, default and new-order status ids, nominal codes, weight unit, whether multiple warehouses are enabled…Read-only
- brightpearl_search_ordersSearch sales orders, sales credits, purchase orders and purchase credits. Every filter is optional and they combine (AND); each result row has orderId, orderTypeId, contactId, orderStatusId, orderSto…Read-only
- brightpearl_get_ordersFull details of one or more orders by id: type, status, payment/stock/shipping status, dates, currency, totals, assignment, customer/supplier, billing and delivery parties, and the order rows (produc…Read-only
- brightpearl_get_order_notesAll notes on one order (text, author contact id, date, whether it is public on the customer portal, the order status at the time). GET /order-service/order/{id}/note.Read-only
- brightpearl_list_order_statusesThe account's order statuses (id, name, order type code SO/PO/SC/PC, sort order, disabled, visible to the customer, state such as draft). Use the ids to filter orders or to change an order's status.…Read-only
- brightpearl_list_order_typesThe four order types with their ids and codes (1 SO sales order, 2 PO purchase order, 3 SC sales credit, 4 PC purchase credit), for the order search. GET /order-service/order-type.Read-only
- brightpearl_add_order_noteWRITE: add a note to an existing order. The note is private (staff only) unless is_public is true, which makes it visible on the customer portal. Returns the new note id. Notes cannot be removed with…Can change things
- brightpearl_update_order_statusWRITE: move an existing order to another status (ids from brightpearl_list_order_statuses; the new status must exist, be visible and belong to this order's type). Brightpearl adds an order note on su…Can change things
- brightpearl_search_productsSearch the product catalogue. Every filter is optional and they combine (AND); each result row has productId, productName, SKU, barcode, EAN, UPC, ISBN, MPN, stockTracked, createdOn, updatedOn, brigh…Read-only
- brightpearl_get_productsFull details of one or more products by id: identity (SKU, barcodes), brand, type, stock-tracking, weight and dimensions, tax code, sales-channel names/descriptions/categories, bundle composition, va…Read-only
- brightpearl_get_product_pricesPrices of products per price list: for each product and price list the currency, SKU and the quantity-break price map (e.g. {"1":"12","100":"11"}). Up to 50 product ids; optionally only some price li…Read-only
- brightpearl_get_product_availabilityStock availability of stock-tracked products: for each product the totals across all warehouses (inStock, onHand, allocated, inTransit) and the same per warehouse; optionally per location, with on-or…Read-only
- brightpearl_list_price_listsThe price lists (id, name, code, currency, SELL or BUY, gross or net). Id 0 is the cost price list. GET /product-service/price-list.Read-only
- brightpearl_search_brandsSearch product brands by name; each row has brandId, brandName, createdOn, updatedOn. GET /product-service/brand-search.Read-only
- brightpearl_search_categoriesSearch Brightpearl product categories; each row has id, name, parentId, active, createdOn, updatedOn. GET /product-service/brightpearl-category-search.Read-only
- brightpearl_list_warehousesThe warehouses (id, name, type, address id, click-and-collect settings, weekly operating hours). Use the ids for stock and order filters. GET /warehouse-service/warehouse.Read-only
- brightpearl_list_shipping_methodsThe shipping methods (id, name, code, carrier, price breaks, countries). GET /warehouse-service/shipping-method.Read-only
- brightpearl_search_goods_out_notesSearch goods-out notes, the pick/pack/ship records of sales orders; each row has goodsOutNoteId, printed, picked, packed, shipped, shippedOn, orderId, shippingMethodId, warehouseId, createdOn, releas…Read-only
- brightpearl_search_goods_in_notesSearch goods-in records (stock received against purchase orders, by batch and location); each row has purchaseOrderId, batchId, productId, locationId, price, currCode, receivedQuantity, onHand, creat…Read-only
- brightpearl_search_contactsSearch contacts (customers, suppliers and staff). Every filter is optional and they combine (AND); each result row has contactId, primaryEmail, firstName, lastName, companyName, isSupplier, isStaff,…Read-only
- brightpearl_get_contactsFull records of one or more contacts by id: name, emails, phones, status, supplier/staff flags, financial details (price list, tax code, credit limit and terms), assignment, organisation, tags, dates…Read-only
- brightpearl_add_contact_noteWRITE: add a note to a contact's timeline (for example a record of correspondence). The note is private (staff only) unless is_public is true, which makes it visible on the customer portal. Returns t…Can change things
- brightpearl_search_customer_paymentsSearch payments received against sales orders; each row has paymentId, transactionRef, paymentMethodCode, paymentType, orderId, currencyCode, amountAuthorized, amountPaid, paymentDate, createdOn, jou…Read-only
- brightpearl_list_payment_methodsThe payment methods (name, code, active, bank accounts with currency and nominal code). GET /accounting-service/payment-method.Read-only
- brightpearl_list_tax_codesThe tax codes (id, code, description, rate). GET /accounting-service/tax-code.Read-only
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 | 658 ms |
| initialized | HTTP 202 | 91 ms |
| tools/list | HTTP 200 | 720 ms |
| prompts/list | HTTP 200 | 101 ms |
| unknown-method | HTTP 401 | 90 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-brightpearl": {
"type": "http",
"url": "https://brightpearl.usefulapi.io/mcp"
}
}
}{
"server": {
"name": "io.usefulapi/brightpearl",
"title": "Brightpearl MCP by usefulapi",
"url": "https://brightpearl.usefulapi.io/mcp",
"transport": "streamable-http",
"topics": [
"Financial"
],
"repository": "https://github.com/m190/usefulapi-mcp",
"website": "https://usefulapi.io/brightpearl/",
"inRegistry": true
},
"audit": {
"slug": "io-usefulapi-brightpearl",
"url": "https://brightpearl.usefulapi.io/mcp",
"auditedAt": "2026-11-13T16:27:42.551Z",
"firstAuditedAt": "2026-11-13T15:59:28.539Z",
"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": "25 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": [
"brightpearl_add_order_note",
"brightpearl_update_order_status",
"brightpearl_add_contact_note"
]
},
{
"id": "tool-poisoning",
"area": "security",
"level": "pass",
"title": "No hidden instructions found in tool text."
}
],
"server": {
"name": "brightpearl-mcp",
"version": "1.22.1",
"title": "Brightpearl MCP by usefulapi",
"protocolVersion": "2025-11-25",
"transport": "streamable-http"
},
"toolCount": 25,
"toolsHash": "95b6f80f8800f4027c7ff81f1dd68e4904e8433876ceb7275a847b59cb8a908b",
"latencyMs": 658,
"history": [
{
"date": "2026-11-13",
"outcome": "passed",
"tools": 25
}
]
},
"tools": [
{
"name": "brightpearl_get_account_configuration",
"title": "Get account configuration",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "The Brightpearl account's configuration as key/value pairs: base currency, tax scheme, time zone, default and new-order status ids, nominal codes, weight unit, whether multiple warehouses are enabled…"
},
{
"name": "brightpearl_search_orders",
"title": "Search orders",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Search sales orders, sales credits, purchase orders and purchase credits. Every filter is optional and they combine (AND); each result row has orderId, orderTypeId, contactId, orderStatusId, orderSto…"
},
{
"name": "brightpearl_get_orders",
"title": "Get orders",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Full details of one or more orders by id: type, status, payment/stock/shipping status, dates, currency, totals, assignment, customer/supplier, billing and delivery parties, and the order rows (produc…"
},
{
"name": "brightpearl_get_order_notes",
"title": "Get order notes",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "All notes on one order (text, author contact id, date, whether it is public on the customer portal, the order status at the time). GET /order-service/order/{id}/note."
},
{
"name": "brightpearl_list_order_statuses",
"title": "List order statuses",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "The account's order statuses (id, name, order type code SO/PO/SC/PC, sort order, disabled, visible to the customer, state such as draft). Use the ids to filter orders or to change an order's status.…"
},
{
"name": "brightpearl_list_order_types",
"title": "List order types",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "The four order types with their ids and codes (1 SO sales order, 2 PO purchase order, 3 SC sales credit, 4 PC purchase credit), for the order search. GET /order-service/order-type."
},
{
"name": "brightpearl_add_order_note",
"title": "Add order note",
"readOnly": false,
"destructive": true,
"openWorld": true,
"description": "WRITE: add a note to an existing order. The note is private (staff only) unless is_public is true, which makes it visible on the customer portal. Returns the new note id. Notes cannot be removed with…"
},
{
"name": "brightpearl_update_order_status",
"title": "Update order status",
"readOnly": false,
"destructive": true,
"openWorld": true,
"description": "WRITE: move an existing order to another status (ids from brightpearl_list_order_statuses; the new status must exist, be visible and belong to this order's type). Brightpearl adds an order note on su…"
},
{
"name": "brightpearl_search_products",
"title": "Search products",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Search the product catalogue. Every filter is optional and they combine (AND); each result row has productId, productName, SKU, barcode, EAN, UPC, ISBN, MPN, stockTracked, createdOn, updatedOn, brigh…"
},
{
"name": "brightpearl_get_products",
"title": "Get products",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Full details of one or more products by id: identity (SKU, barcodes), brand, type, stock-tracking, weight and dimensions, tax code, sales-channel names/descriptions/categories, bundle composition, va…"
},
{
"name": "brightpearl_get_product_prices",
"title": "Get product prices",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Prices of products per price list: for each product and price list the currency, SKU and the quantity-break price map (e.g. {\"1\":\"12\",\"100\":\"11\"}). Up to 50 product ids; optionally only some price li…"
},
{
"name": "brightpearl_get_product_availability",
"title": "Get product stock availability",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Stock availability of stock-tracked products: for each product the totals across all warehouses (inStock, onHand, allocated, inTransit) and the same per warehouse; optionally per location, with on-or…"
},
{
"name": "brightpearl_list_price_lists",
"title": "List price lists",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "The price lists (id, name, code, currency, SELL or BUY, gross or net). Id 0 is the cost price list. GET /product-service/price-list."
},
{
"name": "brightpearl_search_brands",
"title": "Search brands",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Search product brands by name; each row has brandId, brandName, createdOn, updatedOn. GET /product-service/brand-search."
},
{
"name": "brightpearl_search_categories",
"title": "Search product categories",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Search Brightpearl product categories; each row has id, name, parentId, active, createdOn, updatedOn. GET /product-service/brightpearl-category-search."
},
{
"name": "brightpearl_list_warehouses",
"title": "List warehouses",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "The warehouses (id, name, type, address id, click-and-collect settings, weekly operating hours). Use the ids for stock and order filters. GET /warehouse-service/warehouse."
},
{
"name": "brightpearl_list_shipping_methods",
"title": "List shipping methods",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "The shipping methods (id, name, code, carrier, price breaks, countries). GET /warehouse-service/shipping-method."
},
{
"name": "brightpearl_search_goods_out_notes",
"title": "Search goods-out notes (shipments)",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Search goods-out notes, the pick/pack/ship records of sales orders; each row has goodsOutNoteId, printed, picked, packed, shipped, shippedOn, orderId, shippingMethodId, warehouseId, createdOn, releas…"
},
{
"name": "brightpearl_search_goods_in_notes",
"title": "Search goods-in notes (stock received)",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Search goods-in records (stock received against purchase orders, by batch and location); each row has purchaseOrderId, batchId, productId, locationId, price, currCode, receivedQuantity, onHand, creat…"
},
{
"name": "brightpearl_search_contacts",
"title": "Search contacts",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Search contacts (customers, suppliers and staff). Every filter is optional and they combine (AND); each result row has contactId, primaryEmail, firstName, lastName, companyName, isSupplier, isStaff,…"
},
{
"name": "brightpearl_get_contacts",
"title": "Get contacts",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Full records of one or more contacts by id: name, emails, phones, status, supplier/staff flags, financial details (price list, tax code, credit limit and terms), assignment, organisation, tags, dates…"
},
{
"name": "brightpearl_add_contact_note",
"title": "Add contact note",
"readOnly": false,
"destructive": true,
"openWorld": true,
"description": "WRITE: add a note to a contact's timeline (for example a record of correspondence). The note is private (staff only) unless is_public is true, which makes it visible on the customer portal. Returns t…"
},
{
"name": "brightpearl_search_customer_payments",
"title": "Search customer payments",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "Search payments received against sales orders; each row has paymentId, transactionRef, paymentMethodCode, paymentType, orderId, currencyCode, amountAuthorized, amountPaid, paymentDate, createdOn, jou…"
},
{
"name": "brightpearl_list_payment_methods",
"title": "List payment methods",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "The payment methods (name, code, active, bank accounts with currency and nominal code). GET /accounting-service/payment-method."
},
{
"name": "brightpearl_list_tax_codes",
"title": "List tax codes",
"readOnly": true,
"destructive": false,
"openWorld": true,
"description": "The tax codes (id, code, description, rate). GET /accounting-service/tax-code."
}
],
"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.