What this means in practice
This family covers things like:- remembering a new fact or lesson manually
- saving a checkpoint to mark a session milestone
- editing an existing memory to refine or correct it
- archiving or forgetting a memory to clean up
crystal_remember — Save a memory
Create a new memory with semantic embedding, vector storage, and optional Obsidian export.Parameters
Valid enum values from schema
Stores:
Categories:
Returns
Examples
Save a decision:Tagging best practices
- Use lowercase, hyphen-separated tags (e.g.,
backend-architecture, notBackendArchitecture) - Keep tags concise and reusable across memories
- Avoid redundant tags (don’t tag with both
architectureandarchitectural-decision) - Use 2–5 tags per memory for good searchability without noise
- Group related topics under a common tag prefix (e.g.,
convex-*,deploy-*)
When to use vs alternatives
Error handling
How it actually works
Key repo surfaces:mcp-server/src/tools/remember.ts— tool definition and input validationconvex/crystal/memories.ts— memory creation, embedding, and storage logicconvex/crystal/mcp.ts— HTTP endpoint routingmcp-server/src/lib/obsidian.ts— Obsidian vault integration
- Tool validates all input parameters against the schema and enums
- ConvexClient POSTs to
/api/mcp/capture - Backend embeds the content using OpenAI’s
text-embedding-3-small - Memory is stored in the
crystalMemoriestable with vector index - If
OBSIDIAN_VAULT_PATHis set, memory is also exported as markdown - Tool returns the memory ID and Obsidian path (if applicable)
Common mistakes
- Assuming manual
crystal_rememberand automaticcrystal_captureare the same path (they’re not — one is explicit, one is automatic) - Forgetting that checkpoints are a distinct concept from ordinary memories (checkpoints are milestones; memories are facts/lessons)
- Not setting
confidenceandvalence— the defaults are reasonable, but explicit values help the system prioritize - Using vague titles (❌ “decision”) instead of specific ones (✅ “Chose Convex over Supabase”)
- Storing multiple unrelated facts in one memory instead of breaking them into separate memories
Source of truth
Primary files behind this page:mcp-server/src/tools/remember.ts— tool definitionconvex/crystal/memories.ts— backend logicconvex/schema.ts— valid enum valuesconvex/crystal/mcp.tsconvex/crystal/checkpoints.ts
Notes
Shared-mode agent scoping (new in 0.7.15)
When an agent is configured withmode: "shared" in agentScopePolicies, crystal_remember now writes to ${scope}:main-${agentId} so two shared agents under the same scope don’t bleed captures into one bucket. Single-shared-agent installs (the common case) continue to write to ${scope}:main — this change is backward compatible. If you intentionally want captures to merge across shared agents, route them under a single agentId or write to an explicit channel with that effect.