Server data from the Official MCP Registry
Unified MCP Server for Obsidian - graph-based note management with semantic classification
Unified MCP Server for Obsidian - graph-based note management with semantic classification
Valid MCP server (3 strong, 0 medium validity signals). 8 known CVEs in dependencies (0 critical, 3 high severity) Package registry verified. Imported from the Official MCP Registry.
6 files analyzed · 9 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: OBSIDIAN_ROOT
Environment variable: MODE
Environment variable: EMBED_ENABLED
Environment variable: EMBED_PROVIDER
Environment variable: EMBED_MODEL
Environment variable: EMBED_API_URL
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-kvantra-dev-nouz-mcp": {
"env": {
"MODE": "your-mode-here",
"EMBED_MODEL": "your-embed-model-here",
"EMBED_API_URL": "your-embed-api-url-here",
"EMBED_ENABLED": "your-embed-enabled-here",
"OBSIDIAN_ROOT": "your-obsidian-root-here",
"EMBED_PROVIDER": "your-embed-provider-here"
},
"args": [
"nouz-mcp"
],
"command": "uvx"
}
}
}From the project's GitHub README.
Структура возникает из содержания.
MCP-сервер для Obsidian, который даёт ИИ-агенту инструменты для осмысленной работы с базой знаний. NOUZ создаёт в базе семантическое многомерное пространство, в котором агент видит структуру, понимает принадлежность каждой заметки к доменам и находит нетривиальные связи между идеями.
В основе — векторные эмбеддинги, косинусное сходство и коррекция анизотропии трансформеров. Всё это работает локально.
Подробное изложение: Рекурсивная самоорганизация как универсальный принцип — междисциплинарная модель, из которой вытекают архитектурные решения NOUZ.
pip install nouz-mcp
OBSIDIAN_ROOT=/path/to/vault nouz-mcp
Без config.yaml сервер запускается в режиме LUCA — граф без семантики, работает сразу.
Или из исходников:
git clone https://github.com/KVANTRA-dev/NOUZ-MCP
cd NOUZ-MCP
pip install -r requirements.txt
OBSIDIAN_ROOT=./vault python server.py
Подключение к Claude Desktop, Cursor, Opencode или любому MCP-клиенту:
{
"mcpServers": {
"nouz": {
"command": "nouz-mcp",
"env": {
"OBSIDIAN_ROOT": "/path/to/vault",
"MODE": "prizma",
"EMBED_API_URL": "http://127.0.0.1:1234/v1"
}
}
}
}
Сначала вы описываете домены своей базы — минимум два, обычно три-четыре. Опишите что это за область, чем она занимается, чем отличается от других. Сервер превращает эти тексты в векторы-эталоны (calibrate_cores) и сохраняет их в SQLite.
Дальше каждая заметка проецируется на эти векторные оси. Агент видит вашу базу через призму ядер, потому что смысловое пространство структурировано по понятной системе.
Примеры ядер: Физика / Технология / Гуманитарные науки. Или: Клиентский опыт / Архитектура / Бизнес-модель. Область применения не ограничена.
Каждая заметка в графе — сущность. Тип определяет её роль в иерархии:
Ядро (L1) — корень домена. Создаётся вручную, знак задаётся вручную. Якорь, от которого растёт ветка.
Паттерн (L2) — область знаний внутри ядра. Знак задаётся вручную как намерение. Может получить второй знак, если содержание тянет к другому домену.
Модуль (L3) — функциональная группировка. Наследует знак от родительского паттерна по иерархической связи.
Квант (L4) — атомарная единица знаний. Одна идея, один концепт — но развитая и самодостаточная. Знак рассчитывается автоматически по содержимому. Если квант про нейросети живёт в модуле про системное мышление, его знак отразит реальное содержание, а не положение в дереве. Это не ошибка системы — мысль действительно может жить на стыке доменов.
Артефакт (L5) — след деятельности. Лог, черновик, референс, мысль, входящие данные. Прикрепляется к любому уровню через иерархическую, семантическую или временную связь.
Знак (sign) — символ домена, к которому принадлежит заметка. Один или составной: TS, SH.
sign (Намерение): L1 → L2 → L3 сверху вниз, задаётся человеком
core_mix (Реальность): L4 → L3 → L2 снизу вверх, считается автоматически
core_mix — агрегированный состав ядер по всем дочерним заметкам снизу вверх. Когда sign и core_mix расходятся, возникает core_drift. Это не ошибка — сигнал: «Этот модуль заявлен как T, но 45% контента — S. Стоит пересмотреть структуру?»
Механизм аналогичен предиктивному кодированию: верхние уровни иерархии задают ожидания, нижние возвращают сигнал рассогласования.
| Режим | Граф | Семантика | Иерархия |
|---|---|---|---|
| LUCA | ✅ | ❌ | Свободная, без проверок |
| PRIZMA | ✅ | ✅ Ядра, мосты, drift | Свободная, без проверок |
| SLOI | ✅ | ✅ | Строгая 5-уровневая |
LUCA — чистый граф. Только структура, которую вы задаёте вручную. Никаких эмбеддингов, никаких эталонов. Подходит для начала: выстроить иерархию, провести связи, понять форму базы. Работает без config.yaml.
PRIZMA — граф плюс семантика. Сервер начинает «видеть»: классифицирует заметки по ядрам, находит мосты между доменами, отслеживает дрейф. Уровни используются для удобства, строгое соблюдение необязательно. Рекомендуемый режим для большинства задач.
SLOI — всё то же, плюс строгая иерархия. Если L4-заметка помещена под L2-родителем — это ошибка, и сервер скажет об этом. Для тех, кому важна чистота структуры.
Связи в NOUZ — осознанный выбор: зачем одна заметка ссылается на другую.
| Тип | Кто создаёт | Смысл |
|---|---|---|
hierarchy | Только человек | Структурное решение. По этой связи передаётся sign. |
temporary | Человек или ИИ | Артефакт ещё не прирос к графу. Позже станет hierarchy — или уйдёт. |
semantic | ИИ предлагает, человек решает | Две заметки из разных доменов говорят об одном и том же. |
tag | ИИ предлагает, человек решает | Заметки делят скрытый концепт, хотя полные тексты разные. |
analogy | ИИ предлагает, человек решает | Заметки занимают аналогичную позицию в структуре графа, несмотря на разное содержание. |
Две заметки из разных ядер, чьи тексты семантически близки. Заметка про термодинамическую энтропию и заметка про сжатие данных — обе про эффективность кодирования информации, хотя домены разные. Агент находит это через косинусную близость полных эмбеддингов.
cosine(embed(A), embed(B)) ≥ 0.55 → семантический мост
Мост предлагается только между заметками из разных ядер. Если знак заметки определён уверенно (sign_source = auto), мосты к своему ядру не предлагаются — домен закрыт. Если знак слабый (weak_auto), мосты предлагаются в обе стороны: домен неопределён, и связи помогают разобраться.
Заметки, чьи отдельные теги близки в пространстве эмбеддингов, хотя полные тексты разные. Тег «энтропия» близок к тегу «хаос» — но сами заметки могут быть о разном. Теговый мост выявляет скрытый концепт, который полный текст пропускает.
cosine(embed(tag_A), embed(tag_B)) ≥ 0.72 → теговый мост
Порог выше (0.72 vs 0.55), потому что короткие слова шумнее длинных текстов — baseline косинуса у них выше.
Заметки из разных ядер, которые занимают аналогичную позицию в графе. Разное содержание, похожая структурная роль.
Сходство считается по четырём компонентам с весами:
core_mix angle × 0.35
level match × 0.25
degree similarity × 0.20
tag overlap × 0.20
─────────────────────────
structural_sim ≥ 0.55 → аналогический мост
Вдохновлено теорией структурного отображения (Gentner, 1983): аналогии — это отображения между реляционными структурами, а не поверхностное сходство.
Каждый тип ловит свой вид связи. Семантический — «заметки об одном и том же». Теговый — «делят скрытый концепт». Аналогический — «играют одну и ту же роль в структуре». Если два типа подтверждают связь — она надёжная. Один тип — слабый сигнал, но заслуживающий внимания.
Не все классификации одинаково надёжны. Сервер различает:
max_cosine ≥ confident_cosine → sign_source = "auto" (уверенный)
max_cosine < confident_cosine → sign_source = "weak_auto" (относительная догадка)
auto — домен закрыт: мосты к своему ядру не предлагаются. Сервер уверен в принадлежности заметки.
weak_auto — домен открыт: мосты предлагаются в обе стороны. Заметка ближе к одному ядру, но не уверенно — возможно, короткая, на нестандартном языке или действительно на стыке.
Порог по умолчанию — 0.6. Для большинства моделей (e5, BGE, multilingual) это работает. Для nomic-embed (baseline 0.74–0.83) — поставьте 0.75. Для тесных доменов с высоким пересечением — можно опустить до 0.5.
Трансформерные эмбеддинги имеют известную проблему: все векторы сжаты в узкий конус, и косинус между любыми двумя текстами завышен вне зависимости от их смысловой близости. Это свойство архитектуры, описанное в работах Gao et al. (2019) и Ethayarajh (2019).
NOUZ применяет mean subtraction (Su et al., 2021): вычитает средний вектор эталонов из каждого вектора перед сравнением. Это убирает общий компонент — «конус» — не разрушая семантику. Результат виден в отчёте калибровки как pairwise_cosine_centered.
format_entity_compact показывает позицию заметки в графе одной строкой:
(дети)[уровень·знак]{родители}
Каждая группа показывает знаки сущностей с количеством. Скобки детей и родителей опускаются, если пусты. Пример:
(3A2B)[4C]{D}
Читается: у заметки 3 дочерних с знаком A и 2 с знаком B, сама она на уровне 4 с знаком C, её родитель — знак D. По этой строке агент видит контекст заметки без чтения всего графа.
| Инструмент | Зачем нужен агенту |
|---|---|
suggest_metadata | Главный инструмент. Говорит: какой знак, какой уровень, какие мосты, есть ли drift. Агент вызывает его перед записью — чтобы не гадать. |
write_file | Создать или обновить заметку с правильным YAML. Проверяет циклы в DAG перед записью. |
read_file | Прочитать заметку и её метаданные. Переиндексирует в БД — при следующем suggest_metadata данные актуальны. |
calibrate_cores | Векторизовать эталонные тексты ядер. Запускается один раз после настройки конфигурации или при изменении эталонов. |
recalc_signs | Пересчитать автоматические знаки всех заметок по эмбеддингам. Запускается после калибровки. |
recalc_core_mix | Пересчитать агрегацию снизу вверх: L4 → L3 → L2. Запускается после recalc_signs. |
suggest_parents | Найти родителей по семантической близости. Для заметок без родителей. |
list_files | Список файлов с фильтрами по уровню, знаку, подпапке. |
get_children / get_parents | Траверс графа вниз и вверх. |
format_entity_compact | Формула сущности — быстрый обзор позиции в графе. |
index_all | Полная переиндексация хранилища. После крупных изменений. |
embed | Получить вектор для любого текста. |
Новая заметка. Агент пишет текст → вызывает suggest_metadata → получает sign, level, мосты, drift-предупреждения → записывает с правильным YAML через write_file.
Сирота нашла дом. Агент видит заметку без родителей → suggest_parents → предлагает связи → человек подтверждает.
Drift обнаружен. suggest_metadata возвращает core_drift warning → «Модуль заявлен как T, но 45% контента — S. Пересмотреть структуру?»
Мост между мирами. Агент видит, что квант про энтропию и квант про сжатие данных связаны семантическим мостом → предлагает связь → человек решает.
Создайте config.yaml рядом с сервером:
mode: prizma
# Необязательно: имя корневой заметки (исключается из семантических операций)
meta_root: "Моя база знаний"
# Описания доменов — пишите ЧТО это, а не перечисляйте ключевые слова
etalons:
- sign: T
name: Технология
text: "программирование архитектура инфраструктура машинное обучение нейросети
алгоритмы фреймворки базы данных облачные вычисления"
- sign: S
name: Наука
text: "физика химия биология математика формальная логика теоремы космология
квантовая механика научная методология"
- sign: H
name: Гуманитаристика
text: "философия психология социология история литература искусство этика
когнитивные науки эпистемология лингвистика"
thresholds:
sign_spread: 0.05 # минимальный разброс для классификации
confident_cosine: 0.6 # порог уверенности знака
pattern_second_sign_threshold: 30.0 # % порог для составных знаков
semantic_bridge_threshold: 0.55 # семантические мосты
structural_bridge_threshold: 0.55 # аналогические мосты
Качество эталонов важнее количества. После записи запустите calibrate_cores и проверьте pairwise_cosine_centered. Значения выше 0.4 между разными ядрами означают, что эталоны семантически перекрываются — перепишите с более доменно-специфичным языком и меньшим количеством общих слов.
| Переменная | По умолчанию | Описание |
|---|---|---|
OBSIDIAN_ROOT | ./obsidian | Путь к хранилищу |
MODE | luca | luca, prizma или sloi |
EMBED_PROVIDER | openai | openai, lmstudio, ollama, gigachat |
EMBED_API_URL | http://127.0.0.1:1234/v1 | Эндпоинт для эмбеддингов |
EMBED_API_KEY | (пусто) | API-ключ, если нужен |
EMBED_MODEL | (пусто) | Имя модели |
Узел уровня 0 (meta_root в конфиге) — верхний якорь иерархии. Индексируется для видимости в графе, но исключён из всех семантических операций: эмбеддинги, sign, core_mix. Без него заметки первого уровня болтаются в пустоте.
| Компонент | Локально? |
|---|---|
| Эмбеддинги (LM Studio / Ollama) | ✅ Да |
| Ваши заметки (сырые файлы) | ✅ Да |
| Сервер NOUZ | ✅ Да |
| Контекст AI-агента (Claude, ChatGPT) | ❌ Уходит в облако |
NOUZ работает полностью локально. Но если вы подключаете облачного агента — контекст, который он видит, уходит к провайдеру. Используйте локальных агентов, если приватность критична.
git clone https://github.com/KVANTRA-dev/NOUZ-MCP
cd NOUZ-MCP
pip install -e .
python -m pytest test_server.py
MIT License © 2026 KVANTRA
Косинусы считаются. Синтаксис меняется. Семантика остаётся.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.