{
  "slug": "markdown-notes-index",
  "name": "gizza-ai/markdown-notes-index",
  "version": "0.1.0",
  "title": "Markdown Notes Index — build a linked index of notes, tags & outlines — gizza.ai",
  "description": "Paste a pile of Markdown notes and get a linked index: titles, tags, heading outlines and word counts, as Markdown, JSON or CSV. Free, private, in your browser.",
  "tags": [
    "markdown notes index",
    "notes index generator",
    "map of content",
    "markdown table of contents",
    "obsidian index note",
    "note tags index",
    "markdown outline generator",
    "index markdown notes"
  ],
  "category": "documents",
  "urls": {
    "page": "https://gizza.ai/tools/markdown-notes-index/",
    "markdown": "https://gizza.ai/tools/markdown-notes-index/index.md",
    "descriptor": "https://gizza.ai/tools/markdown-notes-index/tool.json",
    "deep_link_example": "https://gizza.ai/tools/markdown-notes-index/?notes=%23%20Getting%20started%0A%0ASome%20intro%20text.%0A%0A%23%23%20Install%0A%0ARun%20it.%0A%0A%23%20Weekly%20review%0A%0A%23planning%20Notes%20about%20the%20week.&split=heading&format=markdown&heading_depth=2&group_by=none&sort=input&link_style=anchor&include_toc=true&include_stats=true&inline_tags=true"
  },
  "cli": "gizza tool markdown-notes-index \"# Getting started\n\nSome intro text.\n\n## Install\n\nRun it.\n\n# Weekly review\n\n#planning Notes about the week.\"",
  "tool": {
    "description": "Turn a pile of pasted Markdown notes into one linked index — the map-of-content note a vault or docs folder is missing. Paste the notes into `notes` one after another; `split` says where each note ends: heading (default, a new note at every `# ` heading), hr (a `---`/`***`/`___` thematic break, front matter excluded), or file-marker (`=== notes/todo.md ===` or `==> notes/todo.md <==` banners, which also give each note its source path). Each note's title is taken from its front-matter `title:`, else its first heading, else its file name, else `Untitled note N`. Tags come from front-matter `tags`/`tag`/`keywords` in inline, flow or block-list YAML, plus inline `#tags` in the body unless inline_tags is off. The Markdown output is a summary line, an optional linked table of contents (include_toc), and one section per note with tags, source file, counts (include_stats) and a heading outline down to heading_depth (0–6, default 2). group_by=tag lists the notes under each tag instead of one flat list; sort orders by input, title or word count; link_style picks anchor links, Obsidian `[[wiki]]` links or plain text. format=json returns the same index as structured data and format=csv as one row per note. ATX headings only, headings inside code fences are skipped, and up to 500 notes per run. Pure text in, index text out — nothing is read from disk and note bodies are never reproduced.",
    "parameters": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "default": "markdown",
          "description": "Output shape. \"markdown\" (default) is a ready-to-paste index note: a summary line, an optional linked table of contents, then one section per note with its tags, source file, counts and heading outline. \"json\" returns {notes, words, tags[], index[], groups?} with title, anchor, file, tags, headings and counts per note, for feeding another tool. \"csv\" returns one row per note with title, file, tags (semicolon-joined) and, with stats on, heading and word counts — for a spreadsheet.",
          "enum": [
            "markdown",
            "json",
            "csv"
          ],
          "type": "string"
        },
        "group_by": {
          "default": "none",
          "description": "How the table of contents is organised. \"none\" (default) is one numbered list in the chosen sort order. \"tag\" gives each tag its own subsection listing the notes carrying it — a note with three tags appears under all three — followed by an \"Untagged\" subsection when some notes have no tags. Tags are matched case-insensitively. In JSON output this adds a `groups` array instead.",
          "enum": [
            "none",
            "tag"
          ],
          "type": "string"
        },
        "heading_depth": {
          "default": 2,
          "description": "Deepest heading level kept in each note's outline, 1–6; 2 is the default, so `#` and `##` headings are listed and deeper ones are left out. Set 0 for no outline at all — just titles, tags and counts. The heading used as a note's title is never repeated in its own outline, and heading counts in the stats always cover every heading, not just the listed ones.",
          "maximum": 6,
          "minimum": 0,
          "type": "integer"
        },
        "include_stats": {
          "default": true,
          "description": "Include word and heading counts — a total on the summary line and per-note counts on each section. On by default. Words are whitespace-separated tokens containing at least one letter or digit, so bare Markdown punctuation (`-`, `>`, `|`) is not counted. Turn it off for a clean index with no numbers; in CSV this drops the headings and words columns.",
          "type": "boolean"
        },
        "include_toc": {
          "default": true,
          "description": "Put a linked \"Contents\" list at the top of the Markdown index. On by default. Turn it off when you only want the per-note sections — for example when the index is being appended under a table of contents that already exists. Ignored for CSV output.",
          "type": "boolean"
        },
        "inline_tags": {
          "default": true,
          "description": "Collect `#tag` mentions from the note body as tags, on top of any front-matter tags. On by default. A tag must start at a boundary (line start, whitespace, `(` or `[`) and contain at least one letter, so issue references like `#1234` are ignored and `#build/ci` is kept whole. Turn it off to use only the front-matter `tags` list.",
          "type": "boolean"
        },
        "link_style": {
          "default": "anchor",
          "description": "How index entries link to notes. \"anchor\" (default) links to the note's own section in this index using a GitHub-style slug, or to the source file when the note came from a `=== path ===` marker (outline entries then become `file.md#heading` links). \"wiki\" emits `[[Note title]]` and `[[Note title#Heading]]` for Obsidian-style vaults. \"none\" leaves plain text, for pasting somewhere that has no link targets.",
          "enum": [
            "anchor",
            "wiki",
            "none"
          ],
          "type": "string"
        },
        "notes": {
          "description": "The Markdown notes to index, pasted one after another in a single document. Each note may start with a `---` YAML front-matter block (only `title`, `tags`/`tag` and `keywords` are read) and is otherwise plain Markdown. Headings must be ATX style (`#` … `######`); setext underlines are not treated as headings, and headings inside ``` or ~~~ code fences are ignored. Up to 500 notes per run. Note bodies are never reproduced in the output — only the index metadata.",
          "type": "string"
        },
        "sort": {
          "default": "input",
          "description": "Order of the notes in the index. \"input\" (default) keeps the order they were pasted in. \"title\" sorts A→Z case-insensitively by the resolved title. \"words\" puts the longest notes first, which is a quick way to spot stubs at the bottom of a vault. Notes that tie keep their input order.",
          "enum": [
            "input",
            "title",
            "words"
          ],
          "type": "string"
        },
        "split": {
          "default": "heading",
          "description": "Where one note ends and the next begins. \"heading\" (default) starts a new note at every top-level `# ` heading. \"hr\" splits on a thematic break (`---`, `***` or `___` on its own line); a `---` that opens a note's front matter is not treated as a break. \"file-marker\" splits on file banner lines — `=== notes/todo.md ===` or `==> notes/todo.md <==`, the form `head`/`tail` print — and remembers each path, so titles and links point at the real files. A file-marker run with no markers in the input is an error, not one giant note.",
          "enum": [
            "heading",
            "hr",
            "file-marker"
          ],
          "type": "string"
        }
      },
      "required": [
        "notes"
      ],
      "type": "object"
    }
  }
}