
memory-metadata-search
Search Basic Memory notes by custom frontmatter fields with equality, range, array, and nested filters. Use when finding notes by status, priority, confidence, or any YAML field, not free text.
- Installs
- 1.2K
- Last 24h
- +11
- Trending rank
- #8426
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/basicmachines-co/basic-memory --skill memory-metadata-search- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads memory-metadata-search automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Memory Metadata Search
Find notes by their structured frontmatter fields instead of (or in addition to) free-text content. Any custom YAML key in a note's frontmatter beyond the standard set (title, type, tags, permalink, schema) is automatically indexed as entity_metadata and becomes queryable.
When to Use
- Filtering by status or priority — find all notes with
status: draftorpriority: high - Querying custom fields — any frontmatter key you invent is searchable
- Range queries — find notes with
confidence > 0.7orscore between 0.3 and 0.8 - Combining text + metadata — narrow a text search with structured constraints
- Tag-based filtering — find notes tagged with specific frontmatter tags
- Schema-aware queries — filter by nested schema fields using dot notation
The Tool
Use bm_search for ranked results or bm_find for file discovery with selected fields. Pass frontmatter conditions via filters, including tags and status. Omit query (or pass None) for filter-only searches.
Filter Syntax
Filters are a JSON dictionary. Each key targets a frontmatter field; the value specifies the match condition. Multiple keys combine with AND logic.
Equality
{"status": "active"}
Array Contains (all listed values must be present)
{"tags": ["security", "oauth"]}
$in (match any value in list)
{"priority": {"$in": ["high", "critical"]}}
Comparisons ($gt, $gte, $lt, $lte)
{"confidence": {"$gt": 0.7}}
Numeric values use numeric comparison; strings use lexicographic comparison.
$between (inclusive range)
{"score": {"$between": [0.3, 0.8]}}
Null (field missing or explicitly null)
{"owner": null}
Matches notes with no owner key and notes whose owner is explicitly null.
Null works only as a plain equality value — inside $in, $between, an
array-contains list, or a comparison it is rejected, because those compare
against the value and a comparison with null is never true.
Nested Access (dot notation)
{"schema.version": "2"}
Quick Reference
| Operator | Syntax | Example |
|---|---|---|
| Equality | {"field": "value"} | {"status": "active"} |
| Is null | {"field": null} | {"owner": null} |
| Array contains | {"field": ["a", "b"]} | {"tags": ["security", "oauth"]} |
$in | {"field": {"$in": [...]}} | {"priority": {"$in": ["high", "critical"]}} |
$gt / $gte | {"field": {"$gt": N}} | {"confidence": {"$gt": 0.7}} |
$lt / $lte | {"field": {"$lt": N}} | {"score": {"$lt": 0.5}} |
$between | {"field": {"$between": [lo, hi]}} | {"score": {"$between": [0.3, 0.8]}} |
$contains | {"field": {"$contains": value}} | {"tags": {"$contains": "security"}} |
$exists | {"field": {"$exists": true}} | {"owner": {"$exists": false}} |
| Nested | {"a.b": "value"} | {"schema.version": "2"} |
Rules:
- Keys must match
[A-Za-z0-9_-]+(dots separate nesting levels) - Several operators on one field AND together:
{"started": {"$gte": "2026-01-01", "$lt": "2026-02-01"}} $inand array-contains require non-empty lists$betweenrequires exactly[min, max]nullis an is-null match and only valid as a plain equality value- Comparison and
$betweenbounds must be finite numbers — a magnitude no float can hold (a 400-digit integer, which JSON keeps as an ordinaryint) is refused rather than compared against an infinite bound - Metadata filters match Markdown notes only — indexed PDFs, images and other
regular files carry no frontmatter and are never hits, not even for
null
The leading
$is optional (gteworks), but write it for clarity.
Frontmatter fields say when a note was filed or reviewed. To ask what a note
claims was true on a date, use observation qualifiers (see memory-notes)
and bm_search(valid_at="2026-07-01") or
bm_search(valid_overlaps="[2026-07-01,2026-08-01)").
Using bm_search with Metadata
Pass filters to bm_search. Omit query for filter-only searches, or combine text and filters together.
# Filter-only — find all notes with a given status
bm_search(filters={"status": "in-progress"})
# Filter-only — high-priority specs in a specific project
bm_search(
filters={"type": "spec", "priority": {"$in": ["high", "critical"]}},
project="research",
page_size=10,
)
# Filter-only — notes with confidence above a threshold
bm_search(filters={"confidence": {"$gt": 0.7}})
# Tags and status use the same filter syntax
bm_search(filters={"status": "active"})
bm_search(filters={"tags": ["security", "oauth"]})
# Text search narrowed by metadata
bm_search("authentication", filters={"status": "draft"})
# Mix text, tags, and an advanced filter
bm_search(
"oauth flow",
filters={"tags": ["security"], "confidence": {"$gt": 0.7}},
)
Use one filters object for all frontmatter conditions; its keys combine with AND.
Tag Search Shorthand
The tag: prefix in a query converts to a tag filter automatically:
# These are equivalent:
bm_search("tag:tier1")
bm_search(filters={"tags": ["tier1"]})
# Multiple tags (comma or space separated) — all must match:
bm_search("tag:tier1,alpha")
Example: Custom Frontmatter in Practice
A note with custom fields:
---
title: Auth Design
type: spec
tags: [security, oauth]
status: in-progress
priority: high
confidence: 0.85
---
# Auth Design
## Observations
- [decision] Use OAuth 2.1 with PKCE for all client types #security
- [requirement] Token refresh must be transparent to the user
## Relations
- implements [[Security Requirements]]
Queries that find it:
# By status and type
bm_search(filters={"status": "in-progress", "type": "spec"})
# By numeric threshold
bm_search(filters={"confidence": {"$gt": 0.7}})
# By priority set
bm_search(filters={"priority": {"$in": ["high", "critical"]}})
# By tag shorthand
bm_search("tag:security")
# Combined text + metadata
bm_search("OAuth", filters={"status": "in-progress"})
Guidelines
- Use metadata search for structured queries. If you're looking for notes by a known field value (status, priority, type), metadata filters are more precise than text search.
- Use text search for content queries. If you're looking for notes about something, text search is better. Combine both when you need precision.
- Custom fields are free. Any YAML key you put in frontmatter becomes queryable — no schema or configuration required.
- Multiple filters are AND.
{"status": "active", "priority": "high"}requires both conditions. - Omit
queryfor filter-only searches.bm_search(filters={"status": "active"})works without a text query. - Dot notation for nesting. Access nested YAML structures with dots:
{"schema.version": "2"}queries theversionkey inside aschemaobject. - Use the same filters for file discovery.
bm_find(filters={"status": "active"}, fields=["title", "priority"])returns selected frontmatter values without reading each note.
FAQ
What does the memory-metadata-search skill do?
Search Basic Memory notes by custom frontmatter fields with equality, range, array, and nested filters. Use when finding notes by status, priority, confidence, or any YAML field, not free text.
How do I install memory-metadata-search?
Run npx skills add https://github.com/basicmachines-co/basic-memory --skill memory-metadata-search in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/memory-metadata-search/ (personal) or .claude/skills/memory-metadata-search/ (project).
Which AI agents can use memory-metadata-search?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is memory-metadata-search safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains memory-metadata-search?
It is published by basicmachines-co in basicmachines-co/basic-memory. It has 1,237 recorded installs.
More from basicmachines-co/basic-memory
memory-notes
basicmachines-co/basic-memory
How to write well-structured Basic Memory notes: frontmatter, categorized observations, wiki-link relations, and knowledge-graph best practices. Use when creating or improving notes.
memory-continue
basicmachines-co/basic-memory
Resume prior work by rebuilding context from the Basic Memory graph via memory:// URLs, recent activity, and search. Use at session start or on 'continue with...', 'back to...', 'where were we?'
memory-capture
basicmachines-co/basic-memory
Capture a working thread's current state into one coherent Basic Memory note; on re-capture, rewrite it in place. Use mid- or end-of-thread when decisions, insights, or context are worth keeping.
memory-curate
basicmachines-co/basic-memory
Curate the Basic Memory graph: link orphan notes, propose typed relations, merge duplicates, audit tags and folders, build hub notes. Use to organize and connect a knowledge base as notes accumulate.
memory-reflect
basicmachines-co/basic-memory
Sleep-time reflection: review recent Basic Memory activity and fold lasting decisions, lessons, and facts into the notes they belong in. Run 1-2x daily, on a heartbeat, or when asked.
memory-schema
basicmachines-co/basic-memory
Manage Basic Memory schemas: find unschemaed notes, infer and edit schemas, validate notes, detect drift. Use when structured note types (Task, Person, Meeting) need consistency across the graph.
Popular docs & writing skills
grill-with-docs
mattpocock/skills
A relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.
lark-markdown
open.feishu.cn
飞书 Markdown:查看、创建、上传、编辑和比较飞书中的原生 Markdown 文件。当用户要操作飞书 Markdown 文件,或比较其远端版本及本地草稿时使用。纯本地 Markdown 文件操作不触发本 skill。不负责将 Markdown 导入为飞书在线文档,也不负责文件搜索、权限、评论、移动、删除等云空间管理操作。
writing-beats
mattpocock/skills
Writing, exploit; assemble raw material into a journey of beats, grounding each term before a beat leans on it.
writing-shape
mattpocock/skills
Writing, exploit: shape raw material into an article, paragraph by paragraph.
writing-fragments
mattpocock/skills
Writing, explore: mine raw fragments, no structure yet.
writing-for-agents
mattpocock/skills
Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.