Skip to main content
Glama

NOUZ — Semantic MCP Server for your knowledge base

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

Structure emerges from content.

Semantic tools for knowledge bases, project memory, and AI agents.

MIT License Python 3.10+ MCP PyPI

🇬🇧 English version


Why Nouz is needed

Folders show where a file is located. But they don't explain to an agent how documents, ideas, and materials within the base are connected.

NOUZ gives the agent semantic coordinates. Each note receives a domain sign, a level in the hierarchy, and links to other notes. The domain is assigned based on the file's content, or manually by you if you want a strict hierarchy.


Related MCP server: Semantic Mesh Memory (SEM) MCP Server

What it does

NOUZ acts as a layer between your note base and an AI agent. It helps turn scattered Markdown files into a graph that can be worked with via MCP:

  1. Automatic Classification (Semantics) You define "Cores" — the base domains of your database (e.g., Systems Analysis, Data & Science, Engineering). When you add a new note, NOUZ reads its text, compares vectors, and suggests a domain sign or a combination of domains.

  2. Finding connections between notes The server builds a directed acyclic graph (DAG) and suggests connections that can be verified before saving:

    • Semantic bridges: two notes from different domains point to the same idea.

    • Tag bridges: notes have common hidden concepts at the tag level.

  3. Tracking database evolution (Drift) NOUZ aggregates data from the bottom up. If a module started as one domain, but new notes gradually lead it to another, the server will show a discrepancy (core_drift).

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


How it works

  1. You describe domains in config.yaml — what area each domain covers and what text features to recognize it by.

  2. The server turns descriptions into reference vectors (locally, via LM Studio or Ollama).

  3. Each new note is projected onto these axes. The sign is determined by content, or by you.

  4. L4 receives a domain profile from text classification, and L3/L2 collect core_mix from child nodes. If a module's sign diverges from core_mix, the server reports a core_drift.

Two types of bridges find connections between notes from different domains: semantic (texts are close) and tag-based (concepts overlap).


Quick start

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

Without config.yaml, the server starts in LUCA mode — a graph without semantics, works immediately.

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

cp config.template.yaml config.yaml

In 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

Connecting 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

Tool

Purpose

suggest_metadata

Sign, level, bridges, drift warnings

write_file

Write a note with YAML markup

update_metadata

Update only YAML without changing the note text

read_file

Read a note + metadata

calibrate_cores

Update reference vectors for cores

recalc_signs

Recalculate signs for all notes

recalc_core_mix

Recalculate bottom-up aggregation

index_all

Reindex the entire database

embed

Get a vector for text

list_files

List with filters by level, sign

get_children

Traverse down the graph

get_parents

Traverse up the graph

suggest_parents

Find parents for an orphan

add_entity

Create an entity in one step (auto sign, tags, parents)

process_orphans

Auto-fill files without 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 configuration, run calibrate_cores — the server will create reference vectors. Check pairwise cosines: mean-centered between different domains should be significantly lower than raw. If all pairs are roughly the same, strengthen the differences in the texts.

etalons are semantic domains compared via embeddings. artifact_signs are material types for L5 artifacts: note, concept, link, log, update, hypothesis, or specification. This is a heuristic label, not a separate reference for embeddings. In the public schema, domains are usually denoted by uppercase letters (S/D/E), and material types by lowercase (n/c/r/l/u/h/s); these can be changed in the config if signs are short and do not conflict with domains. If necessary, you can add keywords for any type: then the server will use your words for heuristics instead of the built-in RU/EN set.

Real calculation example

Here are the actual results for S/D/E etalons with 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 here are a good result: after subtracting the mean vector, the domains diverge well. Self-classification: S→99.4%, D→97.5%, E→96.9%.

Variable

Default

Description

OBSIDIAN_ROOT

./obsidian

Path to the vault

NOUZ_CONFIG

(empty)

Absolute path to config.yaml; if not set, the server looks for the config in the current directory

NOUZ_DATABASE_NAME

obsidian_kb.db

Name of the SQLite cache file inside OBSIDIAN_ROOT; convenient for isolated checks, e.g., obsidian_kb.public.db

NOUZ_DATABASE_PATH

(empty)

Full path to the SQLite cache; takes priority over NOUZ_DATABASE_NAME

EMBED_PROVIDER

openai

openai, lmstudio, ollama

EMBED_API_URL

http://127.0.0.1:1234/v1

Endpoint for embeddings

EMBED_API_KEY

(empty)

API key, if needed

EMBED_MODEL

(empty)

Model name


Privacy

Component

Local?

Embeddings (LM Studio / Ollama)

✅ Yes

Your notes

✅ Yes

NOUZ Server

✅ Yes

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 test_server.py

MIT License © 2026 Semiotronika

Cosines are calculated. Syntax changes. Semantics remain.

Available Tools

8 tools
get_childrenGet ChildrenA
Read-onlyIdempotent

Traverse the hierarchy downward from one note. Returns all direct and transitive child note paths from the local graph index. Use this to answer 'what does this topic/module contain?' It is read-only and does not recompute semantic classification. Use get_parents for the opposite direction.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from OBSIDIAN_ROOT

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds meaningful behavioral context beyond those: it reads from the 'local graph index' and does not recompute semantic classification. This gives the agent a clearer model of what side effects, if any, to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no wasted words. The core purpose is front-loaded, and each sentence earns its place by adding scope, usage guidance, or behavioral caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only traversal tool with one well-documented parameter and strong annotations, the description is complete. It explains what is returned, how to invoke it conceptually, what it does not do, and how it relates to its sibling. No output schema exists, but the return concept is clearly stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the single path parameter already documented as 'Relative path from OBSIDIAN_ROOT'. The description does not add parameter-level detail, but the schema already carries the necessary semantics, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the exact operation ('Traverse the hierarchy downward'), the resource ('one note'), and the result ('all direct and transitive child note paths'). It also differentiates itself from the sibling get_parents, so an agent can select it without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit use case ('what does this topic/module contain?') and explicitly routes to get_parents for the opposite direction. It also notes that it does not recompute semantic classification, which helps avoid misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_parentsGet ParentsA
Read-onlyIdempotent

Return the parent links of one note from the graph index. Each result includes the parent entity name and link_type, such as hierarchy, derived_from, semantic, temporary, tag, analogy, or error. Use this to understand where a note belongs before editing links. It is read-only. Use suggest_parents when a note has no parents and you want candidate links.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from OBSIDIAN_ROOT

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true; the description repeats the read-only fact but also adds new context about result contents (parent entity name and link_type with allowed categories). This helps the agent anticipate the response shape even though there is no output schema. The description does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the primary behavior and then usage/alternative. Every sentence adds information; the only slight redundancy is the read-only statement, which is already in annotations, but it is short and does not bloat. Highly scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only lookup with no output schema, the description covers the action, the return fields, and a usage trigger. It does not describe error cases or exact return shape beyond fields, but that is minor. One minor inconsistency: it references 'suggest_parents' while the sibling list contains 'suggest_metadata' – possibly a naming mismatch, but the tool itself is still callable correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully describes the only parameter 'path' as 'Relative path from OBSIDIAN_ROOT' with 100% coverage. The description adds no further parameter-specific detail, so it relies on the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Return'), resource ('parent links of one note from the graph index'), and enumerates the link_type values in the result. This clearly distinguishes it from sibling tools like get_children, which would return the opposite direction. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives a use case ('understand where a note belongs before editing links') and names an alternative (suggest_parents) for the case where a note has no parents. It does not address all siblings, but the one likely-confusing alternative is covered. No exclusions beyond the suggested_difference, so a 4 is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

index_allIndex AllA
Idempotent

Scan the whole Markdown vault and rebuild the local SQLite index of files, metadata, and graph links. Use this after adding, moving, or reorganizing notes outside NOUZ. It is safe to run repeatedly and reports missing parent links. In PRIZMA/SLOI, with_embeddings=true also updates file and chunk embeddings for retrieval and semantic classification, which is slower and requires an embedding provider. This tool indexes data; it is not a search tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
with_embeddingsNoIf true, compute embeddings for all files (slower, requires LM Studio/Ollama). Default false.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already signal idempotency and non-destructiveness, and the description confirms those traits with 'safe to run repeatedly.' It adds new behavioral details such as reporting missing parent links and the slower, provider-dependent embedding behavior when with_embeddings is true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place: the core action, when to use it, and important behavioral caveats. The main purpose is front-loaded before secondary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter and strong annotations, the description covers invocation triggers, safety, side effects, and output hints like missing parent links. It does not describe the full return format, but that is a minor gap given the lack of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents with_embeddings well, so the description's added operational context — slower execution, provider requirement, and effect on retrieval/semantic classification — goes beyond the schema. It clarifies tradeoffs but not every environment-specific detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete verb and resource: scanning the Markdown vault and rebuilding the local SQLite index of files, metadata, and graph links. It also explicitly disambiguates from siblings by stating it indexes data and is not a search tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger, 'Use this after adding, moving, or reorganizing notes outside NOUZ,' and a clear exclusion: this tool is not for searching. This tells an agent when to invoke it and when to look elsewhere.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesList FilesA
Read-onlyIdempotent

List notes already known to the local index. Returns lightweight records with path, type, level, and sign, without loading full note bodies. Use this for inventory, filtering, and finding files to inspect next. Set no_metadata=true to find Markdown files without YAML metadata. Use get_children or get_parents when you need graph traversal from a specific note.

ParametersJSON Schema
NameRequiredDescriptionDefault
signNoFilter by domain sign, e.g. S, D, E, or another sign configured in config.yaml
levelNoFilter by hierarchy level: 1=core/domain, 2=pattern/topic, 3=module/group, 4=quant/idea, 5=artifact/raw material
subfolderNoRestrict search to a subfolder within the vault
no_metadataNoIf true, include files without YAML frontmatter

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful behavior beyond annotations: it operates on the local index, returns lightweight records, and does not load full note bodies. It does not discuss error conditions or index staleness, but those are not essential for selection.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, return characteristics, when to use, a parameter tip, and sibling routing. Information is front-loaded with the core function stated first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only filtered list with no required parameters and full schema coverage, the description covers scope, return shape, use cases, and alternatives. No critical calling information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with useful descriptions, so the baseline applies. The description adds only a mild clarification that no_metadata targets Markdown files without YAML frontmatter, not enough to meaningfully surpass the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'List notes already known to the local index.' It explicitly lists returned record fields (path, type, level, sign) and distinguishes itself from graph-traversal siblings by directing agents to get_children or get_parents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit use cases ('inventory, filtering, and finding files to inspect next'), a specific filter recommendation (no_metadata=true for Markdown files without YAML), and names alternatives for graph traversal. An agent knows exactly when to choose this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_fileRead FileA
Idempotent

Read one Markdown note from the local knowledge base. Returns the note body, YAML frontmatter, hierarchy metadata, parent links, explicit tags, and warnings as JSON. Use this before write_file when you need to preserve existing content or inspect current metadata. Side effect: refreshes this file in the local SQLite index so later classification and parent suggestions use current data. It never changes the file.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from OBSIDIAN_ROOT, e.g. 'notes/my-note.md'

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing the SQLite index refresh side effect and explaining why it matters for later classification and parent suggestions. It also explicitly states 'It never changes the file,' clarifying the non-destructive nature despite readOnlyHint being false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the action and return value are front-loaded, the write_file use case is stated, and the side effect is disclosed without redundancy. The description is compact yet information-dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read operation with no output schema, the description is complete: it lists all returned content fields, states the side effect, and confirms file immutability. An agent has enough information to invoke the tool correctly and interpret its result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides a complete description of the single path parameter with an example, so schema coverage is 100%. The description adds context about Markdown notes and the local knowledge base, but no additional parameter-level semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Read one Markdown note from the local knowledge base.' It also enumerates the returned components (note body, YAML frontmatter, hierarchy metadata, parent links, tags, warnings), making the tool's function concrete and distinct from siblings like list_files or write_file.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use this tool 'before write_file when you need to preserve existing content or inspect current metadata,' giving clear situational guidance. It does not cover alternatives like get_parents or suggest_metadata, but the primary routing to write_file is well defined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_metadataSuggest MetadataA
Idempotent

Analyze one note and propose knowledge-graph metadata for review. Returns suggested domain sign, material type, hierarchy level, explicit tags, tag quality, tag candidates with chunk evidence, bridge candidates, and hierarchy warnings. Use this before write_file when you want classification help, or to audit an existing note. It is read-only and never edits YAML. Semantic fields require embeddings and are available in PRIZMA/SLOI modes. The optional context object lets an agent test metadata overrides without changing the note.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from OBSIDIAN_ROOT
contextNoOptional metadata overrides for what-if analysis.

TDQS

A3.9/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states 'It is read-only and never edits YAML,' but the annotations declare readOnlyHint: false, indicating the operation may not be read-only. This is a direct annotation contradiction. Per the rubric, behavioral_transparency must be scored 1 when the description contradicts annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with purpose first, then output details, then usage, then behavioral notes, then context semantics. Every sentence adds meaningful information and there is no filler. Despite being moderately long, the detail is mostly essential for correctly invoking the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description generously enumerates return fields, explains the read-only nature, notes embedding-dependent fields, and describes the optional context object's purpose. This gives an agent enough to decide and call the tool correctly, aside from the read-only contradiction flagged above.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description adds useful context about the context object ('test metadata overrides without changing the note') and mentions semantic fields requiring embeddings, but it does not substantially improve parameter-level understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: 'Analyze one note and propose knowledge-graph metadata for review.' It also enumerates the exact outputs (domain sign, material type, hierarchy level, tags, etc.), which goes well beyond a vague purpose statement. This clearly distinguishes it from siblings like write_file and update_metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it: 'Use this before write_file when you want classification help, or to audit an existing note.' It also clarifies the tool is read-only and never edits YAML, which implicitly routes agents away from using it for mutations. This is strong usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_metadataUpdate MetadataA
Destructive

Update only YAML frontmatter for an existing note and preserve the Markdown body exactly. Use this for safe changes to type, level, sign, artifact_sign, tags, parents, and parents_meta when the note content must not be touched.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from OBSIDIAN_ROOT
metadataYesYAML frontmatter to write while preserving the existing body.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true, and the description adds useful behavioral context: only YAML frontmatter is written, the Markdown body is preserved exactly, and specific fields are scoped. It does not clarify whether the metadata object replaces or merges with existing frontmatter, which is a minor gap given the destructive hint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences contain all the essential information with no filler. The first sentence front-loads the core guarantee, and the second provides the usage context and allowed fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation tool with no output schema, the description covers when to use it, what changes, and what is preserved. The main omission is the merge-vs-replace behavior of the metadata object, which could affect how an agent constructs the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both path and metadata, so the baseline is 3. The description adds value by enumerating the allowed metadata fields (type, level, sign, artifact_sign, tags, parents, parents_meta) and clarifying that metadata only applies to frontmatter, not the body.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('Update'), a precise resource ('YAML frontmatter for an existing note'), and an explicit preservation guarantee ('preserve the Markdown body exactly'). It also names the exact metadata fields, making it clearly distinguishable from write_file and other siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool: 'Use this for safe changes to type, level, sign, artifact_sign, tags, parents, and parents_meta when the note content must not be touched.' It does not explicitly name an alternative like write_file for body edits, but the 'only frontmatter / preserve body exactly' language strongly implies the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_fileWrite FileA
Destructive

Create or replace one Markdown note with YAML metadata. Use it when an agent has an explicit final content body and metadata to save. This is a destructive write: it replaces the complete file, unless content_lock=true is used to preserve the existing body and update only metadata. Before writing, the server validates that parent links do not create graph cycles, syncs parents and parents_meta, and then refreshes the local index. Use read_file first for existing notes and suggest_metadata first when you want classification hints.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesRelative path from OBSIDIAN_ROOT
contentYesMarkdown body (without frontmatter delimiters)
metadataNoYAML frontmatter to write for the note.
content_lockNoIf true, IGNORE content param and preserve original file text. Default false.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description clearly discloses the destructive nature ('replaces the complete file'), explains the content_lock exception, and describes server-side side effects (cycle validation, parent syncing, index refresh). This adds significant behavioral context beyond the destructiveHint annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler: purpose first, then usage condition, then behavioral warnings and prerequites. Every sentence adds operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex write tool with nested objects and no output schema, the description covers the critical operational facts: destructive behavior, content_lock preservation, validation and sync side effects, and recommended sibling tools. The rich schema handles parameter details, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters well. The description adds useful high-level context about content_lock behavior and destructive replacement, but it does not add per-parameter detail beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create or replace one Markdown note with YAML metadata.' It also identifies a distinguishing capability (content_lock preserves body while updating metadata) and implicitly separates it from sibling tools like update_metadata and suggest_metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use the tool: 'when an agent has an explicit final content body and metadata to save.' It also names alternatives: 'Use read_file first for existing notes and suggest_metadata first when you want classification hints.' This gives clear selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: traversal (get_children, get_parents), indexing (index_all), listing (list_files), reading (read_file), metadata suggestions (suggest_metadata), metadata updates (update_metadata), and writing (write_file). No two tools overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case (e.g., get_children, list_files, write_file). The sole exception 'index_all' still follows the verb_adverb pattern but does not break consistency significantly.

Tool Count5/5

With 8 tools, the server is well-scoped for managing a knowledge base: indexing, reading, writing, and traversing notes. The number is appropriate and not excessive.

Completeness4/5

The tool set covers core operations (create, read, update, metadata management, graph traversal) but lacks a delete operation and a search/find tool, which are minor gaps for a knowledge base server.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Semiotronika/NOUZ-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server