Skip to main content
Glama
genvjacobc

lightspeed-x

by genvjacobc

lightspeed-x-mcp

Сервер Model Context Protocol для Lightspeed X (Lightspeed Retail POS, платформа, ранее известная как Vend). Он предоставляет Claude или любому MCP-клиенту доступ только для чтения к продажам, запасам, товарам и клиентам вашего магазина, и сам выполняет агрегацию: выручка, единицы, себестоимость, валовая прибыль, маржа, скидка, средний чек и размер корзины, сгруппированные по любому нужному вам измерению.

Только чтение по построению. Каждый инструмент отправляет GET-запросы. В этом сервере нет ни одного пути кода, который мог бы создавать, обновлять или удалять что-либо в вашем аккаунте, так что вы можете подключить его к работающему розничному бизнесу, не беспокоясь об этом.

"What sold best yesterday?"                → lightspeed_sales_report
"Revenue by store last week"               → lightspeed_sales_report, group_by: outlet
"Which SKUs need reordering?"              → lightspeed_inventory_report, status: reorder_needed
"What are our busiest hours?"              → lightspeed_sales_report, group_by: hour
"Margin by brand this month"               → lightspeed_sales_report, group_by: brand
"Pull up invoice 162220"                   → lightspeed_list_sales

Зачем это существует

API Lightspeed X — пережиток эпохи Vend, и у него есть несколько острых углов, из-за которых наивные клиенты либо работают медленно, либо тихо ошибаются. Этот сервер обрабатывает их, чтобы модели не приходилось:

Реальность

Что делает этот сервер

/sales принимает date_from и date_to, а затем молча игнорирует их. Каждый результат возвращается независимо от запрошенных дат.

Находит диапазон дат бинарным поиском по последовательности версий, затем фильтрует локально. Наивный клиент, доверяющий параметрам, возвращает неверные ответы с полной уверенностью.

Пагинация основана на версиях, а не на курсорах. Нет ключа cursor; ответы содержат version: {min, max}, и вы листаете с помощью ?after=<version>.

Обрабатывается прозрачно с помощью помощника paginate в клиенте.

Документированный максимальный page_size — 200, но API на самом деле отдаёт до 5000.

Массовые сканирования используют 5000 (для продаж — 1000, потому что продажи содержат полные позиции). Сканирование 126 000 строк запасов занимает 26 запросов вместо 630.

Позиции продаж содержат только product.id. Ни названия, ни SKU, ни категории.

Соединяется с кэшированным каталогом товаров, чтобы каждый отчёт был читаемым для человека.

День магазина не начинается в полночь по UTC, поэтому наивное разбиение относит вечерние продажи к неправильному дню.

Дневные, месячные, будние и часовые сегменты разрешаются в часовом поясе IANA самой торговой точки.

Возвраты учитываются как позиции с отрицательным количеством и отрицательными итогами.

Они корректно вычитаются из каждой метрики без необходимости особых случаев.

/product_categories возвращает совершенно другую форму конверта, чем все остальные конечные точки.

Обрабатывается как отдельный случай.

Лимит запросов — 300 x регистров + 50 за 5 минут, и 429-е ответы не содержат надёжного Retry-After.

Экспоненциальная задержка с повторами при 429 и 5xx.

Как выводится математика выручки

Проверено на 200 последовательных реальных продажах. Каждая сошлась с собственным totals.price продажи с точностью до двух центов:

line revenue excl tax = line_items[].pricing.total        (net of discount, already x quantity)
line COGS             = line_items[].pricing.cost_total
line discount given   = line_items[].pricing.discount_total
line tax              = line_items[].tax.total

Три дополнительные проверки на реальных данных, все точные:

  • Сумма дневной выручки за неделю равна общему итогу недели.

  • Строка торговой точки в отчёте group_by: outlet равна тому же отчёту, перезапущенному с серверным фильтром этой торговой точки.

  • Сумма сумм, внесённых по типу оплаты, равна выручке с учётом налога.


Related MCP server: Toast MCP Server

Установка

Вариант 1: как плагин Claude Code (рекомендуется)

Три команды, без клонирования, без сборки, без правки путей:

/plugin marketplace add genvjacobc/lightspeed-x-mcp
/plugin install lightspeed-x@lightspeed-x-mcp
/lightspeed-x:setup

Третья команда запускает встроенный навык настройки, который проведёт вас через получение токена, запишет его в нужное место и проверит соединение с вашим живым аккаунтом, прежде чем сообщит, что всё работает.

Плагин также поставляется с навыком reports, чтобы Claude знал, какой инструмент отвечает на какой тип розничного вопроса и как читать полученные числа.

Учётные данные хранятся в ${CLAUDE_PLUGIN_DATA}/credentials.env — каталоге для каждого пользователя, который переживает обновления плагина. Ничего не передаётся между машинами или коллегами.

Обратите внимание, что /plugin uninstall удаляет этот каталог, поэтому удаление и повторная установка означают повторный запуск настройки. Сам токен остаётся активным в Lightspeed независимо от этого, так что отзовите его там, если закончили с ним.

Вариант 2: как отдельный MCP-сервер

git clone https://github.com/genvjacobc/lightspeed-x-mcp.git
cd lightspeed-x-mcp
npm install
npm run build

Требуется Node 18 или новее.

Получение API-токена

В бэк-офисе Lightspeed X: Setup → Personal Tokens → Add Personal Token. Скопируйте его до закрытия диалога; он показывается только один раз.

Два ограничения, о которых стоит знать перед планированием развёртывания:

  • Только администраторы могут создавать персональные токены, и Lightspeed ограничивает эту функцию тарифами Plus. Если Personal Tokens не появляется в разделе Setup, кто-то с правами администратора должен создать токен для вас.

  • Lightspeed не предлагает токены только для чтения. Токен несёт все права пользователя, который его создал. Этот сервер отправляет только GET, но сам токен — это универсальное учётное данное, поэтому обращайтесь с ним как с паролем и отзывайте его на том же экране, если он утёк.

Проверка работы

npm run doctor

Это проверяет ваши учётные данные, вызывает живой API и называет точную причину любой ошибки. Неправильный домен магазина и неверный токен оба возвращают HTTP 401 от Lightspeed, поэтому доктор сообщает обе возможности, а не гадает.

Настройка

Скопируйте .env.example в .env и заполните данные вашего магазина:

LIGHTSPEED_DOMAIN=mystore
LIGHTSPEED_TOKEN=your_personal_token

LIGHTSPEED_DOMAIN принимает голый префикс (mystore), хост (mystore.retail.lightspeed.app) или полный URL. Все три варианта разрешаются в одно и то же место.

Несколько магазинов. Любая пара LIGHTSPEED_<NAME>_DOMAIN + LIGHTSPEED_<NAME>_TOKEN определяет аккаунт с именем <name> в нижнем регистре. Инструменты затем принимают необязательный аргумент account:

LIGHTSPEED_NORTH_DOMAIN=northstore
LIGHTSPEED_NORTH_TOKEN=token_for_north
LIGHTSPEED_SOUTH_DOMAIN=southstore
LIGHTSPEED_SOUTH_TOKEN=token_for_south
LIGHTSPEED_DEFAULT_ACCOUNT=north

Значения, уже присутствующие в окружении, всегда имеют приоритет над файлом .env, поэтому хост, который внедряет учётные данные напрямую, получает преимущество.

Регистрация в Claude Code (только для отдельного пути)

Пропустите это, если вы установили плагин; плагин регистрирует сервер сам.

claude mcp add lightspeed-x -s user -- node /absolute/path/to/lightspeed-x-mcp/dist/index.js

Или добавьте его в конфиг вручную:

{
  "mcpServers": {
    "lightspeed-x": {
      "command": "node",
      "args": ["/absolute/path/to/lightspeed-x-mcp/dist/index.js"],
      "env": {
        "LIGHTSPEED_DOMAIN": "mystore",
        "LIGHTSPEED_TOKEN": "your_personal_token"
      }
    }
  }
}

Для Claude Desktop тот же блок помещается в claude_desktop_config.json.

Проверьте локально с помощью MCP Inspector:

npm run inspect

Инструменты

lightspeed_sales_report

Главное событие. Агрегирует диапазон дат и группирует его.

Аргумент

Примечания

date_from, date_to

YYYY-MM-DD, включительно, читается в часовом поясе отчёта

group_by

product (по умолчанию), sku, category, brand, supplier, tag, outlet, register, salesperson, customer, day, month, weekday, hour, payment_type, none

metrics

revenue, revenue_incl_tax, units, sale_count, cogs, gross_profit, margin_pct, discount, tax, basket_value, basket_size, customer_count

sort_by, sort_direction, limit

Управление ранжированием

outlet_id

Применяется на стороне сервера, поэтому действительно быстро

states

По умолчанию closed, что и означает отчёт

timezone

Переопределение часового пояса IANA для границ дня

| Outlet          |   Revenue | Units | Sales | Basket value | Gross profit | Margin |
| --------------- | --------: | ----: | ----: | -----------: | -----------: | -----: |
| South Lincoln   | $3,401.60 |   193 |    91 |       $37.38 |    $2,342.35 |  68.9% |
| York            | $3,222.86 | 159.2 |    73 |       $44.15 |    $2,238.77 |  69.5% |

lightspeed_list_sales

Отдельные транзакции, сначала новые, с опциональным разворачиванием позиций. Для изучения одного чека, аудита итога или просмотра возвратов. Фильтры по outlet_id, customer_id и min_total.

lightspeed_inventory_report

Остатки на складе, объединённые с названиями товаров и торговых точек, с розничной и закупочной стоимостью того, что на полке.

status — аргумент, который имеет значение:

Статус

Значение

low_stock

Всё ещё продаётся, но на уровне или ниже точки повторного заказа. Что заканчивается.

reorder_needed

На уровне или ниже точки повторного заказа, включая ноль и отрицательные значения. Полный список для закупки.

out_of_stock

Ровно ноль.

negative

Ниже нуля, что означает ошибку подсчёта запасов.

in_stock / all

Больше нуля / всё.

group_by сворачивается до product, outlet, category, brand или supplier, что позволяет ответить на вопрос «сколько стоимости запасов приходится на каждую категорию».

lightspeed_search_products

Полнотекстовый поиск по названию, названию варианта, SKU и handle, с фильтрами по бренду / поставщику / категории / тегу. Сопоставление выполняется локально по кэшированному каталогу, потому что собственный поисковый endpoint API ранжирует плохо, поэтому результаты — точные подстроки.

lightspeed_get_product

Полная информация об одном товаре по ID или точному SKU, включая остатки по каждой торговой точке и вычисленную маржу.

lightspeed_search_customers / lightspeed_get_customer

Поиск клиентов по email (отправляется в API) или по имени, телефону или коду клиента (сопоставляется локально). Возвращает UUID, который инструменты продаж принимают как фильтр customer_id. Это возвращает персональные данные; обращайтесь с ними соответственно.

lightspeed_list_outlets / lightspeed_list_registers / lightspeed_list_accounts

Преобразуют названия магазинов в UUID торговых точек, которые принимают фильтры отчётов, перечисляют POS-терминалы, включая e-commerce регистры, и показывают, какие аккаунты доступны серверу. lightspeed_list_accounts никогда не возвращает токены.

lightspeed_list_reference_data

Один инструмент для работы с brands, suppliers, product_categories, tags, customer_groups, payment_types, promotions, taxes и users. Используйте его, чтобы получить точное написание бренда или категории перед фильтрацией отчёта по нему.

lightspeed_api_get

Запасной выход для любого эндпоинта, для которого нет специализированного инструмента: /consignments, /price_books, /serial_numbers и так далее. Выполняется только GET.


Производительность и ограничения

Форма отчётов определяется тем, что продажи нельзя фильтровать по дате на стороне сервера.

Запрос

Типичное время холодного вызова

Один день, все торговые точки (~900 продаж)

15–20 с при первом вызове, затем ~2 с

Одна неделя (~5 900 продаж)

~20 с

Полное сканирование остатков (~126 000 строк)

~25 с при первом вызове, затем мгновенно

Поиск по товарам / торговым точкам / справочникам

Менее 1 с после первого вызова

Большую часть холодного вызова составляют ~30 одиночных проб, которые определяют диапазон дат. Эти пробы запоминаются для каждой учётной записи, поэтому для второго отчёта в сессии они обычно не нужны. Сканирования каталога, торговых точек, касс, пользователей и остатков кэшируются на 15 минут.

Чтобы всё работало быстро: передавайте outlet_id, если вас интересует только один магазин, и предпочитайте узкие диапазоны дат. LIGHTSPEED_MAX_SALES (по умолчанию 200 000) ограничивает один вызов, и инструмент прямо сообщает, когда усекает результат, а не молча возвращает частичный ответ.

Одно честное предостережение. Поскольку диапазон дат определяется по версии, продажа, созданная до диапазона, но изменённая после него, может быть пропущена. LIGHTSPEED_SEEK_MARGIN_DAYS (по умолчанию 1) задаёт, насколько раньше диапазона поиск целится, а его увеличение расширяет страховочную сетку ценой сканирования большего числа записей. Это неотъемлемое свойство API, который не фильтрует по дате, а не упрощение, принятое здесь.


Справочник по конфигурации

Переменная

По умолчанию

Назначение

LIGHTSPEED_DOMAIN

обязательно

Префикс магазина, хост или URL

LIGHTSPEED_TOKEN

обязательно

Персональный токен

LIGHTSPEED_<NAME>_DOMAIN / _TOKEN

необязательно

Дополнительные именованные учётные записи

LIGHTSPEED_DEFAULT_ACCOUNT

первая учётная запись

Учётная запись, используемая, когда инструмент не указывает account

LIGHTSPEED_API_VERSION

2026-01

Сегмент пути версии API

LIGHTSPEED_MAX_SALES

200000

Предохранительный предел на один вызов продаж

LIGHTSPEED_SEEK_MARGIN_DAYS

1

Дни запаса при поиске якоря версии

LIGHTSPEED_ENV_FILE

необязательно

Явный путь к файлу учётных данных. Плагин устанавливает его в ${CLAUDE_PLUGIN_DATA}/credentials.env


Разработка

npm run dev      # run from source with tsx
npm run build    # compile to dist/
npm run inspect  # MCP Inspector against the built server
npm run doctor   # credentials + live connectivity check
npm run validate-plugin  # validate the plugin manifests
src/
  index.ts            entry point, env loading, tool registration
  config.ts           account discovery from the environment
  lib/
    client.ts         HTTP client, retry, version pagination
    version-seek.ts   date to version binary search
    sales.ts          sale fetching and metric aggregation
    catalog.ts        cached product, outlet, register, inventory lookups
    time.ts           timezone-aware day boundaries
    format.ts         Markdown table rendering, tool results
  tools/              one file per tool group

Инструменты возвращают таблицы Markdown, а не сырой JSON: модель читает выровненную таблицу надёжнее, чем глубокий JSON-блоб, и при этом тратится лишь малая доля токенов. Исходные числа также доступны в structuredContent для программных вызывающих.

Два соглашения, которых стоит придерживаться, если вы вносите вклад:

  • Никогда не выбрасывайте исключения из обработчика инструмента. Ошибки возвращаются как результаты isError. Обёртка guard() обеспечивает это.

  • Никогда не используйте console.log. Stdout передаёт JSON-RPC кадры. Диагностика идёт в console.error.


Структура репозитория

.claude-plugin/     plugin + marketplace manifests
.mcp.json           MCP server declaration used by the plugin path
skills/setup/       guided connection walkthrough
skills/reports/     how to answer retail questions with these tools
src/                TypeScript source
dist/               compiled output, committed so plugin installs need no build

dist/ намеренно отслеживается в git, потому что установка плагина Claude Code не выполняет шаг сборки, и скомпилированный сервер должен поставляться вместе с репозиторием. Запустите npm run build перед коммитом изменения исходного кода и одновременно поднимите version в package.json, .claude-plugin/plugin.json и .claude-plugin/marketplace.json при выпуске.

Лицензия

MIT. См. LICENSE.

Не аффилирован с Lightspeed Commerce и не одобрен ею.

Available Tools

1 tool
lightspeed_setup_statusLightspeed setup statusA
Read-only

Report whether this server has working Lightspeed credentials, and if not, the exact file path to create and what to put in it. Call this first when any Lightspeed tool fails with a credential error, when the user says Lightspeed is not connected, or when setting the server up for the first time. Safe to call at any time and never returns the token itself.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true and openWorldHint=true, so the description need not restate safety labels. It adds valuable context: the tool never returns the token itself, and it reports the exact file path and content to create when credentials are absent. This is a useful disclosure beyond the structured hints, warranting a 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose, then usage conditions, then a safety note. Every word earns its place; there is no fluff or repeated information. Ideal conciseness for a tool of this simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (no parameters, no output schema) and the description covers everything an agent needs to call it correctly: the exact condition to invoke it, what it reveals (success or failure plus remediation info), and its non-sensitive nature. Nothing is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, the schema is trivially covered at 100%, and the rubric sets a baseline of 4 for this case. The description adds no parameter-specific meaning, but nothing is missing—there is nothing to document. The baseline score is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise statement of what the tool does: report whether the server has working Lightspeed credentials and, if not, provide the exact file path and content to fix it. This is a specific verb-resource pair that leaves no doubt about the tool's role, and it stands alone clearly even without siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit, actionable usage guidance: call this first when a Lightspeed tool fails with a credential error, when the user reports Lightspeed is not connected, or during initial setup. It also notes the tool is safe to call at any time, covering both when to use and the absence of constraints.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev1.2.0
    • First observedlightspeed_setup_status

TDQS

A4.2/5.0

Scored across 1 tool

Disambiguation5/5

With only one tool, there is no possibility of confusion or overlap between tool purposes. The tool's role as a credential/setup status check is clearly defined.

Naming Consistency5/5

A single tool name cannot exhibit inconsistency. 'lightspeed_setup_status' is descriptive, snake_case, and follows a predictable pattern for this server.

Tool Count1/5

A single setup/status tool is an extreme mismatch for a server named 'lightspeed-x'. The tool explicitly references other Lightspeed tools that do not exist, making the surface feel incomplete and unbalanced.

Completeness1/5

The server provides no actual Lightspeed operations—only a credential status check. This is severely incomplete for a Lightspeed integration domain and leaves agents with no way to perform real tasks.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

  • MerchantFlow is a hosted, read-only ecommerce analytics MCP server for Shopify and WooCommerce. It gives AI assistants tenant-scoped access to revenue, profit and loss, product and SKU profitability, COGS coverage, fulfillment costs, advertising spend, ROAS, marketing performance, cohorts, LTV, and business valuation across connected commerce and marketing platforms. Connect with OAuth over Streamable HTTP. No local server installation is required.

  • Read-only zobrx e-commerce data: P&L, orders, inventory, marketplace, tax & shelf insights.

  • Connect your ads, shop, analytics, social, CRM and finance platforms once, then let Claude, ChatGPT, Cursor or any MCP client read, join and explain your numbers. Public statistics from the World Bank, IMF, Eurostat, OECD, WHO and SEC filings come as context, searchable and chartable from the same tools. Read-only by design, every number carries its source.

  • Read-only Shopify and WooCommerce profit analytics: P&L, COGS, product margins, ROAS and LTV.

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides AI assistants with real-time access to Shopify store analytics, sales data, and inventory through ShopifyQL and the Admin GraphQL API. It enables users to query store performance, customer metrics, and marketing insights using natural language.
    13
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to query live Toast POS data and generate sales, labor, and cash reports while answering restaurant operations questions, all in a read-only manner.
    10 npm
    MIT
  • A
    license
    C
    quality
    B
    maintenance
    Enables Claude or any MCP client to query a Toast POS using plain English, with 55 read-only tools covering orders, sales, labor, employees, menus, inventory, customers, and cash.
    55
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to query a retail and food-service point-of-sale database through predefined business tools for sales summaries, top products, margins, stagnant inventory, cash reconciliation, and optional stock adjustments, returning formatted markdown answers.
    MIT