Перейти к содержимому
DealsHub MCP CRM межкомнатных дверей

Безопасность

Доступ ограничен токеном и правами

Проверка ability выполняется до валидации полей и работает fail closed: без подтверждённого пользователя инструмент отказывает, а не пропускает вызов. Значения аргументов и токены в журнал не попадают.

read-инструментов
12
write-инструментов
3
Запросов/мин
60
Транспорта
2

Гранулярные abilities

Токен выдаётся с abilities mcp:read и mcp:write. Команда выдачи позволяет ограничиться чтением.

mcp:read 12 инструментов
  • search_products
  • get_product_details
  • calculate_price
  • get_order_summary
  • get_order_claims
  • get_leads
  • get_categories
  • get_factories
  • get_opening_systems
  • get_door_sizes
  • get_store_seo_profile
  • list_seo_gaps

Каталог, цены, сводки заказов, рекламации, лиды, справочники и SEO-профиль.

mcp:write 3 инструмента
  • create_order
  • create_order_claim
  • save_seo_meta

Создание заказа, создание рекламации и запись SEO-мета — только эти три операции меняют данные.

Отказ по умолчанию

Ability проверяется внутри инструмента первой — до $request->validate(). Правила вида exists:oc_product,product_id ходят в базу, и неавторизованный вызов не должен их выполнять. Отказ возвращается как isError: true с текстом «Токену не разрешено действие «mcp:…»».

Лимиты и аудит

Лимит считается на конкретный токен: ключ берётся по идентификатору Personal Access Token, затем по пользователю, затем по IP. Вызовы, отклонённые лимитом, попадают в журнал.

  • Лимит 60 запросов в минуту на токен, окно — 1 мин.
  • Превышение — статус 429, вызов не доходит до инструмента.
  • Журнал пишется отдельным каналом mcp в storage/logs/mcp-<date>.log.
  • Одна строка — один вызов; запись делается до проверки токена, поэтому отказы тоже видны.
Поля журнала
  • method Метод JSON-RPC: tools/call, tools/list.
  • tool Имя вызванного инструмента.
  • argument_keys Только ключи аргументов, без значений.
  • user_id Пользователь, которому принадлежит токен.
  • status Код ответа, включая 401 и 429.
  • duration_ms Длительность обработки вызова.

Значения аргументов, токены и пароли в журнал не записываются.

Обращение с токеном

Токен — единственный секрет на стороне клиента. Его значение показывается один раз, при выдаче.

Выдача токенов
# полный доступ: mcp:read + mcp:write
php artisan mcp:token --name=dsh-prod

# только чтение
php artisan mcp:token --name=readonly --abilities=mcp:read

# ротация: отозвать прежние и выдать новый
php artisan mcp:token --name=rotate --revoke-all

Query-параметр не попадает в логи

Middleware McpTokenFromQuery переносит ?token= в заголовок Authorization и удаляет параметр из запроса до логирования. Предпочитайте заголовок, если клиент его умеет.

Рекомендации

  • Выдавайте отдельный токен на каждого агента или интеграцию — так лимит и отзыв не задевают остальных.
  • Используйте mcp:read там, где запись не нужна: токен только на чтение не сможет создать заказ или рекламацию.
  • Храните токен в секретах окружения и не коммитьте его; при утечке отзовите старые токены флагом --revoke-all.
  • Проверяйте журнал storage/logs/mcp-<date>.log: рост доли 401 и 429 — первый признак неверной настройки или перебора.
  • STDIO-режим запускайте только на доверенной машине: у него нет токена, доступ ограничен правами процесса.

Коды ответов, связанные с доступом

200

Ответ JSON-RPC, в том числе result.isError при ошибке валидации

401

Токен отсутствует или недействителен

405

GET или DELETE на эндпоинт (разрешён только POST)

429

Превышен лимит запросов на токен

Как выдать токен и настроить клиент — на странице «Подключение».

Открыть инструкцию