PluginBench
Skill
Review
Audit score 70

mem-search

thedotmack/claude-mem

Search persistent cross-session memory to find past solutions and work.

What is mem-search?

Queries claude-mem's memory database to retrieve work from previous sessions. Use when users ask about prior solutions, past approaches, or historical context. Follows a layered workflow: search index → filter results → fetch full details → (rarely) retrieve raw tool output.

  • Search memory by query, date range, project, and observation type (bugfix, feature, decision, discovery)
  • Retrieve timeline context around specific results with configurable depth before/after
  • Batch-fetch full observation details (title, narrative, facts, concepts, files) for filtered IDs
  • Access raw tool input/output when summaries are insufficient
  • Filter results by project name and observation type to reduce token usage

How to install mem-search

npx skills add https://github.com/thedotmack/claude-mem --skill mem-search
Prerequisites
  • claude-mem installed and configured
  • MCP server running with memory database access
  • Project name (optional but recommended for filtering)
Claude Code
Cursor
Windsurf
Cline

How to use mem-search

  1. 1.Call search() with your query, optional filters (date range, type, project), and limit to get an index of results with IDs and timestamps
  2. 2.Review the returned table of titles and decide which IDs are relevant
  3. 3.Call timeline() with an anchor ID to see context around interesting results, or skip to step 3 if you have your IDs
  4. 4.Call get_observations() with the filtered list of IDs to fetch full details in one batch request
  5. 5.Only call get_tool_uses() if the observation summaries lack necessary detail (exact diffs, command output, API responses)

Use cases

Good for
  • User asks 'did we already solve this?' — search for prior solutions and fetch relevant observations
  • Retrieve how a specific problem was solved in a previous session
  • Find all bug fixes or feature work from a particular date range
  • Get context around a discovery by viewing surrounding work chronologically
  • Recover exact command output or API responses from past tool calls
Who it's for
  • Developers working across multiple sessions on the same project
  • Teams needing to reference prior solutions and decisions
  • Anyone using claude-mem for persistent work history

mem-search FAQ

When should I use search vs. timeline?

Use search() first to find candidate results by keyword, date, or type. Use timeline() to understand context around a specific result by viewing surrounding work chronologically.

Why batch fetch with get_observations() instead of fetching one at a time?

Batch fetching uses one HTTP request instead of N, and observations are already summarized (~500–1000 tokens each). Raw tool bodies can be thousands of tokens, so filtering before fetching saves 10x tokens.

When do I need get_tool_uses()?

Only when observation summaries omit necessary detail — exact diffs, literal command output, or precise API responses. Start with search → timeline → get_observations; reach for raw tool I/O only if those layers don't answer the question.

Can I search across all projects or must I specify one?

You can search all projects by omitting the project parameter, or filter to a specific project by name.

What observation types can I filter by?

bugfix, feature, decision, discovery, and change. Combine multiple types in obs_type as comma-separated values.

Full instructions (SKILL.md)

Source of truth, from thedotmack/claude-mem.


name: mem-search description: Search claude-mem's persistent cross-session memory database. Use when user asks "did we already solve this?", "how did we do X last time?", or needs work from previous sessions.

Memory Search

Search past work across all sessions. Simple workflow: search -> filter -> fetch -> (rarely) disclose raw tool I/O.

When to Use

Use when users ask about PREVIOUS sessions (not current conversation):

  • "Did we already fix this?"
  • "How did we solve X last time?"
  • "What happened last week?"

Layered Workflow (ALWAYS Follow)

NEVER fetch full details without filtering first. 10x token savings.

Step 1: Search - Get Index with IDs

Use the search MCP tool:

search(query="authentication", limit=20, project="my-project")

Returns: Table with IDs, timestamps, types, titles (~50-100 tokens/result)

| ID | Time | T | Title | Read |
|----|------|---|-------|------|
| #11131 | 3:48 PM | 🟣 | Added JWT authentication | ~75 |
| #10942 | 2:15 PM | 🔴 | Fixed auth token expiration | ~50 |

Parameters:

  • query (string) - Search term
  • limit (number) - Max results, default 20, max 100
  • project (string) - Project name filter
  • type (string, optional) - "observations", "sessions", or "prompts"
  • obs_type (string, optional) - Comma-separated: bugfix, feature, decision, discovery, change
  • dateStart (string, optional) - YYYY-MM-DD or epoch ms
  • dateEnd (string, optional) - YYYY-MM-DD or epoch ms
  • offset (number, optional) - Skip N results
  • orderBy (string, optional) - "date_desc" (default), "date_asc", "relevance"

Step 2: Timeline - Get Context Around Interesting Results

Use the timeline MCP tool:

timeline(anchor=11131, depth_before=3, depth_after=3, project="my-project")

Or find anchor automatically from query:

timeline(query="authentication", depth_before=3, depth_after=3, project="my-project")

Returns: depth_before + 1 + depth_after items in chronological order with observations, sessions, and prompts interleaved around the anchor.

Parameters:

  • anchor (number, optional) - Observation ID to center around
  • query (string, optional) - Find anchor automatically if anchor not provided
  • depth_before (number, optional) - Items before anchor, default 5, max 20
  • depth_after (number, optional) - Items after anchor, default 5, max 20
  • project (string) - Project name filter

Step 3: Fetch - Get Full Details ONLY for Filtered IDs

Review titles from Step 1 and context from Step 2. Pick relevant IDs. Discard the rest.

Use the get_observations MCP tool:

get_observations(ids=[11131, 10942])

ALWAYS use get_observations for 2+ observations - single request vs N requests.

Parameters:

  • ids (array of numbers, required) - Observation IDs to fetch
  • orderBy (string, optional) - "date_desc" (default), "date_asc"
  • limit (number, optional) - Max observations to return
  • project (string, optional) - Project name filter

Returns: Complete observation objects with title, subtitle, narrative, facts, concepts, files (~500-1000 tokens each)

Step 4: Disclose Raw Tool I/O - Only When Step 3 Was Not Enough

Observations are summaries. When the answer needs the literal bytes a tool returned — the exact diff, the exact command output, the exact API response — use the get_tool_uses MCP tool:

get_tool_uses(ids=["toolu_01ABC..."], project="my-project")

Do not start here. Raw tool bodies are unsummarized and can run to thousands of tokens each; that is the whole reason claude-mem compresses them into observations in the first place. Reach for this layer only after search / timeline / get_observations pointed you at specific tool calls.

Parameters:

  • ids (array, required) - Numeric tool_uses ids OR opaque tool_use_id strings
  • limit (number, optional) - Max rows to return
  • project (string, optional) - Project name filter
  • contentSessionId (string, optional) - Restrict to one session

Returns: The stored tool_input / tool_response for those calls, plus the tool name, session ids, and the observation each was folded into. Payloads over 64 KB were truncated on write and carry a …[truncated: N bytes] marker.

Examples

Find recent bug fixes:

search(query="bug", type="observations", obs_type="bugfix", limit=20, project="my-project")

Find what happened last week:

search(type="observations", dateStart="2025-11-11", limit=20, project="my-project")

Understand context around a discovery:

timeline(anchor=11131, depth_before=5, depth_after=5, project="my-project")

Batch fetch details:

get_observations(ids=[11131, 10942, 10855], orderBy="date_desc")

Recover the exact output of a command we ran last week:

search(query="migration failed", limit=20, project="my-project")
get_observations(ids=[11131])            # read the summary first
get_tool_uses(ids=["toolu_01ABC..."])    # only if the summary omitted the detail

Why This Workflow?

  • Search index: ~50-100 tokens per result
  • Full observation: ~500-1000 tokens each
  • Raw tool body: up to 64 KB each — the layer you skip 95% of the time
  • Batch fetch: 1 HTTP request vs N individual requests
  • 10x token savings by filtering before fetching

Knowledge Agents

Want synthesized answers instead of raw records? Use /knowledge-agent to build a queryable corpus from your observation history. The knowledge agent reads all matching observations and answers questions conversationally.