Two choices keep it safe to point at real notes. Metadata edits are a separate tool from body edits, so classifying a note carries no risk of rewriting it, and classification arrives as a suggestion you approve rather than a write. Start in LUCA mode with no config at all — describing your domains and wiring up a local embedding endpoint only pays off once the vault is large enough to get lost in.
A layer between a Markdown knowledge base and an agent. It keeps a SQLite index of files, YAML metadata and graph links, and can classify a note against domains you define.
- read_file returns one note as JSON: body, YAML frontmatter, hierarchy metadata, parent links, explicit tags and any warnings
- write_file creates or replaces a note, with content_lock=true to keep the existing body and update only the metadata
- update_metadata changes the frontmatter alone — type, level, sign, artifact_sign, tags, parents — and leaves the Markdown byte for byte
- list_files gives a lightweight inventory with path, type, level and sign, filterable by subfolder, and no_metadata=true finds notes carrying no YAML at all
- get_children walks the hierarchy downward through direct and transitive children; get_parents returns the links upward with their link_type — hierarchy, derived_from, semantic, temporary, tag, analogy or error
- suggest_metadata reads a note and proposes a domain sign, material type, hierarchy level, tags with the chunk evidence behind them, bridge candidates and hierarchy warnings — as a proposal, not a write
- index_all rebuilds the index after you move things around outside the tool, and reports parent links that no longer resolve
Python 3.10+, installed with pip install nouz-mcp and run over stdio. OBSIDIAN_ROOT points at the vault (default ./obsidian) and the SQLite index lives inside it as obsidian_kb.db unless NOUZ_DATABASE_NAME or NOUZ_DATABASE_PATH says otherwise. With no config.yaml it starts in LUCA mode — the graph without semantic classification — and needs nothing else. The semantic modes need embeddings: EMBED_PROVIDER selects an OpenAI-compatible endpoint or Ollama, EMBED_API_URL points at it (default http://127.0.0.1:1234/v1) and EMBED_MODEL names the model; NOUZ_CONFIG locates config.yaml when it is not in the working directory.
One command — pip install nouz-mcp
