🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@ev3lynx/md-analyzer

Package Overview
Dependencies
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ev3lynx/md-analyzer

Markdown document analyzer for AI agents - extract metadata, headings, links, tables, tokens, and key points

latest
Source
npmnpm
Version
0.3.0
Version published
Weekly downloads
27
-92.35%
Maintainers
1
Weekly downloads
 
Created
Source

md-analyzer

Markdown document analyzer for AI agents - extract metadata, headings, links, tables, tokens, and key points from .md files.

md-analyzer is a lightweight, agent-ready document analysis tool designed for AI workflows. It provides single-shot document overviews, token budget tracking, and document relationship graphs — perfect for OpenCode, kiro-cli, or any AI agent framework.

Quick Overview

FeatureDescription
KeypointsSingle-shot document overview (ideal for agents)
SummaryAggregated totals + averages + extremes across all files (--summary)
WatchLive re-analysis on file changes via fs.watch (--watch)
Token TrackingSession-based token budget with persistent storage (~/.local/share/md-analyzer/tokens/md-analyzer-session.json)
GraphDocument relationship topology (backlinks, orphans)
SearchKeyword search with relevance ranking
LogsStructured JSON logs in ~/.local/state/md-analyzer/log/{sessionId}.json

Why md-analyzer?

  • Agent-native — Designed for AI agent workflows with single-shot outputs
  • Token-safe — Built-in limits prevent context blowout (default: 20 results)
  • Extensible — Simple TypeScript source, easy to extend for plugins
  • Zero config — Runtime TOML parser, no config file required

Prerequisites

System Requirements

RequirementVersionNotes
Node.js≥ 18.0.0LTS recommended
npm≥ 8.0.0Comes with Node.js

Verify Installation

node --version  # Should be >= 18.0.0
npm --version   # Should be >= 8.0.0

Dependencies

PackageVersionPurpose
micromark^4.0.0Token-stream Markdown parsing
micromark-extension-gfm^3.0.0GFM tables via micromark
js-tiktoken^1.0.0GPT token counting
js-yaml^4.1.0Frontmatter YAML parsing

Installation

npm install -g @ev3lynx/md-analyzer
md-analyzer --help

From source

git clone https://github.com/Ev3lynx727/md-analyzer.git
cd md-analyzer
npm install
npm run build

Quick test

node dist/cli/index.js . --keypoints --json

Usage

Basic CLI

Accepts a .md file or a directory of .md files.

# With npx (no install required)
npx @ev3lynx/md-analyzer <file|directory> [options]

# After global install
npm install -g @ev3lynx/md-analyzer
md-analyzer <file|directory> [options]

# From source (development)
node dist/cli/index.js <file|directory> [options]

Options

FlagDescriptionExample
--jsonOutput as JSON--json
--summaryAggregated totals + averages + extremes across all files--summary
--watchLive re-analysis via fs.watch with 300ms debounce--watch
--search <kw>Search keyword in content--search "task"
--filter <k=v>Filter by metadata field--filter "category=guides"
--rankRank results by relevance--search "task" --rank
--graphDocument relationship graph--graph
--depsDependency graph (DAG order)--deps
--orphansFind unreferenced docs--orphans
--backlinks <doc>Find docs linking to <doc>--backlinks "adr-2026-01"
--keypointsQuick overview (single-shot)--keypoints
--lint-fragmentsFrontmatter health check--lint-fragments
--sessionToken budget report--session
--budget <n>Set token budget limit--budget 50000
--max-results <n>Limit output--max-results 10

Examples

# Quick overview — single file
md-analyzer path/to/doc.md --keypoints --json

# Quick overview — entire directory
md-analyzer /path/to/docs --keypoints --json

# Aggregated summary (totals, averages, extremes)
md-analyzer . --summary --json

# Live re-analysis on file changes
md-analyzer . --watch

# Search with ranking
md-analyzer . --search "task lifecycle" --rank --json

# Find backlinks
md-analyzer . --backlinks adr-2026-04-01 --json

# Token budget tracking
md-analyzer . --session --budget 100000 --json

# Find orphans
md-analyzer . --orphans --json

# Lint frontmatter
md-analyzer . --lint-fragments --json

--keypoints JSON output

[
  {
    "fileName": "adr-2026-04",
    "title": "ADR-2026-04: Configuration Management",
    "summary": {
      "totalHeadings": 5,
      "totalLinks": 3,
      "totalWikilinks": 1,
      "totalTokens": 1200,
      "wordCount": 850
    },
    "keyHeadings": [
      { "level": 1, "text": "ADR-2026-04: Configuration Management", "line": 1, "tokens": 320 },
      { "level": 2, "text": "Status", "line": 4, "tokens": 85 },
      { "level": 2, "text": "Context", "line": 8, "tokens": 410 },
      { "level": 2, "text": "Decision", "line": 22, "tokens": 290 },
      { "level": 2, "text": "Consequences", "line": 35, "tokens": 95 }
    ],
    "importantLinks": [
      { "text": "Memory FAQ", "url": "https://help.openai.com/..." }
    ],
    "internalReferences": ["adr-2026-01", "adr-2026-02"],
    "readingTime": "4 min"
  }
]

Agent hook integration (pre-read)

The --keypoints output powers a pre-read hook for AI agent frameworks (opencode, kiro-cli). Before reading a file, the hook injects a structured overview so the LLM can decide what to read.

See docs/INTEGRATION.md for setup guides, md-analyzer install --hook, and MCP integration.

Calling from code

md-analyzer is a CLI tool — integrate via subprocess:

// Node.js
const { execSync } = require('child_process');
const result = execSync('md-analyzer ./docs --keypoints --json', { encoding: 'utf-8' });
const docs = JSON.parse(result);

For agent hooks, see the pre-read integration section above.

Configuration

Priority chain: CLI flag → MD_ANALYZER_DEFAULT_DIR env var → process.cwd().

Environment Variables

VariableDescriptionDefault
MD_ANALYZER_DEFAULT_DIRDefault directoryprocess.cwd()
STATE_DIRToken tracking storage directory~/.local/share/md-analyzer
LOG_DIRRun logs storage directory~/.local/state/md-analyzer/log

Session & Logging

Session File

Location: ~/.local/share/md-analyzer/tokens/md-analyzer-session.json (XDG Data Home)

Persistent storage survives system reboots. Override with STATE_DIR environment variable.

{
  "sessionId": "session-1234567890",
  "calls": 5,
  "totalTokens": 1500,
  "filesProcessed": 25,
  "startTime": "2026-05-03T12:00:00.000Z"
}

Run Logs

Location: ~/.local/state/md-analyzer/log/{sessionId}.json (XDG State Home)

Persistent storage survives system reboots. Override with LOG_DIR environment variable.

[
  {
    "timestamp": "2026-05-03T12:00:00.000Z",
    "sessionId": "session-1234567890",
    "directory": "/path/to/docs",
    "flags": ["--keypoints", "--json"],
    "filesFound": 10,
    "filesProcessed": 10,
    "tokensThisCall": 300,
    "totalSessionTokens": 1500,
    "errors": [],
    "durationMs": 450,
    "mode": "keypoints"
  }
]

Architecture

md-analyzer/
├── src/
│   ├── cli/index.ts         # CLI entry (file or directory)
│   ├── core/
│   │   ├── analyzer.ts       # Orchestrator — sync+async paths
│   │   ├── micromark-walk.ts # Token-stream walkers (primary)
│   │   ├── hybrid-merge.ts   # Code-block region filtering
│   │   ├── extractors.ts     # Regex fallbacks (frontmatter, wikilinks)
│   │   ├── counters.ts       # Token/word/char counting
│   │   ├── graph.ts          # Document relationship graph
│   │   ├── search.ts         # Keyword search + relevance
│   │   ├── health.ts         # Fragment health checks
│   │   └── session.ts        # Token budget tracking (disk write only with --session)
│   ├── types/index.ts        # Shared TypeScript types
│   └── utils/constants.ts    # SKIP_DIRS, SESSION_FILE, LOG_DIR (XDG paths)
├── dist/                     # Compiled output
└── embedded-docs/            # Sample documents for testing

Storage:

  • Session tokens: ~/.local/share/md-analyzer/tokens/ (XDG_DATA_HOME)
  • Run logs: ~/.local/state/md-analyzer/log/ (XDG_STATE_HOME)

Key Functions

FunctionMicromark (primary)Regex (fallback)
extractFrontmatter()✅ stays on regex
walkHeadings()✅ ATX + setext in one passextractHeadings() (deprecated)
walkLinks()✅ inline, autolink, reference, imageextractLinks() (deprecated)
walkTables()✅ via GFM specextractTables() (deprecated)
walkCodeBlocks()✅ codeFenced + codeIndented regions
extractWikilinks()✅ stays on regex
analyzeFileWithMicromark()✅ Hybrid orchestratoranalyzeFile() sync fallback
scanMarkdownFiles()✅ Recursive directory scanner
buildGraph()✅ Document relationship topology
extractKeyPoints()✅ Single-shot overview
loadSession() / saveSession()✅ Token budget tracking

Error Handling

ErrorDescriptionRecovery
permission_deniedCannot read directorySkip, continue scan
file_read_errorCannot read fileEmpty result with error
path_not_foundCLI argument file/dir doesn't existEmpty results []
micromark_unavailableESM import failureAutomatic regex fallback
micromark_pipeline_failedMicromark parse crashAutomatic regex fallback
walkLinks_failedLink token walker errorEmpty link list (regex fallback for that field)
walkHeadings_failedHeading token walker errorEmpty heading list (regex fallback)
walkTables_failedTable parse errorEmpty table list (regex fallback)
token_count_fallbacktiktoken unavailableEstimate via charCount / 4

License

MIT - See LICENSE file.

Keywords

markdown

FAQs

Package last updated on 07 Jul 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts