Selti
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Seltistore this dialogue about MCP protocol setup"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
selti — Semantic Memory MCP Server
selti — высокопроизводительный MCP-сервер семантической памяти для AI-агентов. Обеспечивает векторное хранение, поиск по семантической близости и интеллектуальную дедупликацию записей на основе протокола MCP (Model Context Protocol) через SSE-транспорт.
Примечание: Данный проект разработан с применением технологий искусственного интеллекта в рамках рабочего процесса Argenta Team. Код прошел рецензирование, тестирование и подготовлен к эксплуатации в production-среде.
Стек технологий
Компонент | Технология |
Язык | Python 3.12 |
Фреймворк | FastAPI + FastMCP |
База данных | PostgreSQL 17 + pgvector (HNSW) |
Кеш | Redis 7 |
Мониторинг | Prometheus + Grafana |
Контейнеризация | Docker + Docker Compose |
Related MCP server: elephantasm-mcp
Архитектура
Система построена по многослойной архитектуре с чётким разделением ответственности:
Client (MCP over SSE)
|
v
FastAPI / FastMCP ─── Auth Middleware (опционально)
|
v
┌─────────────────────────────────────────┐
│ MCP Tools (16) │
│ store / search / get / update / delete │
│ list / forget / ingest / stats / find │
│ recent / archive / link / unlink │
│ get_relations / traverse / graph_stats │
└──────────────────────┬──────────────────┘
│
v
┌─────────────────────────────────────────┐
│ MemoryService │
│ (бизнес-логика) │
└──────┬──────────────────────┬───────────┘
│ │
v v
┌───────────┐ ┌───────────────┐
│ DedupEngine│◄──────►│ Embedding API │
│exact+sem. │ │ + Redis Cache│
└─────┬─────┘ └───────┬───────┘
│ │
v v
┌─────────────────────────────────────────┐
│ MemoryRepository │
│ (SQL via asyncpg) │
└──────────────────┬──────────────────────┘
│
v
┌─────────────────────────────────────────┐
│ PostgreSQL 17 + pgvector (HNSW) │
│ 4096-мерные эмбеддинги │
│ + Relations table (граф) │
└─────────────────────────────────────────┘Слои архитектуры:
MCP Tools — 16 инструментов, декорированных FastMCP. Валидация namespace, трекинг метрик, обработка ошибок. Включают инструменты для графа знаний (link, unlink, get_relations, traverse, graph_stats).
DedupEngine — двухуровневая дедупликация: точная (SHA256) и семантическая (cosine distance). Оптимизирован: кеширует эмбеддинги в DedupDecision.
MemoryService — координатор бизнес-логики: вызов эмбеддингов, дедупликация, взаимодействие с репозиторием. Поддерживает batch-операции и Relations API.
Repository — уровень доступа к данным на asyncpg; сырые SQL-запросы с параметризацией. Включает методы для графа (add_relation, traverse, get_graph_stats) и archive.
PostgreSQL / pgvector — HNSW-индекс для 4096-мерных векторов, B-tree индексы для фильтрации, JSONB для метаданных. Таблица
relationsдля графа знаний.Redis Cache — кеш эмбеддингов (SHA256-ключи, TTL 24 часа); снижает нагрузку на Embedding API.
MCP Tools
Сервер предоставляет 16 инструментов для управления семантической памятью:
Основные инструменты
Tool | Описание | Параметры |
| Сохранить запись с дедупликацией | content, user_id, metadata?, namespace? |
| Векторный поиск по семантической близости | query, user_id, limit?, threshold?, namespace? |
| Получить запись по идентификатору | id |
| Обновить содержимое и/или метаданные записи | id, content?, metadata? |
| Удалить запись по идентификатору | id |
| Список записей с фильтрацией и пагинацией | user_id?, namespace?, limit?, offset? |
| Массовое удаление всех записей пользователя | user_id, namespace? |
| Массовое сохранение набора записей с дедупликацией | entries: list[{content, metadata?, namespace?}], user_id |
| Статистика по неймспейсам: количество записей, дата обновления | user_id |
| Поиск семантически похожих записей без сохранения | content, user_id, limit?, threshold?, namespace? |
| Последние записи по времени создания | namespace?, limit?, since? |
| Мягкое удаление: установить is_archived = true | id |
Инструменты для графа знаний
Tool | Описание | Параметры |
| Добавить связь между гранулами | source_id, target_id, link_type?, description?, weight? |
| Удалить связь между гранулами | source_id, target_id, link_type |
| Получить связи для гранулы | source_id, target_id? |
| Обход графа от стартовой вершины | start_id, depth?, link_types? |
| Статистика графа: количество связей, сирот, средние связи |
Каждый инструмент инструментирован метриками: количество вызовов, длительность выполнения, статус (ok/error).
Namespace-стратегия
Namespace обеспечивают логическую изоляцию данных в рамках одной базы. Передаются опционально (по умолчанию — default). Валидация на уровне tools; неверное значение вызывает ValueError.
Namespace | Назначение |
| Общие записи |
| Факты о пользователе |
| Знания из кодовой базы |
| Инсайты из диалогов |
| Метаданные проектов |
Дедупликация
Ядро системы — DedupEngine, реализующий двухуровневую стратегию предотвращения дубликатов.
Уровень 1: Exact Match
Вычисляется SHA256(content). Выполняется поиск по content_hash в пределах namespace:
user_facts →
UPDATE(перезапись существующей записи)остальные →
SKIP(пропуск, возврат существующей записи)
Уровень 2: Semantic Match
Если точное совпадение не найдено, генерируется эмбеддинг и выполняется векторный поиск. При score >= threshold запись считается дубликатом → SKIP.
Пороги семантической дедупликации (per-namespace)
Namespace | Порог |
| 0.95 |
| 0.90 |
| 0.95 |
| 0.85 |
| 0.90 |
Пороги настраиваются через переменную DEDUP_THRESHOLDS. Полное отключение — DEDUP_ENABLED=false.
Быстрый старт
Предварительные требования
Docker 24+ и Docker Compose v2
Python 3.12 (для миграций вне контейнера)
Запуск
# 1. Клонировать репозиторий
git clone <repository-url>
cd selti
# 2. Скопировать шаблон окружения
cp .env.example .env
# 3. Сгенерировать пароли
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
# 4. Заполнить .env:
# PG_PASSWORD — пароль суперпользователя PostgreSQL
# APP_PASSWORD — пароль пользователя приложения athena_app
# REDIS_PASSWORD — пароль Redis
# 5. Запустить с локальными PostgreSQL и Redis
docker compose --profile local-db up -d
# 6. Проверить здоровье сервера
curl http://localhost:8000/health
# 7. Применить миграции базы данных
python migrations/run.pyДля подключения к внешним PostgreSQL и Redis — запустите без профиля --profile local-db и укажите соответствующие URL в .env.
Celery Setup
Система использует Celery для асинхронной обработки тяжёлых операций: векторного поиска, batch-вставок, дедупликации и работы с эмбеддингами. MCP-сервер только ставит задачи в очередь, а воркеры выполняют всю работу.
Архитектура
MCP Server (FastMCP) ──send_task()──▶ Redis (broker) ──▶ Celery Worker (prefork)
│
┌───────────────────────────────┤
│ │ │
▼ ▼ ▼
PostgreSQL Qdrant Embedding API
(pgvector) (векторы) (эмбеддинги)Почему Celery, а не asyncio в MCP-сервере: вся логика selti — async (asyncpg, httpx), но тяжёлые операции (embedding, векторный поиск) блокируют event loop. Celery prefork воркеры изолируют эти операции в отдельных процессах, не блокируя обработку MCP-запросов.
Очереди
Очередь | Назначение | Таймаут (soft/hard) |
| store, search, get, update, delete, archive, link, unlink | 240s / 300s |
| ingest_batch | 600s / 900s |
| hash_upsert, hash_get, hash_list, hash_delete | 120s / 180s |
Запуск
# Development — всё вместе
docker compose up -d
# С Flower (мониторинг воркеров)
docker compose --profile dev up -d
# Только воркер (вручную, для отладки)
celery -A memory_server.celery_app worker \
-Q memory,batch,hash \
-c 4 \
--without-gossip \
--without-mingle \
--without-heartbeat \
-l INFO
# Только Flower
celery -A memory_server.celery_app flower --port=5555Production-опции воркера
celery -A memory_server.celery_app worker \
-Q memory,batch,hash \
-c 4 \
--without-gossip \
--without-mingle \
--without-heartbeat \
--max-tasks-per-child=1000 \
--max-memory-per-child=200000 \
--logfile=- \
-l INFOФлаг | Зачем |
| Экономит ~10% CPU, ускоряет старт |
| Экономит ~10% CPU, не нужен в single-worker |
| Экономит ~10% network |
| Реклайм памяти, защита от утечек |
| OOM-защита (200 MB на процесс) |
Retry-политика
Задачи автоматически повторяются при ошибках сети или БД:
Максимум попыток: 5
Стратегия: exponential backoff + jitter
Базовая задержка: 30 секунд
Validation-ошибки (ValueError, InvalidNamespace) не ретраятся — это баги данных, а не транзиентные сбои.
Мониторинг
Сервис | URL | Назначение |
Health |
| Статус сервера + Celery worker |
Metrics |
| Prometheus: 8 Celery + Redis + Qdrant метрик |
Tasks API |
| Активные задачи |
Task info |
| Статус конкретной задачи |
Cancel |
| Отмена задачи (revoke) |
Flower |
| Веб-интерфейс мониторинга (dev) |
Troubleshooting
Проблема | Причина | Решение |
| Redis не запущен |
|
| Воркер упал во время задачи | Проверьте логи: |
| OOM — процесс съел >200 MB | Увеличьте |
| Задача выполняется дольше лимита | Увеличьте таймаут или оптимизируйте запрос |
| Транзиентная ошибка не прошла | Проверьте доступность PostgreSQL / Embedding API |
Flower не видит воркеры |
| В dev-режиме уберите флаг; в production используйте |
| Воркер не подключился к broker | Проверьте |
Конфигурация
Переменные окружения
Переменная | Описание | По умолчанию |
| PostgreSQL connection string (asyncpg) |
|
| Redis connection string |
|
| URL API эмбеддингов (OpenAI-совместимый) |
|
| Ключ аутентификации API эмбеддингов | (пусто) |
| Модель эмбеддингов |
|
| Размерность эмбеддинга |
|
| Ключ аутентификации MCP-сервера | (пусто — аутентификация отключена) |
| Уровень логирования |
|
| Включить дедупликацию |
|
| Глобальный порог семантической дедупликации |
|
| Лимит результатов поиска по умолчанию |
|
| Порог релевантности поиска по умолчанию |
|
| Хост сервера |
|
| Порт сервера |
|
| URL брокера сообщений (Redis) |
|
| URL хранилища результатов (Redis) |
|
| Количество воркер-процессов |
|
| OOM-лимит на процесс (KB) |
|
| Маршрутизация задач по очередям (JSON) |
|
| Пользователь PostgreSQL (локальный профиль) |
|
| Пароль PostgreSQL (локальный профиль) | — |
| Пароль Redis (локальный профиль) | — |
PostgreSQL (локальный профиль)
Для локального запуска используется образ pgvector/pgvector:pg17 с предварительно настроенным HNSW-индексом:
Расширение
vectorТаблица
memoriesс колонкойembedding vector(8192)HNSW-индекс с параметрами
m = 16,ef_construction = 200B-tree индексы:
user_id,namespace,created_at DESCТриггер автообновления
updated_atУникальный индекс на
(namespace, content_hash)для точной дедупликации
Аутентификация
Опциональная защита на основе API-ключа. Включается установкой переменной API_KEY в .env.
Механизм:
HTTP-middleware проверяет заголовок
Authorization: Bearer <API_KEY>для всех эндпоинтовASGI-middleware защищает
/mcp(mount-приложение FastMCP)Белый список (доступ без аутентификации):
/health,/metrics
При пустом значении API_KEY доступ открыт.
Мониторинг
Метрики Prometheus
Эндпоинт /metrics предоставляет 13+ метрик:
Метрика | Тип | Описание |
| Counter | Количество HTTP-запросов (method, endpoint, status) |
| Histogram | Длительность HTTP-запросов |
| Gauge | Текущий размер пула соединений |
| Gauge | Доступные соединения в пуле |
| Histogram | Длительность вызова API эмбеддингов |
| Histogram | Количество результатов поиска |
| Gauge | Общее количество записей (по namespace) |
| Counter | Вызовы MCP-инструментов (tool, status) |
| Histogram | Длительность выполнения MCP-инструментов |
| Counter | Попадания в кеш эмбеддингов |
| Counter | Промахи кеша эмбеддингов |
| Counter | Пропуски дедупликации (namespace, reason) |
| Counter | Вставки после проверки дедупликации |
Healthcheck
curl http://localhost:8000/healthОтвет содержит версию сервера и статусы проверок конфигурации.
Grafana Dashboard
Готовый dashboard для PostgreSQL + pgvector — monitoring/dashboards/postgres-pgvector.json.
Экспортёры
Для production-развёртывания предусмотрены экспортёры (включаются через -f monitoring/exporters/docker-compose.exporters.yml):
postgres-exporter (порт 9187) — метрики PostgreSQL
redis-exporter (порт 9121) — метрики Redis
Алерты
Правила алертинга — monitoring/alerts/prometheus-rules.yml:
Доступность PostgreSQL и Redis
Высокая загрузка соединений
Конфликты запросов на реплике
Долгие запросы (> 5 минут)
Отставание WAL-архивации
Отсутствие бэкапов
Отсутствие HNSW-индекса при > 10k записей
Высокое потребление памяти Redis
Высокий процент промахов кеша Redis
Миграции
Управление схемой базы данных — через встроенный migration runner.
# Применить все неприменённые миграции
python migrations/run.py
# Откатить последнюю миграцию
python migrations/run.py --downМиграции находятся в migrations/ — версионированные SQL-файлы с up/down-секциями. Система отслеживает применённые миграции в таблице _migrations.
Доступные миграции:
Файл | Описание |
| Начальная схема: расширение vector, таблица memories, HNSW-индекс, триггеры, функция поиска |
| Дедупликация: content_hash, source_type, source_location, version, is_archived, уникальный индекс |
| Расширение: embedding cache, batch operations |
| Инфраструктурные метрики и мониторинг |
| Таблица relations для графа знаний: связи между гранулами, индексы, каскадное удаление |
Zero-downtime Deploy
Скрипт deploy.sh реализует стратегию rolling-обновления:
Пулл нового образа из GHCR
Запуск нового контейнера на временном порту
Ожидание прохождения healthcheck
Переключение трафика (через reverse proxy или прямой restart)
Остановка и удаление старого контейнера
Тестирование
Проект покрыт модульными и интеграционными тестами (142+ теста).
# Установка зависимостей для тестов
pip install -r requirements.txt
# Запуск тестов
pytest tests/ -v
# С отчётом о покрытии
pytest tests/ --cov=memory_server -vРазработка
Проект разработан в рамках Argenta Team — архитектура, разработка и сопровождение информационных систем.
Разработчик: Dek1m
Argenta Team — архитектура, разработка и сопровождение информационных систем.
Auto-deploy test: 2026-08-01T08:54:55Z
This server cannot be deployed
Maintenance
Related MCP Connectors
An MCP memory server. One memory your agents share — across models, devices and apps.
Persistent memory for AI agents — log and recall conversation context over MCP.
Persistent memory for AI agents across Claude, ChatGPT and any MCP client.
Persistent personal memory for AI assistants — save, search, and recall across every MCP client.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenancePersistent semantic memory server for AI assistants via MCP, enabling long-term context retention and semantic search across conversations.11MIT
- AlicenseAqualityCmaintenanceMCP server for long-term agent memory, providing persistent memory, searchable knowledge, and evolving identity for AI agents.53Apache 2.0
- AlicenseNot gradedqualityCmaintenancePersistent memory infrastructure for AI agents, enabling cross-session recall and autonomous memory evolution via an MCP server.1MIT
- AlicenseNot gradedqualityBmaintenanceA shared memory MCP server for AI agents that provides persistent, semantic memory across sessions and tools, enabling long-term recall and context sharing.3 npm12MIT