Skip to main content
Glama
markdown-vault-mcp

markdown-vault-mcp

by pvliesdonk

List Documents

list_documents
Read-onlyIdempotent

List Markdown notes and optional attachments by folder, path pattern, or frontmatter, returning path, title, and metadata without body text. Use it to browse or filter vault contents before reading.

Instructions

List notes, and optionally attachments, with path, title and frontmatter but no body text.

Use search to find notes by what they say.

Input Schema

NameRequiredDescriptionDefault
folderNoOnly notes in this folder and its sub-folders, such as `"Journal"`; `""` for top-level notes only; omit for the whole vault.
filtersNoFrontmatter values to match, all of them, such as `{"tags": "craft"}`; any key works, a list field matches when it holds the value, and attachments never match. On an OKF bundle, status (draft, stable or deprecated; stable includes notes with none), stale (`"true"` or `"false"`) and trust_tier (unverified, machine-confirmed or human-reviewed) filter too.
patternNoGlob matched against paths, such as `"Journal/*.md"` or `"**/*meeting*.md"`.
include_attachmentsNoAlso list non-note files, marked kind=`"attachment"` with their mime_type. Default false.
wait_for_pending_writesNoWait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false.

Output Schema

NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv6.1.0
    • changedInput schema / properties / filters / description
      Previous value: -"Frontmatter equality filters, ANDed (e.g.\n{\"tags\": \"craft\"}); any frontmatter key works and list\nfields match by membership. On an OKF bundle three keys\ncarry OKF semantics: status (\"draft\"/\"stable\"/\"deprecated\";\n\"stable\" also matches notes without a status field), stale\n(\"true\"/\"false\" — stale_after reached), and trust_tier\n(\"unverified\"/\"machine-confirmed\"/\"human-reviewed\"). Use\n{\"status\": \"deprecated\"} or {\"stale\": \"true\"} to build\ntriage listings. Any filter excludes attachments (they\ncarry no frontmatter)."New value: +"Frontmatter values to match, all of them, such as `{\"tags\": \"craft\"}`;\nany key works, a list field matches when it holds the value, and\nattachments never match. On an OKF bundle, status (draft, stable or\ndeprecated; stable includes notes with none), stale (`\"true\"` or `\"false\"`)\nand trust_tier (unverified, machine-confirmed or human-reviewed) filter\ntoo."
    • changedInput schema / properties / folder / description
      Previous value: -"Return only documents in this folder (e.g. \"Journal\").\nUse folder=\"\" for root-level (top-level) documents only."New value: +"Only notes in this folder and its sub-folders, such as `\"Journal\"`;\n`\"\"` for top-level notes only; omit for the whole vault."
    • changedInput schema / properties / include_attachments / description
      Previous value: -"When True, also returns non-.md files (PDFs,\nimages, etc.) that match the configured allowlist. Each\nattachment entry includes kind=\"attachment\" and mime_type.\nDefault False (notes only)."New value: +"Also list non-note files, marked kind=`\"attachment\"` with\ntheir mime_type. Default false."
    • changedInput schema / properties / pattern / description
      Previous value: -"Unix glob matched against relative paths (e.g.\n\"Journal/*.md\", \"**/*meeting*.md\")."New value: +"Glob matched against paths, such as `\"Journal/*.md\"` or\n`\"**/*meeting*.md\"`."
  2. Changed2 schema fields changedv5.0.0
    • changedInput schema / properties / filters / description
      Previous value: -"Frontmatter equality filters, ANDed (e.g.\n{\"tags\": \"craft\"}); any frontmatter key works and list\nfields match by membership. On an OKF bundle three keys\ncarry OKF semantics: status (\"draft\"/\"stable\"/\"deprecated\";\n\"stable\" also matches notes without a status field), stale\n(\"true\"/\"false\" — stale_after passed), and trust_tier\n(\"unverified\"/\"machine-confirmed\"/\"human-reviewed\"). Use\n{\"status\": \"deprecated\"} or {\"stale\": \"true\"} to build\ntriage listings. Any filter excludes attachments (they\ncarry no frontmatter)."New value: +"Frontmatter equality filters, ANDed (e.g.\n{\"tags\": \"craft\"}); any frontmatter key works and list\nfields match by membership. On an OKF bundle three keys\ncarry OKF semantics: status (\"draft\"/\"stable\"/\"deprecated\";\n\"stable\" also matches notes without a status field), stale\n(\"true\"/\"false\" — stale_after reached), and trust_tier\n(\"unverified\"/\"machine-confirmed\"/\"human-reviewed\"). Use\n{\"status\": \"deprecated\"} or {\"stale\": \"true\"} to build\ntriage listings. Any filter excludes attachments (they\ncarry no frontmatter)."
    • changedInput schema / properties / wait_for_pending_writes / description
      Previous value: -"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"Wait for recent index writes. On timeout, answer from the current index with _meta.index_stale=true. Default false."
  3. Changed2 schema fields changedv4.0.0
    • addedInput schema / properties / filters
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Frontmatter equality filters, ANDed (e.g.\n{\"tags\": \"craft\"}); any frontmatter key works and list\nfields match by membership. On an OKF bundle three keys\ncarry OKF semantics: status (\"draft\"/\"stable\"/\"deprecated\";\n\"stable\" also matches notes without a status field), stale\n(\"true\"/\"false\" — stale_after passed), and trust_tier\n(\"unverified\"/\"machine-confirmed\"/\"human-reviewed\"). Use\n{\"status\": \"deprecated\"} or {\"stale\": \"true\"} to build\ntriage listings. Any filter excludes attachments (they\ncarry no frontmatter)."
      +}
    • changedInput schema / properties / wait_for_pending_writes / description
      Previous value: -"When True, wait until your recent\nwrite/edit/delete/rename operations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a write/edit/delete/rename whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."New value: +"When True, wait until your recent\ndocument mutations have been applied to the\nindex before answering, so the results reflect those changes.\nUse it right after modifying notes when this read must see\nthem (e.g. right after a document mutation whose\neffect this read should reflect). Default\nFalse answers immediately from the current index — almost\nalways already up to date; inspect the response's\n``_meta.index_stale`` field to tell whether a write was still\nin flight. Bounded by a server timeout (default 60s); on\ntimeout it answers from the current index rather than waiting\nlonger."
  4. First observedv3.1.0

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: results carry metadata only, never body text, and attachments are excluded unless requested. It stays silent on index staleness and pending-write waiting, but those are documented in the schema and output schema.

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 short sentences with no waste. The return-shape constraint is front-loaded and the disambiguation follows immediately, so the reader gets the most decision-relevant fact first.

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?

With an output schema present and full parameter coverage, the description need not restate return values or parameter formats; it correctly focuses on scope and sibling routing. Minor gap: it does not hint that the listing is filterable by folder, frontmatter or glob, which is the tool's main power, though the schema carries that fully.

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 explains folder scoping, frontmatter filters, glob patterns, attachment inclusion and write-waiting. The description only alludes to the attachment option and the returned fields, adding no syntax or edge-case detail beyond the schema. Baseline 3 applies.

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, and optionally attachments") and pins down the returned fields (path, title, frontmatter) while explicitly excluding body text. It also names the sibling it is not ("search") and the distinction between them, so an agent can route correctly without opening a schema.

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?

The second sentence gives a clear selection rule: use this to enumerate, use search to find notes by content. That is a genuine when-to-use statement with a named alternative, though it does not mention other plausible alternatives such as count_documents or query_documents, nor any when-not conditions.

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