# 🔧 ИСПРАВЛЕНИЕ KeyError "'\"retCode\"'" в MCP инструментах
**Дата**: 20 ноября 2025
**Статус**: ✅ ИСПРАВЛЕНО
---
## 🎯 ПРОБЛЕМА
При вызове проблемных MCP инструментов возникала ошибка:
```
KeyError: '"retCode"'
```
**Проблемные инструменты:**
1. ❌ `get_asset_price` - ошибка `"'\"retCode\"'"`
2. ❌ `analyze_asset` - ошибка `"'\"retCode\"'"` на таймфреймах
3. ❌ `get_btc_correlation` - ошибка `"'\"retCode\"'"`
4. ❌ `find_oversold_assets` - ошибка при получении баланса
---
## 🔍 КОРНЕВАЯ ПРИЧИНА
CCXT выбрасывает исключения, которые содержат JSON строки вида:
```
bybit {"retCode":10003,"retMsg":"API key is invalid.",...}
```
Когда код пытался обработать это исключение и извлечь `retCode`, он пытался использовать `.get("retCode")` на строке, что вызывало KeyError с сообщением `"'\"retCode\"'"`.
---
## ✅ РЕШЕНИЕ
### 1. Добавлена функция `parse_ccxt_error()`
**Файл**: [`mcp_server/bybit_client.py:26-60`](mcp_server/bybit_client.py:26-60)
```python
def parse_ccxt_error(error: Exception) -> Dict[str, Any]:
"""
Парсит ошибки CCXT, которые могут содержать JSON строки вида:
'bybit {"retCode":10003,"retMsg":"API key is invalid.",...}'
Returns:
{
"retCode": int or None,
"retMsg": str,
"parsed": bool,
"original_error": str
}
"""
error_str = str(error)
# Ищем JSON в строке ошибки (формат: "bybit {...}" или просто "{...}")
json_match = re.search(r'\{[^{}]*"retCode"[^{}]*\}', error_str)
if json_match:
try:
json_str = json_match.group(0)
error_data = json.loads(json_str)
return {
"retCode": error_data.get("retCode"),
"retMsg": error_data.get("retMsg", "Unknown error"),
"parsed": True,
"original_error": error_str
}
except (json.JSONDecodeError, KeyError) as e:
logger.debug(f"Failed to parse JSON from error: {e}")
# Если не нашли JSON, возвращаем оригинальную ошибку
return {
"retCode": None,
"retMsg": error_str,
"parsed": False,
"original_error": error_str
}
```
### 2. Обновлена обработка ошибок в `get_asset_price()`
**Файл**: [`mcp_server/bybit_client.py:527-560`](mcp_server/bybit_client.py:527-560)
- ✅ Добавлен парсинг ошибок CCXT через `parse_ccxt_error()`
- ✅ Специфичная обработка retCode: 10003, 10004, 10005
- ✅ Понятные сообщения об ошибках с инструкциями
### 3. Обновлена обработка ошибок в `get_ohlcv()`
**Файл**: [`mcp_server/bybit_client.py:683-749`](mcp_server/bybit_client.py:683-749)
- ✅ Добавлен парсинг ошибок CCXT через `parse_ccxt_error()`
- ✅ Специфичная обработка retCode перед проверкой DNS/Network ошибок
- ✅ Правильное пробрасывание исключений с понятными сообщениями
### 4. Обновлена обработка ошибок в `get_account_info()`
**Файл**: [`mcp_server/bybit_client.py:985-1005`](mcp_server/bybit_client.py:985-1005)
- ✅ Добавлен парсинг ошибок CCXT через `parse_ccxt_error()`
- ✅ Специфичная обработка retCode: 10003
### 5. Обновлена обработка ошибок в `get_public_trade_history()`
**Файл**: [`mcp_server/bybit_client.py:1424-1440`](mcp_server/bybit_client.py:1424-1440)
- ✅ Добавлен парсинг ошибок CCXT через `parse_ccxt_error()`
- ✅ Специфичная обработка retCode: 10003
---
## 📊 РЕЗУЛЬТАТ
### ДО исправлений:
- ❌ KeyError: `"'\"retCode\"'"` при вызове инструментов
- ❌ Непонятные сообщения об ошибках
- ❌ Невозможность определить причину ошибки (API key invalid, permissions, etc.)
### ПОСЛЕ исправлений:
- ✅ Правильный парсинг ошибок CCXT
- ✅ Понятные сообщения об ошибках с инструкциями
- ✅ Специфичная обработка каждого retCode (10003, 10004, 10005)
- ✅ Правильное пробрасывание исключений
---
## 🧪 ТЕСТИРОВАНИЕ
После исправлений инструменты должны:
1. ✅ Правильно парсить ошибки CCXT
2. ✅ Возвращать понятные сообщения об ошибках
3. ✅ Не выбрасывать KeyError при обработке ошибок API
**Примечание**: Если API ключи невалидны, инструменты будут возвращать понятные ошибки вместо KeyError.
---
## 📝 ИЗМЕНЕННЫЕ ФАЙЛЫ
1. **`mcp_server/bybit_client.py`**
- Добавлена функция `parse_ccxt_error()`
- Обновлена обработка ошибок в:
- `get_asset_price()`
- `get_ohlcv()`
- `get_account_info()`
- `get_public_trade_history()`
---
## 🚀 СЛЕДУЮЩИЕ ШАГИ
1. **Протестировать исправления**:
- Вызвать проблемные инструменты снова
- Убедиться, что KeyError больше не возникает
- Проверить, что ошибки API обрабатываются правильно
2. **Если API ключи невалидны**:
- Обновить `BYBIT_API_KEY` и `BYBIT_API_SECRET` в GitHub Secrets
- Убедиться, что ключи имеют READ permissions
- Проверить IP whitelist на Bybit
---
**Версия**: 1.0
**Последнее обновление**: 2025-11-20