NOUZ MCP Server
The NOUZ MCP Server is a semantic knowledge engine for Obsidian that enables AI agents to intelligently structure, analyze, and navigate knowledge bases through vector embeddings and graph relationships. All core operations run locally, ensuring privacy.
File Operations
Read/write Obsidian notes with YAML frontmatter and metadata via
read_file/write_fileBrowse and filter the vault by domain sign, hierarchy level, subfolder, or missing metadata via
list_filesReindex the entire vault into SQLite (optionally with embeddings) via
index_all
Graph Navigation
Traverse parent-child relationships with
get_children/get_parentsGet a compact one-line structural formula
(children)[entity]{parents}showing a note's position viaformat_entity_compact
Semantic Analysis & Metadata
Suggest domain sign, hierarchy level, semantic bridges, and drift warnings for a note via
suggest_metadataFind semantically appropriate parent notes for orphaned notes via
suggest_parentsDetect
core_driftwhen a note's declared intent (sign) diverges from its actual content (core_mix)
Embeddings & Domain Calibration
Generate vector embeddings for arbitrary text via
embedCalibrate core domain vectors from reference texts (etalons) via
calibrate_coresRecalculate automatic domain signs for all notes via
recalc_signs(supports dry-run)Perform bottom-up semantic aggregation (L4→L3→L2) to compute
core_mixviarecalc_core_mix
Hierarchical Modeling
Supports 5 entity levels: Core (L1), Pattern (L2), Module (L3), Quant (L4), Artifact (L5)
Three operating modes: LUCA (graph only), PRIZMA (graph + semantics), SLOI (strict 5-level hierarchy)
Relationship Discovery
Identifies three bridge types between notes: semantic (similar content), tag (shared concepts), and analogical (similar structural roles across domains)
Configuration
Configurable classification and bridge detection thresholds, embedding provider (LM Studio, Ollama, or cloud APIs), and core domain definitions.
Manages notes in an Obsidian vault, providing tools to read, write, and navigate markdown files with YAML frontmatter, including bidirectional link tracking (parents/children), semantic indexing, and hierarchical organization across five knowledge levels.
Integrates with Ollama for local embedding generation, enabling semantic search, similarity matching, and automated metadata suggestions using locally-hosted language models.
Integrates with OpenAI's API for cloud-based embedding generation, supporting semantic analysis, core sign calibration, and vector similarity operations for knowledge graph navigation.
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.
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:
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.
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.
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
You describe domains in
config.yaml— what area each domain covers and what text features to recognize it by.The server turns descriptions into reference vectors (locally, via LM Studio or Ollama).
Each new note is projected onto these axes. The sign is determined by content, or by you.
L4 receives a domain profile from text classification, and L3/L2 collect
core_mixfrom child nodes. If a module'ssigndiverges fromcore_mix, the server reports acore_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-mcpWithout 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.yamlIn Windows PowerShell:
Copy-Item config.template.yaml config.yamlOr 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.pyConnecting 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 |
| Sign, level, bridges, drift warnings |
| Write a note with YAML markup |
| Update only YAML without changing the note text |
| Read a note + metadata |
| Update reference vectors for cores |
| Recalculate signs for all notes |
| Recalculate bottom-up aggregation |
| Reindex the entire database |
| Get a vector for text |
| List with filters by level, sign |
| Traverse down the graph |
| Traverse up the graph |
| Find parents for an orphan |
| Create an entity in one step (auto sign, tags, parents) |
| 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.4822Negative 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 |
|
| Path to the vault |
| (empty) | Absolute path to |
|
| Name of the SQLite cache file inside |
| (empty) | Full path to the SQLite cache; takes priority over |
|
|
|
|
| Endpoint for embeddings |
| (empty) | API key, if needed |
| (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.pyLinks
MIT License © 2026 Semiotronika
Cosines are calculated. Syntax changes. Semantics remain.
Available Tools
8 toolsget_childrenGet ChildrenARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from OBSIDIAN_ROOT |
TDQS
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.
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.
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.
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.
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.
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 ParentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from OBSIDIAN_ROOT |
TDQS
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.
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.
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.
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.
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.
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 AllAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| with_embeddings | No | If true, compute embeddings for all files (slower, requires LM Studio/Ollama). Default false. |
TDQS
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.
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.
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.
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.
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.
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 FilesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sign | No | Filter by domain sign, e.g. S, D, E, or another sign configured in config.yaml | |
| level | No | Filter by hierarchy level: 1=core/domain, 2=pattern/topic, 3=module/group, 4=quant/idea, 5=artifact/raw material | |
| subfolder | No | Restrict search to a subfolder within the vault | |
| no_metadata | No | If true, include files without YAML frontmatter |
TDQS
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.
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.
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.
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.
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.
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 FileAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from OBSIDIAN_ROOT, e.g. 'notes/my-note.md' |
TDQS
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.
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.
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.
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.
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.
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 MetadataAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from OBSIDIAN_ROOT | |
| context | No | Optional metadata overrides for what-if analysis. |
TDQS
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.
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.
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.
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.
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.
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 MetadataADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from OBSIDIAN_ROOT | |
| metadata | Yes | YAML frontmatter to write while preserving the existing body. |
TDQS
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.
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.
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.
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.
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.
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 FileADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Relative path from OBSIDIAN_ROOT | |
| content | Yes | Markdown body (without frontmatter delimiters) | |
| metadata | No | YAML frontmatter to write for the note. | |
| content_lock | No | If true, IGNORE content param and preserve original file text. Default false. |
TDQS
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.
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.
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.
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.
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.
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
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.
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.
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.
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
Related MCP Connectors
Personal knowledge base MCP server with semantic search, auto-categorization, metadata extraction
Personal knowledge graph as an AI memory layer over MCP - read, save, and link your memories.
MCP server for querying Forkast documentation
Related MCP Servers
- AlicenseBqualityFmaintenanceA server that consolidates 21+ Obsidian tools into 5 intelligent operations (vault, edit, view, workflow, system) with contextual workflow hints to help AI agents effectively interact with Obsidian.52636MIT
- FlicenseNot gradedqualityDmaintenanceProvides a coherent memory layer for LLM agents that models beliefs as nodes in a constraint network to detect and surface semantic contradictions. It uses local embeddings and a hybrid geometric-logical energy model to identify conflicting information that requires review.
- FlicenseNot gradedqualityCmaintenanceMCP server that enables full-text search and link navigation over Markdown files as a knowledge graph.
- AlicenseNot gradedqualityDmaintenanceMCP server for a personal knowledge base that captures and structures idea fragments, enabling MCP-capable agents to search, retrieve, and add notes with semantic links and clustering.3MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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