mcp-canon
# mcp-canon
Universal MCP knowledge server for LLM agents, powered by local RAG.
Use Canon to provide domain-specific best practices and playbooks across software engineering,
marketing, video editing, and other knowledge areas.
Typical workflows:
- Find the most suitable guide for a task
- Retrieve concise best-practice snippets
- Read full guides for deeper execution context
---
## Quick Start
<details>
<summary><b>Install in Cursor</b></summary>
Go to: `Settings` -> `Cursor Settings` -> `MCP` -> `Add new global MCP server`
Pasting the following configuration into your Cursor `~/.cursor/mcp.json` file is the recommended approach. You may also install in a specific project by creating `.cursor/mcp.json` in your project folder. See [Cursor MCP docs](https://docs.cursor.com/context/model-context-protocol) for more info.
#### Cursor Local Connection
```json
{
"mcpServers": {
"canon": {
"command": "uvx",
"args": ["mcp-canon"]
}
}
}
```
#### Cursor Local Connection With Custom Database
```json
{
"mcpServers": {
"canon": {
"command": "uvx",
"args": ["mcp-canon"],
"env": {
"CANON_DB_PATH": "/path/to/my-db"
}
}
}
}
```
#### Cursor Remote Server Connection
```json
{
"mcpServers": {
"canon": {
"url": "http://localhost:8080/mcp"
}
}
}
```
</details>
<details>
<summary><b>Install in Claude Code</b></summary>
Run this command. See [Claude Code MCP docs](https://code.claude.com/docs/en/mcp) for more info.
#### Claude Code Local Connection
```sh
claude mcp add --scope user canon -- uvx mcp-canon
```
#### Cursor Local Connection With Custom Database
```sh
claude mcp add --scope user -e CANON_DB_PATH=/path/to/my-db canon -- uvx mcp-canon
```
#### Claude Code Remote Server Connection
```sh
claude mcp add --scope user --transport http canon http://localhost:8080/mcp
```
> Remove `--scope user` to install for the current project only.
</details>
<details>
<summary><b>Install in Opencode</b></summary>
Add this to your Opencode configuration file. See [Opencode MCP docs](https://opencode.ai/docs/mcp-servers) for more info.
#### Opencode Local Connection
```json
{
"mcp": {
"canon": {
"type": "local",
"command": ["uvx", "mcp-canon"],
"enabled": true
}
}
}
```
#### Opencode Local Connection With Custom Database
```json
{
"mcp": {
"canon": {
"type": "local",
"command": ["uvx", "mcp-canon"],
"enabled": true,
"environment": {
"CANON_DB_PATH": "/path/to/my-db"
}
}
}
}
```
#### Opencode Remote Server Connection
```json
"mcp": {
"context7": {
"type": "remote",
"url": "http://localhost:8080/mcp",
"enabled": true
}
}
```
</details>
<details>
<summary><b>Install in Gemini CLI</b></summary>
Run this command. See [Gemini CLI MCP docs](https://geminicli.com/docs/tools/mcp-server/) for more
info.
#### Gemini CLI Local Connection
```sh
gemini mcp add --scope user canon uvx mcp-canon
```
#### Gemini CLI Local Connection With Custom Database
```sh
gemini mcp add --scope user -e CANON_DB_PATH=/path/to/my-db canon uvx mcp-canon
```
#### Gemini CLI Remote Server Connection
```sh
gemini mcp add --scope user --transport http canon http://localhost:8080/mcp
```
> Remove `--scope user` to install for the current project only.
</details>
<details>
<summary><b>Install in Google Antigravity</b></summary>
Go to the agent panel and open: `...` -> `MCP Servers` -> `Manage MCP Servers` -> `View raw config`.
Add this to your `mcp_config.json` file. See [Google Antigravity MCP docs](https://antigravity.google/docs/mcp#connecting-custom-mcp-servers) for more info.
#### Google Antigravity Local Connection
```json
{
"mcpServers": {
"canon": {
"command": "uvx",
"args": ["mcp-canon"]
}
}
}
```
#### Google Antigravity Local Connection With Custom Database
```json
{
"mcpServers": {
"canon": {
"command": "uvx",
"args": ["mcp-canon"],
"env": {
"CANON_DB_PATH": "/path/to/my-db"
}
}
}
}
```
</details>
---
## Create and index your own guides
Complete workflow from installation to running with your own domain guides.
### Step 1: Install with indexing support
```bash
pip install "mcp-canon[indexing]"
```
### Step 2: Create library structure
```
my-library/
├── engineering/
│ └── python-fastapi-guide/
│ ├── INDEX.md # Required: metadata
│ └── GUIDE.md # Content
├── marketing/
│ └── launch-playbook/
│ ├── INDEX.md
│ └── GUIDE.md
└── video-editing/
└── shorts-workflow/
└── INDEX.md # Can reference external URL
```
### Step 3: [Create guides](docs/writing-guides.md)
### Step 4: Index your library
```bash
# Index to custom location
canon index --library ./my-library --output /path/to/my-db
# Validate frontmatter before indexing (optional)
canon validate --library ./my-library
```
## Running as HTTP server
For remote access or multi-client scenarios, run Canon as an HTTP server.
This is useful when multiple agents or teams share one cross-domain knowledge base.
### Step 1: Install with HTTP support
```bash
pip install "mcp-canon[http]"
```
### Step 2: Start the server
```bash
# Default port 8080
canon serve
# Custom port and host
canon serve --port 3000 --host 0.0.0.0
# With custom database
CANON_DB_PATH=/path/to/db canon serve --port 8080
```
### Step 3: Configure MCP client
```json
{
"mcpServers": {
"canon": {
"url": "http://localhost:8080/mcp"
}
}
}
```
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `CANON_DB_PATH` | Path to custom database | Bundled DB |
| `CANON_EMBEDDING_MODEL` | Fastembed model name ([supported models](https://qdrant.github.io/fastembed/examples/Supported_Models/)) | `nomic-ai/nomic-embed-text-v1.5-Q` |
| `CANON_EMBEDDING_DIM` | Embedding vector dimensions (must match model) | `768` |
| `CANON_FASTEMBED_THREADS` | ONNX runtime threads for FastEmbed (lower = less RAM, slower) | auto |
| `CANON_FASTEMBED_BATCH_SIZE` | Embedding batch size during indexing (lower = less RAM, slower) | `256` |
| `CANON_FASTEMBED_PARALLEL` | FastEmbed data-parallel workers (`>1` increases RAM usage) | disabled |
| `CANON_LOG_LEVEL` | Log level (DEBUG, INFO, WARNING, ERROR) | INFO |
| `CANON_LOG_JSON` | Output logs in JSON format | false |
> **Note:** Changing `CANON_EMBEDDING_MODEL` or `CANON_EMBEDDING_DIM` requires a full reindex: `canon index --library ./library`
### Change embedding model and dimensions
Internal constants `EMBEDDING_MODEL_NAME` and `EMBEDDING_DIM` are configured via:
- `CANON_EMBEDDING_MODEL`
- `CANON_EMBEDDING_DIM`
Example (using `BAAI/bge-small-en-v1.5`, 384 dims):
```bash
CANON_EMBEDDING_MODEL=BAAI/bge-small-en-v1.5 \
CANON_EMBEDDING_DIM=384 \
canon index --library ./library --output ./my-db
```
Where to find available models:
- FastEmbed supported models: <https://qdrant.github.io/fastembed/examples/Supported_Models/>
- FastEmbed model card and usage notes: <https://qdrant.github.io/fastembed/>
Important:
- `CANON_EMBEDDING_DIM` must match the selected model output size.
- After changing model or dimension, rebuild the index before running search/server commands.
---
## MCP Tools
| Tool | Description |
|------|-------------|
| `search_best_practices` | Semantic search for best practices in any domain (optionally scoped by guide_id) |
| `search_suitable_guides` | Find guides that match a task description across domains |
| `read_full_guide` | Get complete guide content for full context |
---
## CLI Commands
```bash
# Indexing
canon index --library ./library # Index guides from any domain (creates new DB)
canon index --library ./lib --append # Add to existing database
canon validate --library ./library # Validate frontmatter
# Server
canon serve --port 8080 # Start HTTP server (requires [http])
# Info
canon list # List indexed guides
canon info # Show database info
```
---
## License
MIT
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: read_full_guide retrieves full guide content, search_best_practices performs semantic search within guides, and search_suitable_guides finds guides matching a task. No overlap in functionality.
All tools follow a consistent verb_noun snake_case pattern: read_full_guide, search_best_practices, search_suitable_guides. The naming is predictable and clear.
With only 3 tools, the server feels slightly minimal but still covers core operations for a guide and best-practices domain. It's reasonable for a focused server.
Significant gaps exist: there is no tool to list all available guides, and the read_full_guide tool truncates large guides while referencing a missing 'consult_guide_for_task' tool. This creates dead ends for agents.