Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ texts/
*.md
!README.md
!CLAUDE.md
!skills/**/*.md
160 changes: 160 additions & 0 deletions skills/qmd/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
---
name: qmd
description: Search personal markdown knowledge bases, notes, meeting transcripts, and documentation using QMD - a local hybrid search engine. Combines BM25 keyword search, vector semantic search, and LLM re-ranking. Use when users ask to search notes, find documents, look up information in their knowledge base, retrieve meeting notes, or search documentation. Triggers on "search my notes", "find in docs", "look up", "what did I write about", "meeting notes about".
license: MIT
compatibility: Requires qmd installed via `bun install -g https://github.com/tobi/qmd`. Works with Claude Code CLI and MCP-compatible agents.
metadata:
author: tobi
version: "1.0"
allowed-tools: Bash(qmd:*)
---

# QMD - Quick Markdown Search

QMD is a local, on-device search engine for markdown content. It indexes your notes, meeting transcripts, documentation, and knowledge bases for fast retrieval.

## When to Use This Skill

- User asks to search their notes, documents, or knowledge base
- User needs to find information in their markdown files
- User wants to retrieve specific documents or search across collections
- User asks "what did I write about X" or "find my notes on Y"
- User needs semantic search (conceptual similarity) not just keyword matching
- User mentions meeting notes, transcripts, or documentation lookup

## Search Commands

Choose the right search mode for the task:

| Command | Use When | Speed |
|---------|----------|-------|
| `qmd search` | Exact keyword matches needed | Fast |
| `qmd vsearch` | Keywords aren't working, need conceptual matches | Medium |
| `qmd query` | Best results needed, speed not critical | Slower |

```sh
# Fast keyword search (BM25)
qmd search "your query"

# Semantic vector search (finds conceptually similar content)
qmd vsearch "your query"

# Hybrid search with re-ranking (best quality)
Copy link

Copilot AI Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent spelling of "reranking". The codebase consistently uses "reranking" without a hyphen (see README.md:29, 69 and src/mcp.ts:360, 367), but this file uses "re-ranking" with a hyphen. For consistency with the rest of the codebase, use "reranking" instead.

Suggested change
# Hybrid search with re-ranking (best quality)
# Hybrid search with reranking (best quality)

Copilot uses AI. Check for mistakes.
qmd query "your query"
```

## Common Options

```sh
-n <num> # Number of results (default: 5)
-c, --collection <name> # Restrict to specific collection
--all # Return all matches
--min-score <num> # Minimum score threshold (0.0-1.0)
--full # Show full document content
--json # JSON output for processing
--files # List files with scores
--line-numbers # Add line numbers to output
```

## Document Retrieval

```sh
# Get document by path
qmd get "collection/path/to/doc.md"

# Get document by docid (shown in search results as #abc123)
qmd get "#abc123"

# Get with line numbers for code review
qmd get "docs/api.md" --line-numbers

# Get multiple documents by glob pattern
qmd multi-get "docs/*.md"

# Get multiple documents by list
qmd multi-get "doc1.md, doc2.md, #abc123"
```

## Index Management

```sh
# Check index status and available collections
qmd status

# List all collections
qmd collection list

# List files in a collection
qmd ls <collection-name>

# Update index (re-scan files for changes)
qmd update
```

## Score Interpretation

| Score | Meaning | Action |
|-------|---------|--------|
| 0.8 - 1.0 | Highly relevant | Show to user |
| 0.5 - 0.8 | Moderately relevant | Include if few results |
| 0.2 - 0.5 | Somewhat relevant | Only if user wants more |
| 0.0 - 0.2 | Low relevance | Usually skip |

## Recommended Workflow

1. **Check what's available**: `qmd status`
2. **Start with keyword search**: `qmd search "topic" -n 10`
3. **Try semantic if needed**: `qmd vsearch "describe the concept"`
4. **Use hybrid for best results**: `qmd query "question" --min-score 0.4`
5. **Retrieve full documents**: `qmd get "#docid" --full`

## Example: Finding Meeting Notes

```sh
# Search for meetings about a topic
qmd search "quarterly review" -c meetings -n 5

# Get semantic matches
qmd vsearch "performance discussion" -c meetings

# Retrieve the full meeting notes
qmd get "#abc123" --full
```

## Example: Research Across All Notes

```sh
# Hybrid search for best results
qmd query "authentication implementation" --min-score 0.3 --json

# Get all relevant files for deeper analysis
qmd query "auth flow" --all --files --min-score 0.4
```

## MCP Server Integration

QMD also works as an MCP server, providing these tools directly:

| MCP Tool | Equivalent CLI | Purpose |
|----------|---------------|---------|
| `qmd_search` | `qmd search` | Fast BM25 keyword search |
| `qmd_vsearch` | `qmd vsearch` | Semantic vector search |
| `qmd_query` | `qmd query` | Hybrid search with reranking |
| `qmd_get` | `qmd get` | Retrieve document by path or docid |
| `qmd_multi_get` | `qmd multi-get` | Retrieve multiple documents |
| `qmd_status` | `qmd status` | Index health and collection info |

To enable MCP tools, add to `~/.claude/settings.json`:

```json
{
"mcpServers": {
"qmd": {
"command": "qmd",
"args": ["mcp"]
}
}
}
```

When MCP is configured, prefer using the `qmd_*` tools directly instead of Bash commands for better integration.
128 changes: 128 additions & 0 deletions skills/qmd/references/MCP-SETUP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# QMD MCP Server Setup

Detailed instructions for configuring QMD as an MCP (Model Context Protocol) server.

## Prerequisites

1. Install qmd globally:
```sh
bun install -g https://github.com/tobi/qmd
```

2. Verify installation:
```sh
qmd --help
```

3. Set up at least one collection:
```sh
qmd collection add ~/Documents/notes --name notes
qmd embed # Generate vector embeddings
```

## Claude Code Configuration

Add to `~/.claude/settings.json`:

```json
{
"mcpServers": {
"qmd": {
"command": "qmd",
"args": ["mcp"]
}
}
}
```

## Claude Desktop Configuration

Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
"mcpServers": {
"qmd": {
"command": "qmd",
"args": ["mcp"]
}
}
}
```

## Available MCP Tools

Once configured, these tools become available:

### qmd_search
Fast BM25 keyword search.

**Parameters:**
- `query` (required): Search query string
- `collection` (optional): Restrict to specific collection
- `limit` (optional): Number of results (default: 5)
- `minScore` (optional): Minimum relevance score

### qmd_vsearch
Semantic vector search for conceptual similarity.

**Parameters:**
- `query` (required): Search query string
- `collection` (optional): Restrict to specific collection
- `limit` (optional): Number of results (default: 5)
- `minScore` (optional): Minimum relevance score
Comment on lines +63 to +73
Copy link

Copilot AI Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The default limit values documented here are inconsistent with the actual MCP implementation. According to src/mcp.ts lines 265, 306, and 370, the default limit for all search tools (qmd_search, qmd_vsearch, qmd_query) is 10, not 5. Update these descriptions to reflect the correct default of 10 results.

Copilot uses AI. Check for mistakes.
Copy link

Copilot AI Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The minScore parameter documentation is incomplete for qmd_vsearch. According to src/mcp.ts:307, qmd_vsearch has a default minScore of 0.3 (not 0), which should be documented. This is an important difference from qmd_search which defaults to 0.

Copilot uses AI. Check for mistakes.

### qmd_query
Hybrid search combining BM25, vector search, and LLM re-ranking.

**Parameters:**
- `query` (required): Search query string
- `collection` (optional): Restrict to specific collection
- `limit` (optional): Number of results (default: 5)
- `minScore` (optional): Minimum relevance score

### qmd_get
Retrieve a document by path or docid.

**Parameters:**
- `path` (required): Document path or docid (e.g., `#abc123`)
- `full` (optional): Return full content (default: true)
Comment on lines +85 to +89
Copy link

Copilot AI Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The parameter documentation for qmd_get is incorrect. According to the MCP implementation (src/mcp.ts:454-458), the parameter name should be file not path, and there is no full parameter. The actual parameters are: file (required), fromLine (optional), maxLines (optional), and lineNumbers (optional). The full parameter appears to be a CLI option but is not available in the MCP tool.

Suggested change
Retrieve a document by path or docid.
**Parameters:**
- `path` (required): Document path or docid (e.g., `#abc123`)
- `full` (optional): Return full content (default: true)
Retrieve a document by file path or docid.
**Parameters:**
- `file` (required): Document path or docid (e.g., `#abc123`)
- `fromLine` (optional): Starting line number (1-based) for partial content
- `maxLines` (optional): Maximum number of lines to return

Copilot uses AI. Check for mistakes.
- `lineNumbers` (optional): Include line numbers

### qmd_multi_get
Retrieve multiple documents.

**Parameters:**
- `pattern` (required): Glob pattern or comma-separated list
- `maxBytes` (optional): Skip files larger than this (default: 10KB)
Copy link

Copilot AI Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The qmd_multi_get parameter documentation is incomplete. According to src/mcp.ts:519-521, qmd_multi_get also supports maxLines (optional) and lineNumbers (optional) parameters in addition to pattern and maxBytes. These should be documented.

Suggested change
- `maxBytes` (optional): Skip files larger than this (default: 10KB)
- `maxBytes` (optional): Skip files larger than this (default: 10KB)
- `maxLines` (optional): Maximum number of lines to return per file
- `lineNumbers` (optional): Include line numbers in returned content

Copilot uses AI. Check for mistakes.

### qmd_status
Get index health and collection information.

**Parameters:** None

## Troubleshooting

### MCP server not starting
- Ensure qmd is in your PATH: `which qmd`
- Try running `qmd mcp` manually to see errors
- Check that Bun is installed: `bun --version`

### No results returned
- Verify collections exist: `qmd collection list`
- Check index status: `qmd status`
- Ensure embeddings are generated: `qmd embed`

### Slow searches
- For faster results, use `qmd_search` instead of `qmd_query`
- The first search may be slow while models load (~3GB)
- Subsequent searches are much faster

## Choosing Between CLI and MCP

| Scenario | Recommendation |
|----------|---------------|
| MCP configured | Use `qmd_*` tools directly |
| No MCP | Use Bash with `qmd` commands |
| Complex pipelines | Bash may be more flexible |
| Simple lookups | MCP tools are cleaner |