MCP Server β User Guide
What is it?
The MCP server (Model Context Protocol) for meni.ge 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.
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.meni.ge
- 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.meni.ge/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.meni.ge/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Cursor
In Cursor settings β MCP Servers β Add, or create .cursor/mcp.json:
{
"mcpServers": {
"meni": {
"url": "https://api.meni.ge/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.meni.ge/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.meni.ge/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.meni.ge/mcp |
Server info + tool list |
POST |
https://api.meni.ge/mcp |
MCP JSON-RPC (main protocol) |
GET |
https://api.meni.ge/mcp/health |
Health check |
POST |
https://api.meni.ge/mcp/auth/login |
Login β JWT tokens |
GET |
https://api.meni.ge/mcp/api/keys |
List your API keys |
POST |
https://api.meni.ge/mcp/api/keys |
Create a new API key |
DELETE |
https://api.meni.ge/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.meni.ge/mcp/api/keys \
-H "Authorization: Bearer COGNITO_JWT_TOKEN"
Creating a Key
curl -X POST https://api.meni.ge/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.meni.ge/mcp/api/keys/mk_abc123 \
-H "Authorization: Bearer COGNITO_JWT_TOKEN"
β οΈ Creating and revoking keys requires a Cognito JWT token (not an API key). Use the admin panel β it's simpler.
Troubleshooting
| Problem | Solution |
|---|---|
401 Unauthorized |
Check your API key. If revoked β create a new one |
403 user identity required |
Use Cognito JWT for key management |
π 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> |