| name | tools-mdbase |
| description | This skill should be used when the user asks to "validate my collection", "query markdown files", "create mdbase type", "mdbase schema", "init mdbase", "mdbase validate", "mdbase query", or mentions mdbase, typed markdown collections, or frontmatter schemas. |
mdbase
Work with mdbase collections: typed, queryable markdown file databases with YAML frontmatter schemas.
Monorepo vault setup
This vault is configured as an mdbase collection:
- Config:
./mdbase.yaml
- Types:
./90-system/_types/
- Schema docs:
./90-system/docs/mdbase-schema.md
Available types
| Namespace | Types |
|---|
| journals-* | journals-daily, journals-weekly, journals-quarterly, journals-yearly |
| zettel-* | zettel-source, zettel-publication, zettel-idea, zettel-fleeting |
| entity-* | entity-person, entity-organization |
| para-* | para-project, para-area, para-resource, para-task |
| misc-* | misc-software, misc-workflow, and any ad-hoc types |
Type matching
All types use global-type field for matching:
global-type: zettel-source
Duck-typing fallback available for migration (e.g., files with source-url + source-title match zettel-source).
CLI usage
Run from monorepo root:
npx mdbase <command> [options]
Create notes
npx mdbase create --type zettel-source
npx mdbase create --type zettel-source \
--source-title "Article Title" \
--source-url "https://example.com" \
--zettel-status drafted
npx mdbase create --type para-task \
--para-status todo \
--para-priority p2
npx mdbase create --type para-project \
--para-status active \
--para-area "[[Career]]"
npx mdbase create --type entity-person \
--entity-name "Jane Doe"
npx mdbase create --type zettel-publication \
--pub-title "Episode Title" \
--pub-type podcast \
--zettel-status drafted
Query notes
npx mdbase query "global-type = para-project AND para-status = active"
npx mdbase query "global-type = zettel-source AND zettel-status = drafted"
npx mdbase query "global-type = para-task AND para-priority = p1"
npx mdbase query "global-type = para-task AND para-due-date < 2026-02-06"
npx mdbase query "source-platform = youtube" --types zettel-source
npx mdbase query "para-status = active" --types para-project --sort para-deadline
npx mdbase query "global-type = zettel-source" --limit 10 --sort "-source-fetched-date"
Validate
npx mdbase validate .
npx mdbase validate 20-zettel/
npx mdbase validate 30-para/
npx mdbase validate 30-para/31-projects/example-project.md
Update notes
npx mdbase update 20-zettel/sources/article.md --set "zettel-status=reviewed"
npx mdbase update 30-para/tasks/my-task.md --set "para-status=completed"
npx mdbase update 30-para/31-projects/project.md --set "para-deadline=2026-03-01"
Read and inspect
npx mdbase read 30-para/31-projects/example-project.md
npx mdbase stats .
npx mdbase links . --format dot > graph.dot
Export and import
npx mdbase export . --type para-project --format csv -o projects.csv
npx mdbase export . --type zettel-source --format json -o sources.json
npx mdbase import tasks.csv --type para-task
Rename with link updates
npx mdbase rename old-name.md new-name.md
Run Obsidian bases
npx mdbase base run 90-system/bases/zettel-sources.base
npx mdbase base run 90-system/bases/para-tasks.base
Adding new types
Quick ad-hoc type
- Use
misc-* prefix in frontmatter:
global-type: misc-recipe
- No schema needed initially - mdbase allows unknown types
Formal type definition
Create 90-system/_types/misc-example.md:
---
name: misc-example
matchFields: [global-type]
fields:
global-type:
type: enum
values: [misc-example]
required: true
custom-field:
type: string
required: false
---
Description of when to use this type.
Common workflows
Process inbox item
ls 00-inbox/
npx mdbase create --type zettel-source --source-title "..." --source-url "..."
npx mdbase create --type para-task --para-status todo
Weekly review queries
npx mdbase query "zettel-status = drafted" --types zettel-source
npx mdbase query "para-status = active" --types para-project
npx mdbase query "para-status = todo" --types para-task --sort para-priority
npx mdbase query "zettel-sources = []" --types zettel-idea
Bulk operations
npx mdbase query "zettel-status = drafted AND source-fetched-date < 2025-01-01" \
--types zettel-source --format paths | \
xargs -I {} npx mdbase update {} --set "zettel-status=archived"
Troubleshooting
Node.js version
mdbase-cli requires Node.js 22+:
node --version
Validation errors
Check:
- Valid YAML frontmatter (between
--- markers)
- Required fields present for the type
- Enum values match allowed values
- Date format is YYYY-MM-DD
Type not matching
- Verify
global-type field value matches type name exactly
- Check
90-system/_types/ for valid type names
- For duck-typing, ensure characteristic fields are present
References