MCP Server — User Guide
What is it?#
The MCP server (Model Context Protocol) for cenaly.ru allows you to connect AI assistants (Claude, ChatGPT, Cursor, VS Code Copilot, etc.) to your restaurant data. The AI gets access to your menu, locations, orders, images and can manage them on your behalf.
⚠️ There is no MCP server in the Russian contour. It runs in the platform's main contour; on
cenaly.ruit was never deployed, so the "MCP API Keys" section is no longer shown in Settings there (it used to be shown and offered an address that replied "not found"). In every other contour the server works; if your account lives outside the main contour, you may not see your own data there yet — splitting the storage per contour is in progress.
Quick Start#
1. Get an API Key#
The API key is generated in your restaurant's admin panel.
Step by step:#
- Log in to the Admin Panel at admin.cenaly.ru
- In the sidebar menu, go to ⚙️ Settings → 🔑 Access
- Find the 🤖 MCP API Keys section on the page
- Click the "Generate New Key" button
- Enter a key name (e.g., "Claude Desktop", "Cursor", "My GPT") — this helps distinguish keys from each other
- Copy the key immediately — it is shown only once!
💡 The same page also displays the Server URL (
https://api.cenaly.ru/mcp), which you can copy with one click.
Managing Keys#
- You can create up to 10 keys per account
- Each key can be revoked at any time — use the "Revoke" button next to the key
- Once revoked, the key stops working immediately
- If a key is lost — revoke it and create a new one
2. Connect Your AI Assistant#
Claude Desktop / Claude Code#
Configuration file claude_desktop_config.json:
{
"mcpServers": {
"meni": {
"url": "https://api.cenaly.ru/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Cursor#
In Cursor settings → MCP Servers → Add, or create .cursor/mcp.json:
{
"mcpServers": {
"meni": {
"url": "https://api.cenaly.ru/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
VS Code (GitHub Copilot)#
In your project's .vscode/mcp.json:
{
"servers": {
"meni": {
"type": "http",
"url": "https://api.cenaly.ru/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Other AI Tools#
Detailed step-by-step instructions for Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, Cline, Continue, ChatGPT and more — in a separate guide:
What Can the AI Assistant Do?#
For Restaurant Owners (Regular Users)#
| Command | Description |
|---|---|
whoami |
Show account details (userId, email, role) |
my_profile |
Get your user profile |
update_my_profile |
Update fields in your profile |
my_locations |
List all your locations |
my_orders |
List your orders |
my_images |
List your images (menu, categories, locations) |
User Profiles#
| Command | Description |
|---|---|
get_user_profile |
Get a user profile by userId |
update_user_profile |
Update user profile fields |
list_users |
[ADMIN] List all users |
search_user_by_email |
[ADMIN] Find a user by email via Cognito |
Working with Locations#
| Command | Description |
|---|---|
list_locations |
All locations for a user |
get_location_profile |
Location profile (name, address, hours, settings) |
update_location_profile |
Update location settings (auto-synced to CDN) |
get_location_menu |
Full menu for a location with categories and items |
Working with Menus#
| Command | Description |
|---|---|
list_menu_items |
All menu items (with categoryId — full data, without — item/category ID pairs) |
get_menu_item |
Get an item with full details (translations, variants, addons) |
update_menu_item |
Update a menu item (price, description, status, tags, variants, addons) |
create_menu_item |
Create a new menu item in a category |
create_menu_category |
Create a new menu category |
update_menu_category |
Update a category (name, translations, status, sort order) |
move_menu_item |
Move a menu item from one category to another |
merge_categories |
Merge two categories (all items are moved, source is deleted) |
delete_menu_category |
Delete a category (with force: true — including all items) |
Orders#
| Command | Description |
|---|---|
list_orders |
List orders (by userId or domain) |
get_order |
Details of a specific order |
Domains#
| Command | Description |
|---|---|
check_domain_availability |
Check if a domain name is available |
set_location_domain |
Change a location's domain name (updates CDN and mappings) |
resolve_domain |
Find userId and locationId by domain |
list_domains |
[ADMIN] List all registered domains |
CDN (Published Data)#
| Command | Description |
|---|---|
get_cdn_profile |
Published location profile (on CDN) |
get_cdn_menu |
Published menu in a specific language |
list_cdn_files |
All published files for a domain |
invalidate_cdn_cache |
[ADMIN] Invalidate CloudFront CDN cache |
Images#
| Command | Description |
|---|---|
list_user_images |
All images for a user |
get_image_upload_url |
Get a presigned URL to upload an image to S3 (JPEG/PNG/WebP) |
delete_image |
Delete an image (users can only delete their own) |
Low-level S3 Access#
| Command | Description |
|---|---|
s3_read |
Read a file from S3 (users can access only their own) |
s3_write |
[ADMIN] Write JSON data to S3 |
s3_list |
List files in S3 (users can access only their own prefix) |
s3_delete |
[ADMIN] Delete an S3 object |
Cognito#
| Command | Description |
|---|---|
cognito_list_users |
[ADMIN] List users from Cognito User Pool |
cognito_get_user |
[ADMIN] Get detailed Cognito user info |
Statistics#
| Command | Description |
|---|---|
get_system_stats |
[ADMIN] System-wide statistics |
Authentication#
The server supports three authentication methods:
1. API Key (recommended for AI assistants)#
Authorization: Bearer your_64_character_key
The key is generated in the admin panel. It is bound to your account — the AI sees only your data.
2. Cognito JWT Token#
For programmatic integration, you can obtain a token via login:
# Get token
curl -X POST https://api.cenaly.ru/mcp/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "your@email.com", "password": "your_password"}'
# The response contains idToken — use it:
Authorization: Bearer eyJraWQ...
The token is valid for 1 hour, after which you need to log in again.
3. Admin API Key (administrators only)#
Authorization: Bearer admin_key
The admin key grants full access to all users' data.
Security#
- Each API key is bound to a specific account
- Regular users can see only their own data
- A key can be revoked at any time in the admin panel
- Maximum of 10 keys per account
- All requests use HTTPS
- Commands marked
[ADMIN]are not available to regular users
Usage Examples#
Ask AI to update a dish price#
"Update the price of 'Khachapuri' in my menu — make it 15 GEL instead of 12"
AI will call my_locations → get_location_menu → update_menu_item.
Add a new item to the menu#
"Add a new dish 'Churchkhela' for 8 GEL to the 'Desserts' category"
AI will call my_locations → get_location_menu → create_menu_item.
Create a new category#
"Create a 'Drinks' category with Georgian and Russian translations"
AI will call create_menu_category with nameTranslations.
Move an item between categories#
"Move 'Lemonade' from 'Cold Drinks' to 'Non-Alcoholic'"
AI will call move_menu_item specifying source and target categories.
View today's orders#
"Show me my orders for today"
AI will call my_orders and filter by date.
Check the published menu#
"How does my menu look in Russian for visitors?"
AI will call resolve_domain → get_cdn_menu with language ru.
Change the restaurant domain#
"Check if domain my-restaurant is available, and if so — set it"
AI will call check_domain_availability → set_location_domain.
Upload a dish photo#
"Give me a link to upload a photo for dish X"
AI will call get_image_upload_url and return a presigned URL for uploading.
API Endpoints#
| Method | URL | Description |
|---|---|---|
GET |
https://api.cenaly.ru/mcp |
Server info + tool list |
POST |
https://api.cenaly.ru/mcp |
MCP JSON-RPC (main protocol) |
GET |
https://api.cenaly.ru/mcp/health |
Health check |
POST |
https://api.cenaly.ru/mcp/auth/login |
Login → JWT tokens |
GET |
https://api.cenaly.ru/mcp/api/keys |
List your API keys |
POST |
https://api.cenaly.ru/mcp/api/keys |
Create a new API key |
DELETE |
https://api.cenaly.ru/mcp/api/keys/{id} |
Revoke an API key |
Key Management#
Viewing Keys#
In Admin Panel → Settings → Access → MCP API Keys. Or via API:
curl https://api.cenaly.ru/mcp/api/keys \
-H "Authorization: Bearer COGNITO_JWT_TOKEN"
Creating a Key#
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"}'
The response contains a key field — that is your key. Save it!
Revoking a Key#
curl -X DELETE https://api.cenaly.ru/mcp/api/keys/mk_abc123 \
-H "Authorization: Bearer COGNITO_JWT_TOKEN"
Keys can be managed with either a Cognito JWT or your own MCP key (substitute it for
COGNITO_JWT_TOKENin the examples above). Only the administrator key does not work here: it is not bound to a specific user, so the server answers403 user identity required. The admin panel is still the simplest route.
Troubleshooting#
| Problem | Solution |
|---|---|
401 Unauthorized |
Check your API key. If revoked — create a new one |
403 user identity required |
Key management runs on behalf of a user: use your own MCP key or a Cognito JWT — the administrator key does not work here |
🔒 admin access required |
This command is for administrators only |
🔒 access denied |
You are trying to access another user's data |
| Key doesn't work | Check that the key hasn't been revoked, and format: Bearer <key> |