AgentStack
SKILL verified MIT Self-run

Obsidian Vault Intelligence

skill-jlaska-obsidian-claude-plugins-obsidian-vault-intelligence · by jlaska

|

No reviews yet
0 installs
17 views
0.0% view→install

Install

$ agentstack add skill-jlaska-obsidian-claude-plugins-obsidian-vault-intelligence

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Obsidian Vault Intelligence? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Obsidian Vault Intelligence

Provides smart vault search, health reporting, and Dataview query access — all powered by the obsidian CLI (Obsidian 1.12+). Falls back to direct file access when the CLI is unavailable.

Prerequisite: The obsidian-cli skill must be loaded. Verify with:

obsidian version 2>/dev/null && echo "CLI available" || echo "CLI unavailable — will use fallbacks"

Capability 1: Smart Vault Search

Use Obsidian's indexed search engine instead of grep to find thematically related notes. The index understands tags, aliases, backlinks, and property values — not just literal text.

When to use

  • Finding vault connections for a new note (youtube-summarizer, book notes, etc.)
  • Locating notes about a person, project, or concept
  • Searching by tag, frontmatter property, or link relationship

How to search

# Basic full-text search
obsidian search query="" format=json limit=20 2>/dev/null

# Tag-based search
obsidian search query="tag:#negotiation OR tag:#communication" format=json 2>/dev/null

# Search within a folder
obsidian search query="" path="BOOKS/" format=json 2>/dev/null

# Find notes that link to a specific note
obsidian backlinks file="BOOKS/Never Split the Difference.md" format=json 2>/dev/null

# Parse JSON results for paths
obsidian search query="" format=json 2>/dev/null \
  | python3 -c "import sys,json; data=json.load(sys.stdin); [print(r.get('path','')) for r in data]"

Query syntax:

  • term1 term2 — both terms
  • "exact phrase" — phrase match
  • tag:#tagname — by tag
  • term1 OR term2 — either term
  • -term — exclude
  • property:value — frontmatter property value
  • path:folder/ — restrict to path prefix

Fallback when CLI unavailable

# Search BOOKS/ and PROJECTS/ with thematic keywords
grep -rl "" "/BOOKS" "/PROJECTS" \
  --include="*.md" 2>/dev/null | head -20

# Search full vault
grep -rl "" "" \
  --include="*.md" \
  --exclude-dir=SCRIPTS --exclude-dir=DATAVIEW_SCRIPTS \
  2>/dev/null | head -20

Capability 2: Dataview API Bridge

When the Dataview plugin is installed, obsidian eval gives Claude direct access to Dataview's JavaScript API — the most powerful way to query the vault.

Check if Dataview is available

obsidian eval code="return !!app.plugins.plugins['dataview']" 2>/dev/null

Example queries

# Find notes by tag (multi-tag, thematic)
obsidian eval code="
  const dv = app.plugins.plugins['dataview'].api;
  const pages = dv.pages('#negotiation OR #communication OR #leadership')
    .sort(p => p.file.mtime, 'desc').slice(0, 10);
  return JSON.stringify(pages.map(p => ({path: p.file.path, tags: p.tags})));
" 2>/dev/null

# Find notes modified in the last 30 days
obsidian eval code="
  const dv = app.plugins.plugins['dataview'].api;
  const cutoff = dv.date('today') - dv.duration('30d');
  return JSON.stringify(dv.pages().where(p => p.file.mtime > cutoff)
    .sort(p => p.file.mtime, 'desc').slice(0, 20)
    .map(p => p.file.path));
" 2>/dev/null

# Find notes missing a required frontmatter field
obsidian eval code="
  const dv = app.plugins.plugins['dataview'].api;
  return JSON.stringify(dv.pages('\"REFERENCES\"')
    .where(p => !p.tags || p.tags.length === 0)
    .map(p => p.file.path));
" 2>/dev/null

# Find notes that link to a given note (backlink graph)
obsidian eval code="
  const file = app.vault.getAbstractFileByPath('BOOKS/Never Split the Difference.md');
  const cache = app.metadataCache.resolvedLinks;
  const backlinks = Object.entries(cache)
    .filter(([src, links]) => Object.keys(links).includes(file?.path))
    .map(([src]) => src);
  return JSON.stringify(backlinks);
" 2>/dev/null

Thematic connection finder (primary use case)

Use this pattern in any skill that needs to find vault connections for a new note:

# Given a set of theme keywords (e.g. from a book or video topic):
THEMES="negotiation empathy assertive conflict listening"

obsidian eval code="
  const dv = app.plugins.plugins['dataview'].api;
  const themes = ['negotiation', 'empathy', 'assertive', 'conflict', 'listening'];
  const results = dv.pages().where(p => {
    const text = [p.file.name, ...(p.tags || [])].join(' ').toLowerCase();
    return themes.some(t => text.includes(t));
  }).sort(p => p.file.mtime, 'desc').slice(0, 15);
  return JSON.stringify(results.map(p => ({path: p.file.path, tags: p.tags || []})));
" 2>/dev/null || \
grep -rl "negotiation\|empathy\|assertive\|conflict\|listening" "" \
  --include="*.md" --exclude-dir=SCRIPTS 2>/dev/null | head -15

Capability 3: Vault Health Report

Run /vault-health to get a full health report on the vault's link graph, orphaned notes, broken links, and tag inventory.

Run vault health check

echo "## Vault Health Report"
echo ""

echo "### Orphaned Notes (no backlinks)"
obsidian orphans format=json 2>/dev/null \
  | python3 -c "import sys,json; paths=json.load(sys.stdin); print(f'Total: {len(paths)}'); [print(f'  - {p}') for p in paths[:20]]"

echo ""
echo "### Dead-End Notes (no outgoing links)"
obsidian deadends format=json 2>/dev/null \
  | python3 -c "import sys,json; paths=json.load(sys.stdin); print(f'Total: {len(paths)}'); [print(f'  - {p}') for p in paths[:20]]"

echo ""
echo "### Unresolved Links (broken wikilinks)"
obsidian unresolved format=json 2>/dev/null \
  | python3 -c "import sys,json; data=json.load(sys.stdin); print(f'Total: {len(data)}'); [print(f'  - {d}') for d in data[:20]]"

echo ""
echo "### Tag Inventory (top 20 by usage)"
obsidian tags counts sort=count format=json 2>/dev/null \
  | python3 -c "
import sys, json
tags = json.load(sys.stdin)
for t in sorted(tags, key=lambda x: x.get('count',0), reverse=True)[:20]:
    print(f'  {t[\"count\"]:4d}  {t[\"tag\"]}')
"

Task dashboard

Find all open tasks across the vault or within a folder:

# All open tasks
obsidian tasks todo verbose=true format=json 2>/dev/null \
  | python3 -c "
import sys, json
tasks = json.load(sys.stdin)
for t in tasks:
    print(f'  [ ] {t[\"text\"]}  ({t[\"file\"]}:{t[\"line\"]})')
"

# Open tasks from meeting notes only
obsidian tasks todo verbose=true format=json 2>/dev/null \
  | python3 -c "
import sys, json
tasks = [t for t in json.load(sys.stdin) if 'MEETINGS' in t.get('file','')]
print(f'Open meeting tasks: {len(tasks)}')
for t in tasks:
    print(f'  [ ] {t[\"text\"]}  ({t[\"file\"]})')
"

Capability 4: Note Creation from Templates

Use the Obsidian CLI to create notes from vault templates with Templater variables properly resolved:

# List available templates
obsidian templates

# Read a template with all variables resolved
obsidian template:read file="TEMPLATES/Meeting Template.md" resolve=true

# Create a new note from a template (read resolved, then write)
CONTENT=$(obsidian template:read file="TEMPLATES/Meeting Template.md" resolve=true)
obsidian create file="MEETINGS/2026/03-March/2026-03-23-New Meeting.md" \
  content="$CONTENT" open=true

Workflow: Find Vault Connections for a New Note

This is the recommended pattern for any skill that needs to surface related vault notes (e.g., youtube-summarizer, book notes):

# 1. Try Dataview first (richest results)
DATAVIEW_AVAILABLE=$(obsidian eval code="return !!app.plugins.plugins['dataview']" 2>/dev/null)

if [ "$DATAVIEW_AVAILABLE" = "true" ]; then
  # Use Dataview API with thematic keywords
  obsidian eval code="
    const dv = app.plugins.plugins['dataview'].api;
    const themes = [];
    return JSON.stringify(dv.pages().where(p => {
      const text = [p.file.name, ...(p.tags||[])].join(' ').toLowerCase();
      return themes.some(t => text.includes(t));
    }).sort(p => p.file.mtime, 'desc').slice(0,15).map(p => p.file.path));
  " 2>/dev/null

elif obsidian version &>/dev/null; then
  # Fall back to obsidian search
  obsidian search query="" format=json limit=20 2>/dev/null

else
  # Final fallback: grep
  grep -rl "" "/BOOKS" "/PROJECTS" \
    "/REFERENCES" --include="*.md" 2>/dev/null | head -20
fi

Error Handling

  • obsidian: command not found: CLI not on PATH. See obsidian-cli skill prerequisites.
  • No vault found: Run from within vault directory or add vault=VaultName.
  • Obsidian is not running: Start Obsidian first; fall back to grep-based search.
  • Dataview not available: The obsidian eval Dataview queries will fail silently; the || grep ... fallback handles this.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.