recall-mcp
Enables semantic search over local markdown files, retrieving relevant content by meaning from indexed documents.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@recall-mcpwhat did we decide about the onboarding flow?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
recall-mcp
TL;DR: Local semantic search MCP server over four sources - your markdown docs, Granola meeting transcripts, Wispr Flow transcripts, and your own past Claude Code sessions. Ask Claude "what did we decide about X?" and it finds relevant content by meaning. Runs entirely on your machine - no API keys, no cloud, no cost.
Give Claude Code long-term memory over your notes, meetings, and past conversations with itself. It searches by meaning, runs locally, and costs nothing.
What this is
A Model Context Protocol server that indexes four sources into a local vector database: your markdown files, Granola meeting transcripts, Wispr Flow transcripts, and the dialogue from your own past Claude Code sessions. Claude Code can then search across everything by meaning, not just keywords.
You ask something like "what did we decide about the onboarding flow?" and it surfaces relevant chunks from your docs, meeting recordings, and prior conversations, even if those exact words never appeared.
How it works:
Markdown docs + Granola + Wispr Flow + Claude Code sessions
|
v
Ollama (nomic-embed-text) <- local embedding model, no API key
|
v
ChromaDB <- local vector database on localhost:8000
|
v
7 MCP tools <- Claude Code calls these during conversationsAuto-indexing runs every 15 minutes in the background via a macOS LaunchAgent.
Example
You ask Claude Code: "what did we decide about the onboarding flow?"
recall-mcp searches your docs and meeting transcripts by meaning and returns the relevant chunks:
Source: meetings/product-sync-2026-03-14.md (similarity: 0.82)
"We agreed to cut the walkthrough video and ship a checklist instead.
Jamie owns the copy, targeting next sprint."
Source: docs/onboarding/decisions.md (similarity: 0.79)
"Checklist approach approved — three steps max, no modal,
inline in the dashboard."Claude uses these results to answer your question with the actual context from your notes and meetings.
Works with
recall-mcp uses the standard MCP stdio transport, so it works with any MCP-compatible client:
Client | Config file |
Claude Code (CLI) |
|
Claude Desktop |
|
Cursor | Cursor settings > MCP |
Windsurf |
|
The MCP config block is the same across all of them. This README uses Claude Code as the example, but the server doesn't care which client connects to it.
Note: Setup requires comfort with the terminal, or the ability to point your AI tool at this repo and ask it to set things up for you. For example, you can paste this README into Claude Code or Claude Desktop and ask it to clone the repo and run the setup script on your behalf.
Related MCP server: doc-index
Sources
recall-mcp indexes four kinds of content. Each is tagged with a sourceType so you can filter a search to just one kind (semantic_search accepts a sourceTypes filter). Every source is optional - if you don't have Granola, Wispr, or Claude Code sessions, doc indexing still works on its own.
Source |
| Where it comes from |
Markdown docs |
| Your |
Granola meetings |
| Granola desktop app's local data |
Wispr Flow meetings |
| Wispr Flow's local transcripts (speaker-attributed). Granola dedups against these. |
Claude Code sessions |
| Your own past conversations in |
Claude Code session capture
This is the source most people won't have seen before, so here's exactly how it works.
Claude Code stores every session as a JSONL file under ~/.claude/projects/<project-slug>/<session-id>.jsonl, one JSON object per line. recall-mcp reads those files and indexes the dialogue only - the actual back-and-forth between you and Claude. Everything else is dropped:
Tool calls and tool results are skipped - they're mostly file dumps already indexed as your docs, and they'd bury the real conversation in noise.
Thinking blocks are skipped.
Subagent sidechains (
isSidechain) are skipped - only the main conversation is kept.Harness noise is stripped from your messages:
<system-reminder>blocks, slash-command wrapper tags, system notifications, interrupt markers, andlocal-command-stdoutare all removed before indexing.
What's left is rendered as a clean User: / Claude: transcript, chunked, embedded, and stored. Each session is titled [project/path] <title>, using the session's custom title, then its AI-generated title, then the first user message as a fallback. Sessions with less than 500 characters of real dialogue are dropped as too thin to be useful.
Indexing is incremental by file mtime - unchanged sessions are skipped, and a changed session has its old chunks replaced wholesale. Sessions that were active in the last hour are deferred so an in-progress conversation isn't re-embedded every cycle; it gets picked up once it goes quiet.
The project-slug directory name (e.g. -Users-tenzin-Strategy-projects-apollo) is converted back to a readable path (Strategy/projects/apollo) for the title, so search results tell you which project a conversation came from.
Prerequisites
macOS (LaunchAgent setup is macOS-specific; the core server works anywhere)
Node.js 18+ -
brew install nodeOllama - ollama.com or
brew install ollamauv (for running ChromaDB) -
brew install uvGranola desktop app - granola.ai - only needed if you want meeting transcript search
Setup
1. Clone and build
git clone https://github.com/thetenzinwoser/recall-mcp.git
cd recall-mcp
npm install
npm run build2. Install the embedding model
brew services start ollama
ollama pull nomic-embed-textFirst pull is ~274MB. After that it's cached.
3. Run setup
./scripts/setup.shThis will:
Ask where your markdown docs live (
DOCS_PATH)Write a
.envfileGenerate LaunchAgent plists from templates and load them
Start ChromaDB and schedule auto-indexing
Run an initial index across all available sources (docs, Granola, Wispr Flow, Claude Code sessions)
Print the MCP config block to paste into Claude Code
4. Add to your MCP client
Add this to your client's MCP config (see the "Works with" table above for file locations):
"recall": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/recall-mcp/dist/server.js"]
}Use the exact path printed at the end of setup.sh. Then restart your client. In Claude Code, run /mcp to confirm it connected.
Tools
Tool | What it does |
| Search all sources by meaning. Accepts |
| Fetch a full meeting transcript. Accepts |
| Re-scan your docs folder. Incremental - only processes changed files. |
| Pull and index new Granola meetings. Accepts |
| Index new Wispr Flow transcripts (speaker-attributed). Additive; also exports them to markdown. |
| Index dialogue from past Claude Code sessions. Additive and incremental; sessions active in the last hour are deferred. |
| Show chunk counts by source type. |
get_transcript details
Title search with date:
{ searchTitle: "team sync March 14" }- extracts the date and fuzzy-matches the titleExplicit date:
{ searchTitle: "team sync", date: "2026-03-14" }- when multiple meetings share a titlePartial ID: First 8 characters of a meeting UUID is enough
List recent:
{ listRecent: 20 }to browse recent meetings with IDs
Configuration
All settings have sensible defaults. The only one most people need is DOCS_PATH.
Copy .env.example to .env and edit:
cp .env.example .envVariable | Default | Purpose |
|
| Folder to scan for markdown files (recursive) |
|
| Ollama endpoint |
|
| Model to use for embeddings |
ChromaDB runs on localhost:8000 by default. This is not configurable without editing the LaunchAgent plist directly.
Granola integration
recall-mcp reads your Granola auth token from the Granola desktop app's local data. No separate API key or login needed - just have Granola installed and signed in.
Auth token location: ~/Library/Application Support/Granola/supabase.json
If you don't use Granola, the doc indexing still works fine. Transcript-related tools will return errors, which Claude handles gracefully.
Manual commands
Reindex now (instead of waiting for the 15-min interval):
cd /path/to/recall-mcp && npx tsx src/scripts/auto-index.tsCheck ChromaDB is running:
curl -s http://localhost:8000/api/v2/heartbeatCheck what's indexed:
# Use the index_status MCP tool, or check logs:
tail -f /path/to/recall-mcp/logs/auto-index.logRebuild after pulling updates:
npm run buildRestart ChromaDB:
launchctl unload ~/Library/LaunchAgents/com.recall.chromadb.plist
launchctl load ~/Library/LaunchAgents/com.recall.chromadb.plistTroubleshooting
semantic_search returns nothing / MCP not connecting
Run
/mcpin Claude Code to check server statusMake sure
dist/server.jsexists (npm run build)Verify the path in
~/.claude.jsonis absolute and correct
ChromaDB not running
curl -s http://localhost:8000/api/v2/heartbeat
# Should return: {"nanosecond heartbeat": ...}If it fails, check logs/chromadb-stderr.log or reload the LaunchAgent.
Ollama errors
ollama list
# nomic-embed-text should appearIf not: ollama pull nomic-embed-text
Granola auth fails
Make sure the Granola desktop app is installed and you're logged in. The token file should exist at ~/Library/Application Support/Granola/supabase.json.
Results feel stale
Force a reindex: npx tsx src/scripts/auto-index.ts. The auto-indexer only picks up file changes and new meetings - if you renamed files or restructured folders, a manual run helps.
Stack
Component | Version | Purpose |
| ^1.27.0 | MCP server framework |
| ^1.10.0 | Vector database client |
| - | Local embeddings, 768 dimensions |
| ^10.0.0 | File scanning |
| ^3.23.8 | Config validation |
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceLocal-first RAG indexing and semantic search MCP server. Enables document retrieval and context-aware queries using local embedding models.314MIT
- AlicenseNot gradedqualityBmaintenanceA local-first semantic search server for documents, supporting PDFs, Office files, and text/markdown, enabling natural language search via the Model Context Protocol (MCP).1MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that exposes local Granola meeting notes, summaries, and transcripts to AI assistants via SQLite-backed search and retrieval.MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that provides semantic memory with search, related-content traversal, and write-back capabilities, all powered by local embeddings of your notes, documents, and chat histories.14MIT
Related MCP Connectors
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Remote ChromaDB vector database MCP server with streamable HTTP transport
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/thetenzinwoser/recall-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server