API и MCP
HTTP API для управления ботом и тестером: настройки, стратегии, API-ключи бирж, позиции и ордера, логи, запуск тестера и работа с его отчётами. Бот также работает как MCP-сервер — ИИ-ассистент может сам смотреть состояние бота, вести исследования в тестере и управлять стратегиями.
Адрес — тот же, что у веб-интерфейса: http://<хост>:<порт>. Порт задаётся полем
port в settings_program.json.
Доступ Запросы и ответы Эндпоинты Тестер MCP для ИИ-ассистентов Коды ответов
Доступ
Токен API (рекомендуется)
Передавайте в каждом запросе заголовок Authorization: Bearer <api_token>:
curl -H "Authorization: Bearer <api_token>" http://127.0.0.1:5000/api/current/bots
api_token бот создаёт сам при первом запуске и хранит в settings_program.json.
Токен работает с любого адреса и при любом значении auth_telegram, и вход из браузера его не
сбрасывает.
Посмотреть и скопировать токен можно в веб-интерфейсе: «Глобальная конфигурация», блок «Токен API и MCP».
Там же кнопка «Выпустить новый» — прежний токен сразу перестаёт действовать. При выключенном входе через
Telegram этот блок работает только с этой же машины (127.0.0.1).
В редакторе конфига, в логе и в ответе GET /api/settings/config токен скрыт (видны последние 4
символа), а через редактор и POST /api/settings/config его изменить нельзя. Новый токен через
API: POST /api/settings/api-token/regenerate, ответ
{ "success": true, "api_token": "..." }.
⚠️ Храните токен как пароль: с ним доступно всё, включая торговлю и ключи бирж.
Без токена, с той же машины
Если вход через Telegram выключен ("auth_telegram": false), запросы без токена принимаются
только с этой же машины по адресу 127.0.0.1 или localhost:
curl http://127.0.0.1:5000/api/current/bots
С других адресов без токена API отвечает 401. Веб-интерфейс при выключенном входе по-прежнему
открыт любому, кто может подключиться к порту, поэтому на сервере с открытым портом оставляйте вход
включённым.
Запросы со страниц других сайтов
POST с заголовком Origin, не совпадающим с адресом бота, отклоняется с кодом
403 — это защита от CSRF. curl, скрипты и MCP-клиенты заголовок Origin не
отправляют, их это не касается. Если бот стоит за обратным прокси, прокси должен передавать исходный
заголовок Host.
Cookie входа
Вместо токена можно передавать cookie hamster-bot-token, если вход через Telegram
включён:
POST /htmx/login/get-token— бот присылает одноразовый код в Telegram.POST /htmx/login/verifyс формойtoken_enter=<код>— в ответе приходит заголовокSet-Cookie: hamster-bot-token=...- Передавайте cookie в запросах:
curl -b "hamster-bot-token=<значение>" ...
Cookie действует до 10 дней. Действует только последний вход: новый вход (в том числе из браузера) делает прежний cookie недействительным.
Запросы и ответы
- Тело POST-запросов — JSON в кодировке UTF-8 (
Content-Type: application/json). - Имена в пути URL-кодируются: стратегия
T4 BTC→/api/settings/strategy/T4%20BTC. - Настройки и конфиги передаются и возвращаются в том же виде, что и в JSON-файлах бота.
- Успешное действие возвращает
{ "success": true, ... }, ошибка —{ "success": false, "error": "текст ошибки" }с кодом из таблицы коды ответов. - Бот определяется аккаунтом и именем стратегии:
/{accountName}/{settingsName}. Если стратегия торгует несколькими парами, нужную пару выбирает параметр?symbol=, без него берётся первая.
Пример: создать стратегию из черновика со значениями по умолчанию.
curl -X POST http://127.0.0.1:5000/api/settings/strategy/draft \
-H "Content-Type: application/json" \
-d '{ "account": "main", "symbol": "BTCUSDT", "strategy": "zigzag", "time_frame": "1h" }'
Черновик ничего не сохраняет: поправьте полученный объект и отправьте его в
POST /api/settings/strategy — стратегия сохранится и сразу запустится.
curl -X POST http://127.0.0.1:5000/api/bots/main/T4%20BTC/pause
{ "success": true, "name": "T4 BTC", "is_runing": false }
Эндпоинты
Под описанием эндпоинта — свёрнутый пример запроса и ответа.
Настройки
| GET | /api/settings/config | Глобальный конфиг (settings_program.json). Токен Telegram-бота замаскирован: видны первые 4 символа. api_token замаскирован: видны последние 4 символа
Пример{
"name": "MyBot",
"use_web": true,
"port": 5000,
"api_token": "••••••••••••b9c2",
"telegram": {
"bot_token": "1234************",
"id_chat": 123456789
}
}
|
| POST | /api/settings/config | Изменить конфиг: передайте только меняющиеся поля, применяется сразу. Токен Telegram-бота и api_token здесь не меняются: эти поля в теле игнорируются
ПримерЗапрос: { "name": "MyBot", "chart": { "count": 500 } }
Ответ: { "success": true }
|
| POST | /api/settings/api-token/regenerate | Выпустить новый api_token, прежний сразу перестаёт действовать. Единственный ответ API, в котором токен виден целиком. Тело не нужно
Пример{ "success": true, "api_token": "<новый токен>" }
|
| GET | /api/settings/hints/{kind} | Описания полей настроек: settings, config_tester, settings_program. Параметры ?lang= (en, ru, pt), ?filter=
ПримерЗапрос: GET /api/settings/hints/config_tester?filter=parameter_mining,monte_carlo Ответ — объект «путь поля через точку → описание»: {
"parameter_mining": "List of parameters to mine. Each has a name (parameter path) and either a start/end/step range or a values list...",
"monte_carlo": "Mining limit: if there are more combinations than this number, a random sample of this size is used..."
}
|
Стратегии
| GET | /api/settings/strategy | Все стратегии бота
Пример[
{
"name": "T4 BTC",
"is_runing": true,
"exchange": { "name": "binance", "account": "main" },
"basic": { "symbol": "BTCUSDT", "strategy": "zigzag", "time_frame": "1h" }
}
]
|
| GET | /api/settings/strategy/{name} | Одна стратегия по имени (без учёта регистра) |
| POST | /api/settings/strategy/draft | Черновик со значениями по умолчанию для аккаунта, ничего не сохраняет
ПримерЗапрос: { "account": "main", "symbol": "BTCUSDT", "strategy": "zigzag", "time_frame": "1h", "account_type": "UNIFIED" }
Вместо |
| POST | /api/settings/strategy | Создать или изменить стратегию, изменения сразу применяются. ?old_name= — переименовать
ПримерЗапрос (тело — объект стратегии): POST /api/settings/strategy?old_name=T4%20BTC Ответ ( { "success": true, "name": "T4 BTC v2", "created": false }
|
| POST | /api/settings/strategy/{name}/copy | Копия под новым именем, сохраняется и запускается
ПримерЗапрос ( { "new_name": "T4 ETH", "new_symbol": "ETHUSDT" }
Ответ: { "success": true, "name": "T4 ETH" }
|
| POST | /api/settings/strategy/{name}/delete | Удалить стратегию, ордера и позиция не трогаются. ?full=1 — сначала отменить ордера и закрыть позицию
ПримерЗапрос: POST /api/settings/strategy/T4%20BTC/delete?full=1 Ответ: { "success": true }
Если при |
Аккаунты (API-ключи бирж)
| GET | /api/settings/accounts | Все аккаунты
Пример[
{
"name": "main",
"exchange": "binance",
"api_key": "...",
"api_secret": "...",
"is_encrypted": true
}
]
|
| GET | /api/settings/accounts/{name} | Один аккаунт |
| GET | /api/settings/accounts/{name}/symbols | Пары, доступные на бирже для аккаунта
Пример["BTCUSDT", "ETHUSDT"] |
| POST | /api/settings/accounts | Создать или изменить аккаунт, ключи передаются открытым текстом. ?old_name= — переименовать
ПримерЗапрос: { "name": "main", "exchange": "binance", "api_key": "...", "api_secret": "...", "is_encrypted": true, "open_positions_limiter": 0 }
Ответ ( { "success": true, "name": "main", "applied": 3 }
При |
| POST | /api/settings/accounts/{name}/delete | Удалить аккаунт |
| GET | /api/current/accounts/{name}/info | Данные аккаунта и ключа с биржи, обновляются раз в час (нужен запущенный бот на аккаунте)
Пример{
"name": "main",
"exchange": "binance",
"api_key": "abc1****",
"account_type": "UNIFIED",
"symbol": "BTCUSDT",
"ok": true,
"status": "OK",
"warnings": [],
"rows": [ { "name": "Permissions", "value": "..." } ],
"updated_utc": "2026-10-25T12:00:00Z"
}
|
| GET | /api/current/accounts/{name}/balance-history | История баланса, ?max= — не больше стольких точек (по умолчанию 5000)
Пример{
"account": "main",
"total": 12000,
"points": [ { "time": 1761393600, "margin": 1234.5, "wallet": 1200.0, "positions": "..." } ]
}
|
| POST | /api/current/accounts/{name}/balance-history/compact | Сжать историю баланса сейчас по настройкам monitoring
Пример{ "success": true, "message": "...", "points_before": 12000, "points_after": 3000, "bytes_before": 512000, "bytes_after": 128000 }
|
Боты
| GET | /api/current/bots | Сводка по всем ботам: статус, цена, позиция, число ордеров, синхронизация с биржей
Пример[
{
"account": "main",
"exchange": "binance",
"strategy": "T4 BTC",
"strategy_code": "zigzag",
"symbol": "BTCUSDT",
"time_frame": "1h",
"is_runing": true,
"is_live": true,
"status_text": "...",
"last_price": 65500.0,
"last_bar_time": "2026-10-25T12:00:00",
"last_sync_utc": "2026-10-25T12:00:05Z",
"sync_missed_cycles": 0,
"position": { "side": "Buy", "size": 0.01, "entry_price": 65000.0, "cost": 650.0, "unrealized_pnl": 5.0 },
"orders": 2
}
]
|
| GET | /api/current/balances | Баланс кошелька и маржи по ключам, отдельно спот и фьючерсы. ?account=
ПримерЗапрос: GET /api/current/balances?account=main Ответ: [
{ "account": "main", "exchange": "bybit", "type": "futures", "wallet": 1234.56, "margin": 1180.20 },
{ "account": "main", "exchange": "bybit", "type": "spot", "wallet": 500.00, "margin": 500.00 }
]
Для спота оба значения — баланс в USDT. Баланс берётся у запущенных ботов: аккаунт без запущенного бота в список не попадает. |
| GET | /api/current/bots/{accountName}/{settingsName}/bars | Свечи бота, ?limit= — последние N (по умолчанию 500)
ПримерЗапрос: GET /api/current/bots/main/T4%20BTC/bars?limit=100 Ответ — массив свечей с полями |
| GET | /api/current/ubots/api/current/ubots/{accountName}/{settingsName} | Полный снимок состояния. Формат может меняться между версиями — для постоянной интеграции используйте bots, positions, orders |
| POST | /api/bots/pause-all/api/bots/play-all | Пауза / запуск всех ботов
Пример{ "success": true, "count": 5 }
|
| POST | /api/bots/{accountName}/{settingsName}/pause/api/bots/{accountName}/{settingsName}/play | Пауза / запуск стратегии (для стратегии на несколько пар — все её пары)
ПримерЗапрос: POST /api/bots/main/T4%20BTC/pause Ответ (для { "success": true, "name": "T4 BTC", "is_runing": false }
|
| POST | /api/bots/{accountName}/{settingsName}/send-chart | Отправить график бота в Telegram |
| POST | /api/bots/{accountName}/{settingsName}/send-position | Отправить в Telegram сводку: баланс, позиция, PnL, ордера |
Позиции и ордера
| GET | /api/current/positions | Позиции всех ботов
Пример[
{
"account": "main",
"exchange": "binance",
"strategy": "T4 BTC",
"symbol": "BTCUSDT",
"position": {
"Symbol": "BTCUSDT",
"Side": "Buy",
"Size": 0.01,
"EntryPrice": 65000.0,
"Cost": 650.0,
"UnrealizedPnl": 12.5,
"Leverage": 10,
"Cross": false
}
},
{
"account": "sub1",
"exchange": "binance",
"strategy": "T3 ETH",
"symbol": "ETHUSDT",
"position": null
}
]
|
| GET | /api/current/orders | Открытые ордера всех ботов
Пример[
{
"account": "main",
"exchange": "binance",
"strategy": "T4 BTC",
"symbol": "BTCUSDT",
"order": {
"Id": "order-123",
"client_id": "cl-456",
"Market": "BTCUSDT",
"Side": "Buy",
"Type": "Limit",
"Status": "New",
"Size": 0.01,
"filledSize": 0.0,
"remainingSize": 0.01,
"Price": 64000.0,
"TriggerPrice": null,
"ReduceOnly": false
}
}
]
|
| POST | /api/trading/market | Рыночный ордер на аккаунте. Пара должна торговаться одним из ботов этого аккаунта
ПримерЗапрос ( { "account": "main", "symbol": "BTCUSDT", "side": "Buy", "size": 0.01 }
Ответ: { "success": true, "order_id": "order-123" }
|
| POST | /api/positions/{accountName}/{settingsName}/close | Закрыть позицию бота
ПримерЗапрос: POST /api/positions/main/T4%20BTC/close Ответ: { "success": true }
|
| POST | /api/positions/{accountName}/close-all | Закрыть все позиции аккаунта
Пример{ "success": true, "count": 3 }
|
| POST | /api/positions/{accountName}/reduce | Сократить все позиции аккаунта на percent (1–100)
ПримерЗапрос: { "percent": 50 }
Ответ: { "success": true, "count": 3 }
|
| POST | /api/orders/{accountName}/{settingsName}/{orderId}/cancel | Отменить один ордер (обычный или стоп-ордер)
ПримерЗапрос: POST /api/orders/main/T4%20BTC/order-123/cancel Ответ: { "success": true }
|
| POST | /api/orders/{accountName}/cancel-all | Отменить все ордера аккаунта
Пример{ "success": true, "count": 2 }
|
| POST | /api/orders/cancel-all | Отменить все ордера на всех аккаунтах
Пример{ "success": true, "count": 7 }
|
Система и логи
| GET | /api/system/status | Версия программы, ресурсы сервера, счётчики ботов
Пример{
"program": "hamster-bot",
"version": "2026/10/23",
"name": "MyBot",
"type": "bot",
"os": "Linux 6.1",
"architecture": "X64",
"machine": "srv1",
"runtime": ".NET 8.0",
"processors": 4,
"uptime_sec": 86400,
"cpu_percent": 12.5,
"memory_total_bytes": 8589934592,
"memory_available_bytes": 4294967296,
"process_memory_bytes": 314572800,
"disk": "/",
"disk_total_bytes": 107374182400,
"disk_free_bytes": 53687091200,
"accounts": 2,
"strategies": 5,
"bots": 6,
"bots_running": 5,
"auto_update_supported": true
}
|
| POST | /api/system/shutdown | Завершить программу (только при входе через Telegram) |
| POST | /api/system/update | Запустить обновление программы (см. auto_update_supported в статусе) |
| GET | /api/logs | Последние строки общего лога (массив строк), ?tail= |
| GET | /api/logs/errors | Ошибки за ?hours= часов (по умолчанию 24, до 48), ?warnings=1 — с предупреждениями
Пример[
{
"level": "Error",
"first_utc": "2026-10-25T08:00:00Z",
"last_utc": "2026-10-25T12:00:00Z",
"count": 3,
"source": "T4 BTC",
"message": "...",
"exception": "..."
}
]
Одинаковые сообщения объединены, |
| GET | /api/logs/files | Файлы логов, свежие первыми
Пример[ { "name": "log_25-10-2026.log", "size": 102400, "modified_utc": "2026-10-25T12:00:00Z" } ]
|
| GET | /api/logs/files/{filename} | Содержимое файла лога как текст, ?download=1 — скачать |
Тестер
| GET | /api/tester/status | Состояние тестера: прогоны, одиночные прогоны, загрузка данных
Пример{
"run": {
"active": true,
"status": "Running",
"started_utc": "2026-10-25T12:00:00Z",
"finished_utc": null,
"message": "API mining run",
"runs_done": 40,
"runs_total": 120,
"current_bar": 5000,
"total_bars": 20000,
"parallel": false
},
"wizard_runs": [
{
"run_id": "a1b2c3d4",
"strategies": ["T4 BTC"],
"status": "Completed",
"started_utc": "2026-10-25T11:00:00Z",
"finished_utc": "2026-10-25T11:02:00Z",
"current_bar": 20000,
"total_bars": 20000,
"message": "Completed: 1 strategies."
}
],
"download": { "active": false, "status": "Idle", "started_utc": null, "finished_utc": null, "message": "" },
"settings_folder": ""
}
|
| GET POST | /api/tester/config | Конфиг тестера (config_tester.json): период, комиссии, параметры перебора. POST — конфиг целиком |
| GET | /api/tester/exchanges/api/tester/exchanges/{exchange}/symbols | Биржи с историческими данными и их пары. Пустой список пар — биржа сейчас недоступна
Пример["bybit", "binance", ...] |
| GET | /api/tester/settings/api/tester/settings/{name} | Настройки стратегий тестера в текущей папке
Пример[ { "name": "T4 BTC", "exchange": "bybit", "symbol": "BTCUSDT", "symbols": null, "strategy": "zigzag", "time_frame": "1h" } ]
|
| POST | /api/tester/settings/draft | Черновик настройки, ничего не сохраняет
ПримерЗапрос: { "exchange": "bybit", "symbol": "BTCUSDT", "strategy": "zigzag", "time_frame": "1h" }
Вместо |
| POST | /api/tester/settings | Сохранить настройку, ?old_name= — переименовать. Существующая с тем же именем не перезаписывается
Пример{ "success": true, "name": "T4 BTC" }
|
| POST | /api/tester/settings/{name}/copy/api/tester/settings/{name}/delete | Копировать (можно на другую биржу или пару) / удалить
ПримерЗапрос { "new_name": "T4 BTC binance", "new_exchange": "binance", "new_symbol": "" }
Ответ: { "success": true, "name": "T4 BTC binance" }
|
| GET POST | /api/tester/settings-folder | Текущая папка настроек тестера и выбор другой ("" — основная папка)
ПримерGET — ответ ( { "path": "", "folders": [ { "name": "2026-10", "settings": 12 } ] }
POST — запрос: { "path": "2026-10" }
POST — ответ: { "success": true, "path": "2026-10" }
|
| POST | /api/tester/run | Перебор параметров (parameter_mining)
ПримерЗапрос ( { "settings": ["T4 BTC", "T4 ETH"], "config": { ... } }
Ответ: { "success": true }
|
| POST | /api/tester/stress | Стресс-тест: те же настройки в ухудшенных условиях исполнения. Тело и ответы — как у /api/tester/run |
| POST | /api/tester/wizard-run | Одиночный прогон. Тело — как у /api/tester/run
Пример{ "success": true, "run_id": "a1b2c3d4" }
Ход прогона — в |
| POST | /api/tester/snapshot-run | Повтор прогона по snapshot-файлу (?root=&path=). Тело необязательно: изменённый snapshot действует только на этот запуск
ПримерPOST /api/tester/snapshot-run?root=report&path=T4/run_snapshot_20261025.json |
| POST | /api/tester/download-data | Загрузить исторические данные для всех настроек тестера |
| GET | /api/tester/wizard-results | Результаты одиночных прогонов, свежие первыми: метрики и пути к отчётам
Пример[
{
"runId": "a82c93c5",
"timestamp": "2026-10-25T05:26:50Z",
"strategies": ["T4 BTC"],
"stats": {
"InitialBalance": 10000.0, "FinalBalance": 9581.25, "TotalPnL": -418.75, "TotalPnLPercent": -4.19,
"TotalTrades": 23, "WinRate": 13.04, "MaxDrawdown": 527.89, "MaxDrawdownPercent": 5.26, "TotalFees": 22.2
},
"chartUrl": "/tester-report/T4/T4_run_001_of_001_BTCUSDT_1h_ee8c3c2e.html",
"report_path": "T4/T4_run_001_of_001_BTCUSDT_1h_ee8c3c2e.html",
"report_json_path": "T4/T4_run_001_of_001_BTCUSDT_1h_ee8c3c2e.json",
"period": "2025-09-01 .. 2025-09-20",
"elapsed": "00:00:07"
}
]
|
| GET | /api/tester/files | Папки тестера: ?root=report|data|runs&path=
Пример{
"root": "report",
"path": "T4",
"items": [
{ "name": "old", "is_dir": true, "size": 204800, "modified_utc": "2026-10-20T10:00:00Z", "snapshot": false, "editable": false },
{ "name": "run_snapshot_20261025.json", "is_dir": false, "size": 51200, "modified_utc": "2026-10-25T12:00:00Z", "snapshot": true, "editable": false }
]
}
|
| GET POST | /api/tester/files/download/api/tester/files/delete/api/tester/files/content/api/tester/files/save | Скачать, удалить, прочитать snapshot, сохранить JSON в runs (?root=&path=) |
| GET | /api/tester/reports/summary | Сводки отчётов для сравнения: метрики и кривая доходности, ?r= можно повторять
ПримерЗапрос: GET /api/tester/reports/summary?r=T4/report.html&r=T4_STRESS/report.html Ответ: [
{
"report": "T4/report.html",
"created": "2026-10-25T12:00:00Z",
"summary": {
"name_comment": "T4",
"start": "2025-01-01T00:00:00",
"end": "2026-01-01T00:00:00",
"symbols": ["BTCUSDT"],
"metrics": { "TotalPnLPercent": 42.1, "MaxDrawdownPercent": 12.3, "ProfitFactor": 1.8, "WinRate": 55.0, "TotalTrades": 120 },
"equity_t": [1735689600],
"equity_v": [1000.0]
}
}
]
|
| GET | /api/tester/reports/json | Подробные результаты прогона в компактном JSON: ?path=, ?sections=, ?trades_offset=, ?trades_limit=
ПримерЗапрос: GET /api/tester/reports/json?path=T4/T4_run_001_of_001_BTCUSDT_1h_ee8c3c2e.html§ions=by_symbol,trades&trades_limit=2 Ответ: {
"v": 1,
"created_utc": "2026-10-25T05:45:34Z",
"html_report": "T4_run_001_of_001_BTCUSDT_1h_ee8c3c2e.html",
"by_symbol": [
{ "symbol": "BTCUSDT", "strategy": "zigzag", "trades": 23, "win_rate": 13.04, "profit_factor": 0.395, "pnl": -390.14,
"best_trade": 160.02, "worst_trade": -57.7, "max_drawdown_incl_unrealized": -483.2, "buy_hold_percent": 6.81,
"fee": 22.2, "volume": 221995.16, "position_avg_percent": 49.31, "position_max_percent": 50.72 }
],
"trades": {
"count": 23,
"columns": ["symbol", "side", "open", "close", "holding_hours", "fills", "net_pnl", "mae", "mfe"],
"rows": [
["BTCUSDT", "short", "2025-09-01 00:04", "2025-09-01 07:54", 7.83, 2, -57.6968, -57.6968, 38.8311],
["BTCUSDT", "long", "2025-09-01 07:54", "2025-09-01 20:45", 12.85, 2, -46.2855, -50.7967, 26.7293]
],
"offset": 0
}
}
В |
| GET | /api/tester/publish/files | Файлы папки отчёта, которые можно опубликовать на сайт, ?path=
Пример[ { "name": "reports_history.csv", "size": 10240, "kind": "history" } ]
|
| POST | /api/tester/publish | Отправить выбранные файлы на сайт, публикация появляется после модерации
ПримерЗапрос ( { "path": "T4", "files": ["reports_history.csv"], "contact": "@telegram", "comment": "...", "agree": true }
Ответ: { "success": true, "sent": ["reports_history.csv"] }
|
Тестер через API
- Все запуски работают в фоне: ответ приходит сразу, ход и результат — в
GET /api/tester/status. - Перебор параметров, стресс-тест и повтор по snapshot выполняются по одному. Одиночные прогоны можно
запускать параллельно. Пока загружаются исторические данные, тестер не запускается, и наоборот —
ответ
409. - Запущенный перебор нельзя остановить, поэтому заранее проверяйте число комбинаций (или задайте
monte_carlo— случайную выборку). - Результаты перебора — в папке
report/<name_comment>:reports_history.csvс метриками каждой комбинации, HTML- и JSON-отчёты, сводный отчёт оптимизатора. Давайте каждому эксперименту свойname_comment. - JSON-отчёт (
report.enable_json_report) содержит те же числа, что HTML-отчёт, но в десятки раз меньше: разделыrun,metrics,by_symbol,monthly,trades,curves,settings.
MCP для ИИ-ассистентов
Бот работает как MCP-сервер (Model Context Protocol): ИИ-ассистент — Claude и другие клиенты MCP — может сам смотреть состояние бота, запускать тестер и управлять стратегиями. Инструменты MCP повторяют API и подчиняются тем же правилам доступа.
Включение
По умолчанию MCP выключен. Включите его в settings_program.json:
{ "use_mcp": true }
Изменение действует сразу, перезапуск не нужен. Можно и через API: POST /api/settings/config с
телом { "use_mcp": true }. Пока MCP выключен, /mcp отвечает 404.
Адрес: http://127.0.0.1:<порт>/mcp, транспорт Streamable HTTP.
Подключение к Claude Code
claude mcp add --transport http hamster-bot http://127.0.0.1:5000/mcp --header "Authorization: Bearer <api_token>"
Или в файле .mcp.json проекта:
{
"mcpServers": {
"hamster-bot": {
"type": "http",
"url": "http://127.0.0.1:5000/mcp",
"headers": { "Authorization": "Bearer <api_token>" }
}
}
}
Другие клиенты подключаются по тому же адресу, если поддерживают Streamable HTTP и свои заголовки запроса.
Доступ и безопасность
- Доступ — как у API (см. Доступ): заголовок
Authorization: Bearer <api_token>с любого адреса; без него — cookiehamster-bot-tokenпри включённом входе или только с этой же машины при выключенном. Иначе/mcpотвечает401. - Для подключения с другой машины укажите вместо
127.0.0.1адрес сервера. Токен при этом передаётся открытым текстом, поэтому через интернет подключайтесь через HTTPS-прокси или SSH-туннель. - Инструменты, которые торгуют на бирже, запускают торговлю или необратимо меняют данные, помечены как
опасные (
destructiveHint) — клиент запрашивает подтверждение перед их вызовом: рыночные ордера, закрытие позиций, отмена ордеров, запуск ботов, сохранение и удаление стратегий и ключей, изменение конфига, выключение и обновление программы. - Чтение состояния помечено как безопасное (
readOnlyHint).
Инструменты
| Настройки | get_config, update_config, get_field_hints |
| Стратегии | list_strategies, get_strategy, draft_strategy, save_strategy, copy_strategy, delete_strategy |
| Аккаунты | list_accounts, get_account, get_account_symbols, save_account, delete_account, get_account_info, get_balance_history, compact_balance_history |
| Боты | list_bots, get_balances, get_bot_bars, get_bot_state, pause_all_bots, play_all_bots, pause_bot, play_bot, send_chart_to_telegram, send_position_to_telegram |
| Позиции и ордера | list_positions, list_orders, market_order, close_position, close_all_positions, reduce_positions, cancel_order, cancel_account_orders, cancel_all_orders |
| Система и логи | get_system_status, shutdown_program, update_program, get_log, get_errors, list_log_files, read_log_file |
| Тестер | tester_status, get_tester_config, save_tester_config, tester_exchanges, tester_exchange_symbols, list_tester_settings, get_tester_settings, draft_tester_settings, save_tester_settings, copy_tester_settings, delete_tester_settings, get_tester_settings_folder, set_tester_settings_folder, tester_run_mining, tester_run_stress, tester_run_single, tester_run_snapshot, tester_download_data, tester_wizard_results, list_tester_files, read_tester_file, save_tester_file, delete_tester_file, tester_report_summaries, read_tester_report, tester_publish_files, tester_publish |
Ошибка API возвращается ассистенту как ошибка инструмента с кодом и текстом, например
HTTP 404: {"success":false,"error":"Strategy not found"}. Очень длинные ответы обрезаются до
200 000 символов. У read_tester_file для длинных CSV есть параметры tail_lines и
contains. Для сравнения прогонов лучше tester_report_summaries, для подробностей
одного прогона — read_tester_report.
Исследования в тестере
Ассистент может сам вести исследование стратегии. Тестер работает на исторических данных и с биржей не торгует. Типичный порядок:
get_field_hints— узнать смысл полей настроек стратегии и конфига тестера, в том числе синтаксисparameter_mining.draft_tester_settings,save_tester_settings— создать настройки для нужной биржи, пары и таймфрейма.save_tester_config— задать период, комиссии,parameter_miningи новыйname_comment; включитьreport.enable_json_report.tester_download_data— загрузить свечи и дождаться окончания вtester_status.tester_run_singleилиtester_run_mining— проверить одну комбинацию или перебрать все: результаты вtester_wizard_resultsили<name_comment>/reports_history.csv.read_tester_report— разобрать прогон: итоги по парам, месяцы, сделки.tester_report_summaries,tester_run_stress— сравнить лучшие варианты и проверить их устойчивость (а такжеwalk_forwardв конфиге).
Пример запроса к ассистенту: «Подбери длину зигзага для BTCUSDT 1h на бирже Bybit за последние три месяца. Сравни лучшие варианты по просадке и проверь их стресс-тестом».
Коды ответов
| 200 | Успех |
| 400 | Неверный запрос: пустое тело, неверный JSON, не заполнены обязательные поля |
| 401 | Нет доступа: неверный api_token; cookie отсутствует, устарел или заменён новым входом; запрос без токена не с этой же машины |
| 403 | Запрос со страницы другого сайта (Origin не совпадает с адресом бота) |
| 404 | Не найдено |
| 409 | Конфликт: тестер или загрузка данных уже работают, имя занято, нет нужного запущенного бота |
| 500 | Внутренняя ошибка или ошибка биржи |
| 502 | Внешний сервис не принял запрос |
| 503 | Программа ещё запускается |