Skip to main content
Glama
Leevandr

Solana Divers MCP Server

by Leevandr
README.md
# Solana Divers MCP Server

MCP-сервер для поиска по архиву Telegram-чатов Solana-разработчиков. Работает с Claude Web, Claude Code и другими MCP-клиентами.

## Что это

Поисковый движок по ~94K сообщениям из двух чатов:
- **Divers** (`on_chain_divers_chat`) — ~50K сообщений, MEV, трейдинг, боты, инфраструктура
- **Solana Dev RU** (`solana_dev_ru`) — ~43K сообщений, разработка, Anchor, SPL, RPC

Гибридный поиск: семантический (Voyage embeddings) + полнотекстовый (BM25) + cross-encoder reranking (FlashRank).

## Безопасность и приватность

### Что сервер видит и НЕ видит

**Сервер получает ТОЛЬКО параметры tool-вызова:**

```
search(query="jito bundles", top_k=5, chat_ids=None)
```

Это всё. Три поля: поисковый запрос, количество результатов и фильтр по чату.

**Сервер НЕ получает и НЕ имеет доступа к:**
- Вашей переписке с Claude (промпты, ответы, история диалога)
- Другим tool-вызовам в вашей сессии
- Вашим файлам, проектам, контексту
- Информации о вашем аккаунте

### Как это работает (MCP протокол)

```
Вы пишете Claude: "найди обсуждения про jito bundles"
         │
         ▼
Claude решает вызвать tool и отправляет на MCP-сервер:
   POST /mcp  { "method": "tools/call", "params": {"name": "search", "arguments": {"query": "jito bundles"}} }
         │
         ▼
Сервер выполняет поиск по SQLite базе, возвращает результаты
         │
         ▼
Claude получает результаты и формирует ответ для вас
```

MCP-сервер — это просто поисковый API. Он работает как обычный поисковик: получает запрос, возвращает результаты. Никакого контекста вашего диалога на сервер не передаётся.

### Что логируется

Сервер сохраняет в локальную SQLite базу:
- Поисковый запрос (`query`)
- Параметры (`top_k`, `chat_ids`)
- Количество найденных результатов
- Время выполнения запроса

Это нужно для мониторинга качества поиска. Информация о том, кто отправил запрос, не сохраняется (MCP протокол не передаёт идентификатор пользователя).

### Авторизация

- OAuth 2.1 с паролем (вводится один раз при подключении)
- Access token действует 24 часа, refresh token — 30 дней
- Токены хранятся в зашифрованном виде на сервере
- Все соединения через HTTPS (TLS 1.2+)

## Подключение

### Claude Web (claude.ai)

Settings → MCP Servers → Add MCP Server → вставить URL сервера → Connect → ввести пароль.

### Claude Code

```json
{
  "mcpServers": {
    "solana-divers": {
      "type": "url",
      "url": "<server-url>/mcp"
    }
  }
}
```

## Tools

### `search(query, top_k?, chat_ids?)`

Поиск по архиву чатов. Возвращает фрагменты переписки с контекстом (±5 сообщений).

- `query` — поисковый запрос (русский или английский)
- `top_k` — количество результатов (1-10, по умолчанию 5)
- `chat_ids` — фильтр по чату (`["on_chain_divers_chat"]`, `["solana_dev_ru"]`, или `null` для всех)

### `stats(chat_ids?)`

Статистика базы данных: количество сообщений, авторов, диапазон дат, топ авторов.

### `history(limit?)`

История последних поисковых запросов (для мониторинга).

## Архитектура

```
MCP-клиент (Claude Web / Claude Code)
    │
    ▼  HTTPS
Nginx (reverse proxy, SSL)
    │
    ▼  HTTP :8430
Docker: divers-mcp
    │
    ├── search tool → hybrid_search() → SQLite (read-only)
    ├── stats tool  → direct SQL queries → SQLite (read-only)
    └── history tool → mcp_logs.db (read-write)
```

- **База сообщений** — read-only, shared volume с основным приложением
- **База логов** — отдельная SQLite для search_log + OAuth токенов
- **Embedding cache** — 26K векторов (~120MB) загружаются в RAM при старте

## Self-hosting

```bash
cp docker-compose.example.yml docker-compose.yml
# Заполнить переменные окружения
docker-compose up -d --build
```

Требуется:
- Заполненная база данных ragtg (SQLite с сообщениями и embeddings)
- Voyage API ключ для семантического поиска
- Nginx с SSL для HTTPS