MCP Сервер — Руководство пользователя
Что это?#
MCP сервер (Model Context Protocol) для cenaly.ru позволяет подключать AI-ассистентов (Claude, ChatGPT, Cursor, VS Code Copilot и др.) к данным вашего ресторана. AI получает доступ к меню, локациям, заказам, изображениям и может управлять ими от вашего имени.
⚠️ В российском контуре MCP-сервера нет. Он работает в основном контуре платформы; на
cenaly.ruего не поднимали, поэтому раздел «MCP API Ключи» там в настройках больше не показывается (раньше показывался и предлагал адрес, который отвечал «not found»). В остальных контурах сервер работает; если ваш аккаунт живёт не в основном контуре, своих данных в нём вы пока можете не увидеть — разведение хранилищ по контурам в работе.
Быстрый старт#
1. Получите API-ключ#
API-ключ генерируется в админ-панели вашего ресторана.
Шаг за шагом:#
- Войдите в Админ-панель по адресу admin.cenaly.ru
- В боковом меню откройте ⚙️ Настройки → 🔑 Доступ
- На странице найдите раздел 🤖 MCP API Ключи
- Нажмите кнопку «Сгенерировать новый ключ»
- Введите имя ключа (например, «Claude Desktop», «Cursor», «Мой GPT») — это поможет отличать ключи друг от друга
- Скопируйте ключ сразу — он показывается только один раз!
Сам ключ — это 64 шестнадцатеричных символа. Рядом в списке отображается короткий идентификатор вида
mk_…— это не ключ, а его «номер» для отзыва.
💡 На этой же странице отображается URL сервера (
https://api.cenaly.ru/mcp), который тоже можно скопировать одним кликом.
Управление ключами#
- Вы можете создать до 10 ключей на аккаунт
- Каждый ключ можно отозвать в любой момент — кнопка «Отозвать» рядом с ключом
- После отзыва ключ перестаёт работать немедленно
- Если ключ потерян — отзовите его и создайте новый
2. Подключите AI-ассистент#
Claude Desktop / Claude Code#
Файл конфигурации claude_desktop_config.json:
{
"mcpServers": {
"meni": {
"url": "https://api.cenaly.ru/mcp",
"headers": {
"Authorization": "Bearer ВАШ_API_КЛЮЧ"
}
}
}
}
Cursor#
В настройках Cursor → MCP Servers → Add, или файл .cursor/mcp.json:
{
"mcpServers": {
"meni": {
"url": "https://api.cenaly.ru/mcp",
"headers": {
"Authorization": "Bearer ВАШ_API_КЛЮЧ"
}
}
}
}
VS Code (GitHub Copilot)#
В .vscode/mcp.json проекта:
{
"servers": {
"meni": {
"type": "http",
"url": "https://api.cenaly.ru/mcp",
"headers": {
"Authorization": "Bearer ВАШ_API_КЛЮЧ"
}
}
}
}
Другие AI-инструменты#
Подробные пошаговые инструкции для Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, Cline, Continue, ChatGPT и других — в отдельном руководстве:
👉 Подключение AI-инструментов к MCP
Что может AI-ассистент?#
Для владельцев ресторанов (обычные пользователи)#
| Команда | Описание |
|---|---|
whoami |
Показать данные аккаунта (userId, email, роль) |
my_profile |
Получить свой профиль пользователя |
update_my_profile |
Обновить поля в своём профиле |
my_locations |
Список всех ваших локаций |
my_orders |
Список ваших заказов |
my_images |
Список ваших изображений (меню, категории, локации) |
Профили пользователей#
| Команда | Описание |
|---|---|
get_user_profile |
Получить профиль пользователя по userId |
update_user_profile |
Обновить поля профиля пользователя |
list_users |
[ADMIN] Список всех пользователей |
search_user_by_email |
[ADMIN] Найти пользователя по email через Cognito |
Работа с локациями#
| Команда | Описание |
|---|---|
list_locations |
Все локации пользователя |
get_location_profile |
Профиль локации (название, адрес, часы работы, настройки) |
update_location_profile |
Обновить настройки локации (синхронизируется с CDN автоматически) |
get_location_menu |
Полное меню локации с категориями и позициями |
Работа с меню#
| Команда | Описание |
|---|---|
list_menu_items |
Все позиции меню (с categoryId — полные данные, без — пары item/category ID) |
get_menu_item |
Получить позицию с полными данными (включая переводы, варианты, добавки) |
update_menu_item |
Обновить позицию меню (цена, описание, статус, теги, варианты, добавки) |
create_menu_item |
Создать новую позицию меню в категории |
create_menu_category |
Создать новую категорию меню |
update_menu_category |
Обновить категорию (название, переводы, статус, порядок сортировки) |
move_menu_item |
Переместить позицию из одной категории в другую |
merge_categories |
Объединить две категории (все позиции перемещаются, исходная удаляется) |
delete_menu_category |
Удалить категорию (с force: true — вместе со всеми позициями) |
check_translations |
Найти непереведённые категории и блюда — отчёт по языкам |
Языки приложения#
| Команда | Описание |
|---|---|
get_my_languages |
Какие языки включены, в каком порядке и какие ещё можно добавить |
set_my_languages |
Включить или выключить языки (передаётся полный список кодов) |
reorder_my_languages |
Изменить порядок отображения языков |
Часы работы#
| Команда | Описание |
|---|---|
set_working_hours |
Задать обычный недельный график (можно сразу на несколько дней, closed: true — выходной) |
list_schedule_exceptions |
Особые даты: праздники, закрытия, нестандартные часы |
add_schedule_exception |
Добавить исключение на дату («закрыто завтра», «31 декабря работаем до 4 утра») |
remove_schedule_exception |
Удалить исключение по дате или по ID |
Заказы#
| Команда | Описание |
|---|---|
list_orders |
Список заказов (по userId или домену) |
get_order |
Детали конкретного заказа |
Домены#
| Команда | Описание |
|---|---|
check_domain_availability |
Проверить доступность доменного имени |
set_location_domain |
Изменить доменное имя локации (обновляет CDN и маппинги) |
resolve_domain |
Узнать userId и locationId по домену |
list_domains |
[ADMIN] Список всех зарегистрированных доменов |
CDN (опубликованные данные)#
| Команда | Описание |
|---|---|
get_cdn_profile |
Опубликованный профиль локации (на CDN) |
get_cdn_menu |
Опубликованное меню на указанном языке |
list_cdn_files |
Все опубликованные файлы домена |
invalidate_cdn_cache |
[ADMIN] Сбросить кеш CloudFront CDN |
Изображения#
| Команда | Описание |
|---|---|
list_user_images |
Все изображения пользователя |
get_image_upload_url |
Получить presigned URL для загрузки изображения в S3 (JPEG/PNG/WebP) |
delete_image |
Удалить изображение (пользователи — только свои) |
Низкоуровневый доступ к S3#
| Команда | Описание |
|---|---|
s3_read |
Прочитать файл из S3 (пользователи — только свои) |
s3_write |
[ADMIN] Записать JSON-данные в S3 |
s3_list |
Список файлов в S3 (пользователи — только свой префикс) |
s3_delete |
[ADMIN] Удалить объект из S3 |
Cognito#
| Команда | Описание |
|---|---|
cognito_list_users |
[ADMIN] Список пользователей из Cognito User Pool |
cognito_get_user |
[ADMIN] Подробная информация о пользователе Cognito |
Статистика#
| Команда | Описание |
|---|---|
get_system_stats |
[ADMIN] Общесистемная статистика |
Аутентификация#
Сервер поддерживает три способа авторизации:
1. API-ключ (рекомендуется для AI-ассистентов)#
Authorization: Bearer ваш_64_символьный_ключ
Ключ генерируется в админ-панели. Привязан к вашему аккаунту — AI видит только ваши данные.
2. Cognito JWT-токен#
Для программной интеграции можно получить токен через логин:
# Получить токен
curl -X POST https://api.cenaly.ru/mcp/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "ваш@email.com", "password": "ваш_пароль"}'
# Ответ содержит idToken — используйте его:
Authorization: Bearer eyJraWQ...
Токен действует 1 час, после чего требуется повторный логин.
3. Admin API Key (только для администраторов)#
Authorization: Bearer admin_key
Администраторский ключ даёт полный доступ ко всем данным всех пользователей.
Безопасность#
- Каждый API-ключ привязан к конкретному аккаунту
- Обычные пользователи видят только свои данные
- Ключ можно отозвать в любой момент в админ-панели
- Максимум 10 ключей на аккаунт
- Все запросы идут через HTTPS
- Команды с пометкой
[ADMIN]недоступны обычным пользователям
Примеры использования#
Попросить AI обновить цену блюда#
«Обнови цену позиции «Хачапури» в моём меню — сделай 15 лари вместо 12»
AI вызовет my_locations → get_location_menu → update_menu_item.
Добавить новую позицию в меню#
«Добавь в категорию «Десерты» новое блюдо «Чурчхела» за 8 лари»
AI вызовет my_locations → get_location_menu → create_menu_item.
Создать новую категорию#
«Создай категорию «Напитки» с переводами на грузинский и английский»
AI вызовет create_menu_category с nameTranslations.
Переместить блюдо между категориями#
«Перенеси «Лимонад» из «Холодные напитки» в «Безалкогольные»»
AI вызовет move_menu_item с указанием исходной и целевой категории.
Посмотреть заказы за сегодня#
«Покажи мои заказы за сегодня»
AI вызовет my_orders и отфильтрует по дате.
Проверить опубликованное меню#
«Как выглядит моё меню на русском языке для посетителей?»
AI вызовет resolve_domain → get_cdn_menu с языком ru.
Сменить домен ресторана#
«Проверь, доступен ли домен my-restaurant, и если да — установи его»
AI вызовет check_domain_availability → set_location_domain.
Загрузить фото блюда#
«Дай мне ссылку для загрузки фото к блюду X»
AI вызовет get_image_upload_url и вернёт presigned URL для загрузки.
API-эндпоинты#
| Метод | URL | Описание |
|---|---|---|
GET |
https://api.cenaly.ru/mcp |
Информация о сервере + список инструментов |
POST |
https://api.cenaly.ru/mcp |
MCP JSON-RPC (основной протокол) |
GET |
https://api.cenaly.ru/mcp/health |
Проверка работоспособности |
POST |
https://api.cenaly.ru/mcp/auth/login |
Логин → JWT-токены |
GET |
https://api.cenaly.ru/mcp/api/keys |
Список ваших API-ключей |
POST |
https://api.cenaly.ru/mcp/api/keys |
Создать новый API-ключ |
DELETE |
https://api.cenaly.ru/mcp/api/keys/{id} |
Отозвать API-ключ |
Управление ключами#
Просмотр ключей#
В админ-панели → Настройки → Доступ → MCP API Ключи. Или через API:
curl https://api.cenaly.ru/mcp/api/keys \
-H "Authorization: Bearer COGNITO_JWT_TOKEN"
Создание ключа#
curl -X POST https://api.cenaly.ru/mcp/api/keys \
-H "Authorization: Bearer COGNITO_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Claude Desktop"}'
Ответ содержит поле key — это и есть ваш ключ. Сохраните его!
Отзыв ключа#
curl -X DELETE https://api.cenaly.ru/mcp/api/keys/mk_abc123 \
-H "Authorization: Bearer COGNITO_JWT_TOKEN"
Управлять ключами можно и по Cognito JWT, и по собственному MCP-ключу (в примерах выше вместо
COGNITO_JWT_TOKENподставляется он же). Не подходит только администраторский ключ: у него нет привязки к конкретному пользователю, и сервер ответит403 user identity required. Проще всего — админ-панель.
Устранение неполадок#
| Проблема | Решение |
|---|---|
401 Unauthorized |
Проверьте API-ключ. Если отозван — создайте новый |
403 user identity required |
Ключами управляют от имени пользователя: возьмите свой MCP-ключ или Cognito JWT, администраторский ключ здесь не подходит |
🔒 admin access required |
Команда доступна только администраторам |
🔒 access denied |
Вы пытаетесь получить данные другого пользователя |
| Ключ не работает | Проверьте что ключ не был отозван, и формат: Bearer <ключ> |