🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

nouz-mcp

Package Overview
Dependencies
Maintainers
1
Versions
25
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

nouz-mcp

MCP server for Obsidian — semantic knowledge graph with auto-classification, DAG hierarchy, and cross-domain bridge detection

pipPyPI
Version
3.2.5
Weekly downloads
109
Maintainers
1
Weekly downloads
 

NOUZ — Semantic MCP Server for Your Knowledge Base

Structure emerges from content.

Works with Obsidian, Logseq, and any directory of Markdown files.

MIT License Python 3.10+ MCP PyPI

🇷🇺 Русская версия

Why NOUZ

NOUZ sits between your note base and an AI agent. It helps turn scattered Markdown files into a graph that is useful both to you and to the agent:

  • Automatic classification (semantics) You define "cores" — the base domains of your knowledge base. When you add a new note, NOUZ reads its text, compares vectors, and proposes a domain sign or a combination of domains.

  • Connection discovery between notes The server builds a directed structural graph: hierarchy is kept as an acyclic DAG, while additional semantic links live alongside it:

    • Semantic bridges: two notes from different domains point to the same idea.
    • Explicit tag links can be stored manually in YAML.
  • Base evolution tracking (drift) NOUZ stores the domain profile of content nodes and can compare it with the declared sign. If a module is described as one domain while its profile gradually pulls toward another, the server shows the divergence (core_drift).

Depending on your needs, NOUZ works in three modes: from a simple graph (LUCA) to a strict 5-level hierarchy (SLOI).

How It Works

  • You describe domains in config.yaml: what each domain covers and which textual signals identify it.
  • The server turns those descriptions into vector etalons (locally, via LM Studio or Ollama).
  • Each new note is projected onto those axes. The sign is determined by content, or by you.

One boundary matters here. artifact_signs describe the form of L5 artifacts: log, source, hypothesis, specification, and so on. These signs do not roll up into the L4 domain sign. A log stays a log; a source stays a source.

core_mix is not a sum of artifact types. It is a domain profile stored in the SQLite index. L4/L3/L2 get it from their own text during recalc_signs; parent nodes can then receive an averaged profile from child content nodes through recalc_core_mix. core_drift appears when the stored domain profile and the current sign point to different leading domains.

Semantic bridges find connections between notes from different domains when texts are close in meaning. If both notes already have chunks, the bridge is additionally checked against the best chunk pair and returns concrete evidence. Tags remain explicit user metadata.

Quick Start

pip install nouz-mcp
OBSIDIAN_ROOT=/path/to/vault nouz-mcp

Without config.yaml, the server starts in LUCA mode: graph without semantics, ready immediately.

To enable semantic mode, create a local config from the template:

cp config.template.yaml config.yaml

On Windows PowerShell:

Copy-Item config.template.yaml config.yaml

Or from source:

git clone https://github.com/Semiotronika/NOUZ-MCP
cd NOUZ-MCP
pip install -r requirements.txt
cp config.template.yaml config.yaml
OBSIDIAN_ROOT=./vault python server.py

Connect to Claude Desktop, Cursor, OpenCode, or any MCP client:

{
  "mcpServers": {
    "nouz": {
      "command": "nouz-mcp",
      "env": {
        "OBSIDIAN_ROOT": "/path/to/vault",
        "NOUZ_CONFIG": "/absolute/path/to/config.yaml",
        "EMBED_API_URL": "http://127.0.0.1:1234/v1"
      }
    }
  }
}

MCP Tools

ToolPurpose
suggest_metadataSign, level, bridges, drift warnings
write_fileWrite a note with YAML frontmatter
update_metadataUpdate YAML only, preserving the note body
read_fileRead a note + metadata
calibrate_coresUpdate core reference vectors
recalc_signsRecalculate signs for all notes
recalc_core_mixRecalculate parent domain profiles from child content nodes
index_allRe-index the whole base; in PRIZMA/SLOI, with_embeddings=true also refreshes file/chunk embeddings
embedGet a vector for text in PRIZMA/SLOI
chunk_textSplit Markdown text into stable chunks in PRIZMA/SLOI
chunk_fileSplit one note body into stable chunks in PRIZMA/SLOI
search_chunksSearch stored chunk embeddings in PRIZMA/SLOI; by default, reduces anisotropy
list_filesList files with filters by level and sign
get_childrenTraverse down the graph
get_parentsTraverse up the graph
suggest_parentsFind parents for an orphan
add_entityCreate an entity in one step: automatic sign and hierarchy, explicit tags only
process_orphansAuto-fill files without enough markup

Configuration

Minimal config.yaml:

mode: prizma

etalons:
  - sign: S
    name: Systems Analysis
    text: >
      Methodology for analysing complex objects: feedback loops,
      emergent properties, self-regulation, bifurcation points.
      Cybernetics, synergetics, dissipative structures, catastrophe
      theory, autopoiesis  tools for understanding how the whole
      exceeds the sum of its parts. Not data and not code  a way
      of thinking about how parts form a whole and why systems
      behave non-linearly.
  - sign: D
    name: Data & Science
    text: >
      Physics and cosmology: from subatomic particles to the large-scale
      structure of the Universe. Lagrangians, curvature tensors, scattering
      cross-sections, quarks, bosons, fermions, plasma, vacuum fluctuations,
      cosmic microwave background, cosmological constant, decoherence.
      Pure science about the nature of matter, energy and spacetime.
  - sign: E
    name: Engineering
    text: >
      Software engineering, machine learning and infrastructure: writing
      and debugging code, deployment, containerisation, neural networks,
      inference, tokenisation, data serialisation, microservices, CI/CD,
      automated testing, refactoring, Git, Docker, Kubernetes, APIs.
      The practical discipline of building computational systems from
      architecture to production.

thresholds:
  sign_spread: 0.05
  confident_spread: 60.0
  pattern_second_sign_threshold: 30.0
  semantic_bridge_threshold: 0.55
  parent_link_threshold: 0.55

artifact_signs:
  - sign: n
    name: Note
    text: Short note, observation, fragment.
  - sign: c
    name: Concept
    text: Definition, concept, entity description.
  - sign: r
    name: Reference
    text: External source, documentation, link, citation.
  - sign: l
    name: Log
    text: Session log, chronology, dialogue record.
  - sign: u
    name: Update
    text: Update, release note, changelog entry.
  - sign: h
    name: Hypothesis
    text: Hypothesis, assumption, speculative idea.
  - sign: s
    name: Specification
    text: Technical specification, instruction, requirements.

After setup, run calibrate_cores: the server creates reference vectors. Check pairwise cosines: mean-centered values between different domains should be noticeably lower than raw values. If all pairs are roughly the same, strengthen the differences in the texts. You can also run the standalone etalon check from the installed package: nouz-calc-etalons --config config.yaml.

etalons are semantic domains compared through embeddings. artifact_signs describe the material type of L5 artifacts: note, concept, reference, log, update, hypothesis, or specification. This is a heuristic label. Domains usually use uppercase signs (S/D/E), while material types use lowercase signs (n/c/r/l/u/h/s); you can replace them in config with any short, non-conflicting values. If needed, add keywords to any material type, and the server will use your words for the heuristic instead of the built-in RU/EN set.

Real Calculation Example

Here are actual results for the S/D/E etalons using the text-embedding-granite-embedding-278m-multilingual model:

=== Pairwise Cosine (raw) ===
S↔D: 0.5894    S↔E: 0.5862    D↔E: 0.6022

=== Pairwise Cosine (mean-centered) ===
S↔D: -0.5059   S↔E: -0.5117   D↔E: -0.4822

Negative mean-centered values are a good result here: after subtracting the mean vector, domains are well-separated. Current nouz-calc-etalons etalon smoke test: S→99.6%, D→98.5%, E→98.1%. This is not a whole-base quality score; it checks that each etalon returns to its own sign after the same centering step.

VariableDefaultDescription
OBSIDIAN_ROOT./obsidianPath to the vault
NOUZ_CONFIG(empty)Absolute path to config.yaml; if omitted, the server looks in the current working directory
NOUZ_DATABASE_NAMEobsidian_kb.dbSQLite cache filename inside OBSIDIAN_ROOT; useful for isolated checks, for example obsidian_kb.public.db
NOUZ_DATABASE_PATH(empty)Full SQLite cache path; takes precedence over NOUZ_DATABASE_NAME
EMBED_PROVIDERopenaiopenai, lmstudio, ollama
EMBED_API_URLhttp://127.0.0.1:1234/v1Embedding endpoint
EMBED_API_KEY(empty)API key, if needed
EMBED_MODEL(empty)Model name

Privacy

ComponentLocal?
Embeddings (LM Studio / Ollama)Yes
Your notesYes
NOUZ serverYes
AI agent context (Claude, ChatGPT)Goes to the cloud

Everything critical stays on your machine.

Development

git clone https://github.com/Semiotronika/NOUZ-MCP
cd NOUZ-MCP
pip install -e .
python -m compileall -q nouz_mcp pytest_smoke.py scripts
python -m pytest -q
python test_server.py

MIT License © 2026 Semiotronika

Cosines are computed. Syntax changes. Semantics remains.

Keywords

mcp

FAQs

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts