Metadata-Version: 2.4
Name: mcp-recall-md
Version: 0.2.0
Summary: Local semantic search for markdown notes — MCP server
Author-email: Artem Kalikin <artem@kalikin.org>
License-Expression: MIT
License-File: LICENSE
Keywords: chromadb,knowledge-base,markdown,mcp,obsidian,semantic-search
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Text Processing :: Indexing
Requires-Python: >=3.12
Requires-Dist: chromadb
Requires-Dist: fastmcp>=2.0
Requires-Dist: pathspec
Requires-Dist: watchdog
Description-Content-Type: text/markdown

<h1 align="center">mcp-recall-md</h1>

<p align="center">
  Local semantic search for your markdown notes — via <a href="https://modelcontextprotocol.io/">MCP</a><br>
  Search by meaning, not keywords. 100% offline.
</p>

<p align="center">
  <a href="#install">Install</a>&nbsp;&nbsp;·&nbsp;&nbsp;
  <a href="#tools">Tools</a>&nbsp;&nbsp;·&nbsp;&nbsp;
  <a href="#auto-indexing">Auto-indexing</a>&nbsp;&nbsp;·&nbsp;&nbsp;
  <a href="#recallignore">.recallignore</a>&nbsp;&nbsp;·&nbsp;&nbsp;
  <a href="#troubleshooting">Troubleshooting</a>
</p>

---

## Install

### Option A: Python users

```bash
pip install mcp-recall-md
```

Add to your MCP config (`.mcp.json` for Claude Code, `claude_desktop_config.json` for Claude Desktop):

```json
{
  "mcpServers": {
    "mcp-recall-md": {
      "command": "mcp-recall-md",
      "args": ["--vaults", "C:/Users/you/notes"]
    }
  }
}
```

### Option B: Download exe (no Python needed)

1. Download **mcp-recall-md.exe** from the [latest release](https://github.com/kalikin-artem/mcp-recall-md/releases)
2. Put it in a permanent folder (e.g. `C:\Tools\mcp-recall-md\`)
3. Add to MCP config:

```json
{
  "mcpServers": {
    "mcp-recall-md": {
      "command": "C:/Tools/mcp-recall-md/mcp-recall-md.exe",
      "args": ["--vaults", "C:/Users/you/notes"]
    }
  }
}
```

Multiple vaults? Just list them:

```json
"args": ["--vaults", "C:/notes/work", "C:/notes/personal", "C:/docs"]
```

Restart your app. Start asking:

> *"Search my knowledge base for Kubernetes networking"*
>
> *"Find my notes about AWS Bedrock"*

---

## Tools

| Tool | Parameters | What it does |
|------|-----------|-------------|
| `index` | `key`, `content` | Store or update an article |
| `search` | `query`, `limit` | Semantic similarity search |
| `remove` | `key` | Delete an article |

---

## Auto-indexing

When `--vaults` is provided, the server automatically:

1. Indexes all existing `.md` files on startup
2. Watches for new and modified files in real time

No separate watcher process needed — it's all one command.

Without `--vaults`, the server runs in manual mode (use the `index` tool to add content).

---

## .recallignore

Drop a `.recallignore` file in any vault root to control which files get indexed. Uses standard `.gitignore` syntax.

**Exclude specific folders:**

```gitignore
.obsidian/
_templates/
drafts/
```

**Include only specific folders** (exclude everything else):

```gitignore
*
!notes/
!docs/
```

Each vault gets its own `.recallignore` — they're independent.

---

## Troubleshooting

| Problem | Fix |
|---------|-----|
| Search returns nothing | Make sure `--vaults` is set, or use the `index` tool manually |
| First run is slow | Embedding model (~80 MB) downloads once |
| Need to debug | Add `--verbose` flag |

---

## License

MIT
