Skip to main content
Glama
andreykutsenko

mcp-shop-server

mcp-shop-server

MCP-сервер, который даёт AI-агенту read-only доступ к SQLite-базе интернет-магазина (customers, products, orders, order_items). Агент через него отвечает на аналитические вопросы по данным: структура базы, агрегаты по клиентам, товарам, категориям и выручке. Транспорт — stdio.

Запись в базу невозможна by design: три независимых слоя защиты — соединение mode=ro, валидация запроса до выполнения (только SELECT / WITH ... SELECT) и sqlite3-authorizer.

Замеры, доказательства и отклонения от ТЗ — REPORT.md.


Использование

1. Клонировать

git clone https://github.com/andreykutsenko/mcp-shop-server.git
cd mcp-shop-server

В репозитории уже лежит shop.db (150 клиентов, 50 товаров, 750 заказов, 1900 позиций).

2. Установить зависимости

uv venv .venv
uv pip install --python .venv/bin/python -r requirements.txt

Без uv — то же самое штатными средствами:

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt

Требуется Python 3.11+. Зависимости: mcp (официальный MCP SDK) и pytest для тестов; работа с базой — на sqlite3 из стандартной библиотеки.

3. Прописать в конфиг агента

Минимальная форма конфигурации:

{
  "command": "python",
  "args": ["/absolute/path/to/mcp-shop-server/server.py"]
}

Рабочий пример для клиента с блоком mcpServers (Claude Desktop, Cursor и совместимые):

{
  "mcpServers": {
    "shop-db": {
      "command": "/absolute/path/to/mcp-shop-server/.venv/bin/python",
      "args": ["/absolute/path/to/mcp-shop-server/server.py"],
      "env": {
        "MCP_SHOP_DB": "/absolute/path/to/mcp-shop-server/shop.db"
      }
    }
  }
}

Для Claude Code достаточно одной команды:

claude mcp add shop-db -- /absolute/path/to/mcp-shop-server/.venv/bin/python /absolute/path/to/mcp-shop-server/server.py

MCP_SHOP_DB необязателен: если переменная не задана, сервер берёт shop.db рядом с server.py. Указывайте её, если база лежит в другом месте. Интерпретатор лучше указывать из .venv — иначе системный python может не найти пакет mcp.

4. Запуск

Сервер запускает агент, руками это нужно редко:

.venv/bin/python server.py

Процесс молча ждёт JSON-RPC на stdin; диагностика идёт в stderr, stdout занят протоколом MCP.

5. Проверка и вопросы агенту

.venv/bin/python -m pytest -q

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

Восемь задач из текста домашнего задания — их и стоит прогнать для проверки:

1. Show me all available tables and explain what information each table contains.
2. How many customers are from Germany?
3. Which country has the most customers?
4. Who is the customer who spent the most money?
5. What are the top 5 best-selling products?
6. What are the top 3 product categories by revenue?
7. How much revenue did we generate in 2025?
8. Which customer placed the most orders?

⚠️ Задачи 2, 3 и 7 в поставляемой базе решения не имеют, и это ожидаемо. В customers нет колонки со страной — все 150 клиентов с российскими телефонами; все 750 заказов датированы 2026 годом, за 2025-й данных нет.

Сервер в этом случае не выдумывает данные: сообщает, что такого поля в схеме нет, и перечисляет существующие колонки. Ничего не зашито в код — схема читается из базы, поэтому на другой базе, где country есть, те же вопросы отработают штатно.

Дополнительно проверяются вопросы, которые база закрывает полностью: топ-5 клиентов по сумме заказов, выручка по категориям, распределение заказов по статусам, средний чек, остатки товаров.

Проверка защиты от записи. На «Delete all cancelled orders» агент получает понятный отказ, а не ошибку: сервер работает только на чтение, 102 отменённых заказа остаются на месте.

Инструменты

Инструмент

Назначение

list_tables()

Все таблицы с назначением, числом строк, колонками, связями, списком статусов заказов и форматом дат.

describe_table(table)

Реальные колонки с типами, внешние ключи в обе стороны и пример строки.

run_select_query(sql, limit=100, offset=0)

Выполнить один SELECT (или WITH ... SELECT) и вернуть строки постранично.

Выдача ограничена: по умолчанию 100 строк, максимум 1000. При обрезке ответ сообщает, сколько строк вернули, сколько всего нашлось и с каким offset читать дальше.

Если запрошенного поля в базе нет (например, страны клиента), сервер честно об этом говорит и перечисляет существующие колонки — несуществующие поля не додумываются.


Related MCP server: Shop Analytics MCP Server

Как сделано

Проект сгенерирован одним промптом — файл SPEC-mcp-shop.md, отправленный агенту целиком, без последующих уточнений.

Внутри агент работал циклом по скиллу repo-task-proof-loop (Денис Ширяев, Apache-2.0): заморозка спеки → сборка → упаковка доказательств → проверка свежей сессией → минимальная правка → проверка снова, до вердикта PASS.

Доказательства прогона лежат в репозитории, в .agent/tasks/mcp-shop-server/:

  • spec.md — замороженная спека с критериями приёмки AC1…AC17;

  • evidence.md / evidence.json — по каждому критерию вердикт и конкретное доказательство;

  • verdict.json — результат независимой проверки свежей сессией;

  • problems.md — расхождения, найденные проверяющим;

  • raw/ — сырые логи прогонов: тесты, живая MCP-сессия, проверка чистоты stdout.

Проверяется не исходный код, а поведение сервера с живым агентом: harness raw/mcp_session_check.py поднимает server.py по stdio настоящим MCP-клиентом, вызывает все инструменты, прогоняет восемь аналитических задач, получает отказ на удаление и сверяет, что stdout содержит только кадры JSON-RPC.

Сам скилл разработки лежит локально в .claude/skills/ и в репозиторий не коммитится — это чужой код.


Принятые решения по неоднозначностям ТЗ

#

Неоднозначность

Решение

1

«Агент отвечает на все восемь задач из ТЗ» — сам список из восьми задач в ТЗ не приведён.

Восемь аналитических вопросов выведены из раздела <objective> («структура базы, агрегаты по клиентам, товарам, категориям и выручке») и зафиксированы в разделе «Проверка и вопросы агенту» выше. Каждый прогоняется через инструменты сервера в .agent/tasks/mcp-shop-server/raw/test-integration.txt.

2

Версия MCP SDK не зафиксирована.

Взята актуальная линейка mcp>=2.1,<3 (API MCPServer). В mcp 1.x класс назывался FastMCP; верхняя граница закреплена, чтобы установка была воспроизводимой.

3

«Максимум 1000 строк» — не сказано, ошибка это или обрезка.

limit больше 1000 не считается ошибкой: значение ограничивается сверху до 1000, и об этом сообщается в поле notes. Ошибкой считается только limit < 1 и отрицательный offset.

4

«Сколько всего нашлось» при неограниченной выборке.

Результат курсора досчитывается полностью, но не более 100 000 строк; если запрос дал больше, total_is_exact=false, и в ответе стоит «не менее N». Так честное число не превращается в риск зависания.

5

Authorizer запрещает всё, кроме чтения, но describe_table нуждается в PRAGMA table_info.

Authorizer пропускает только три read-only-пагмы (table_info, foreign_key_list, index_list). Пользовательский PRAGMA в любом виде отклоняется ещё вторым слоем — валидатором, до выполнения.

6

Формат ответа инструментов не задан.

Все инструменты возвращают структурированный объект с полем ok. Отказ и ошибка — это ok=false с текстовым объяснением, а не исключение MCP: агент читает это как ответ, а не как сбой транспорта.

7

Имена инструментов и их состав («набор проектируешь сам»).

Оставлен рекомендованный минимум из трёх инструментов ровно с именами list_tables, describe_table, run_select_query: всё остальное (агрегаты, топы, срезы по годам) выражается через run_select_query, отдельные узкие инструменты только раздували бы контекст.

8

Точка с запятой в конце запроса.

Завершающая ; допускается — это одна инструкция. Отклоняется только вторая непустая инструкция после ;; точка с запятой внутри строкового литерала второй инструкцией не считается.

9

Расположение тестов и harness.

Тесты — в tests/test_server.py (пронумерованы по пунктам <tests> ТЗ), harness живой MCP-сессии — в .agent/tasks/mcp-shop-server/raw/, рядом с доказательствами, чтобы его можно было перезапустить при проверке.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to safely interact with a SQLite shop database through schema discovery, read-only SQL queries, and pre-built analytics reports like top customers, top products, and revenue summaries.
    6
    83
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Enables AI agents to answer analytical questions about an online store's SQLite database through specialized read-only tools, without any risk of modifying the underlying data.
    8
  • F
    license
    A
    quality
    C
    maintenance
    Enables AI agents to read-only query an online store's SQLite database, listing tables, inspecting schemas, and running SELECT queries over customers, products, orders, and order items.
    3
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to read-only analyze a SQLite e-commerce database, exploring schema and running analytical SQL queries over stdio.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/andreykutsenko/mcp-shop-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server