npm package: @gogogadgetbytes/smart-connections-mcp
Description: Secure, minimal MCP server for Smart Connections semantic search
Author: gogogadgetbytes
Latest version: 0.2.0

# Smart Connections MCP Server

[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
[![Node.js Version](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](package.json)

A security-first MCP server for Smart Connections. Read-only. Path-validated. Auditable.

Exposes [Smart Connections](https://github.com/brianpetro/obsidian-smart-connections) embeddings to Claude Code and other [MCP](https://modelcontextprotocol.io/) clients for semantic search of your Obsidian vault.

## Why This Exists

We needed semantic search of our Obsidian vault from Claude Code. Existing options have problems:

- **No path validation** - User input passed directly to file operations
- **Write access** - Some expose mutation tools we don't need
- **Heavy dependencies** - PyTorch/transformers for what's essentially vector math

This implementation:
- **Minimal dependencies** - MCP SDK + Transformers.js (for text search)
- **Fail-closed security** - path validation with realpath, symlink detection
- **Auditable** - small TypeScript codebase you can actually read

## Features

- **Text search** - query with plain text, not just note paths
- **Semantic search** using Smart Connections embeddings
- **Local inference** - uses Transformers.js (same model as Smart Connections)
- **Read-only** - no write operations, no shell execution
- **Secure** - strict path validation, bounded responses
- **Offline** - works without Obsidian running

## Security Model

| Property | Guarantee |
|----------|-----------|
| Path confinement | All file access validated against vault root |
| No traversal | `../` and symlink attacks blocked |
| Read-only | No write operations exposed |
| Bounded responses | Capped results (50), content length (10KB) |
| Fail closed | Errors deny access, never bypass |
| Audit logging | Security events logged with context |

## Installation

### Prerequisites

- Node.js 18+
- Obsidian with [Smart Connections](https://github.com/brianpetro/obsidian-smart-connections) plugin installed
- Embeddings built (open vault in Obsidian, let Smart Connections index)

### Setup

```bash
git clone https://github.com/gogogadgetbytes/smart-connections-mcp
cd smart-connections-mcp
npm install
npm run build
```

### Configure Claude Code

Add to your Claude Code config:

```bash
claude mcp add smart-connections \
  -e VAULT_PATH="/path/to/your/obsidian/vault" \
  -- node /path/to/smart-connections-mcp/dist/index.js
```

Or manually add to `~/.claude.json`:

```json
{
  "mcpServers": {
    "smart-connections": {
      "command": "node",
      "args": ["/path/to/smart-connections-mcp/dist/index.js"],
      "env": {
        "VAULT_PATH": "/path/to/your/obsidian/vault"
      }
    }
  }
}
```

Restart Claude Code to load the server.

## Usage

Once configured, Claude Code can use these tools:

### Search by Text

```
"Search my vault for notes about backup strategies"
→ Uses search_by_text tool
```

### Search Similar Notes

```
"Find notes similar to Topics/Claude_Code.md"
→ Uses search_similar tool
```

### Get Note Content

```
"Show me the content of Topics/Obsidian.md"
→ Uses get_note tool
```

### List Indexed Notes

```
"What notes are indexed in my vault?"
→ Uses list_indexed tool
```

## Tools

| Tool | Description |
|------|-------------|
| `search_by_text` | Search using freeform text (computes embedding locally) |
| `search_similar` | Find notes semantically similar to a given note |
| `search_by_embedding` | Search using a raw embedding vector |
| `get_note` | Get content of a specific note (path validated) |
| `get_model_info` | Get embedding model configuration |
| `list_indexed` | List all indexed notes |

## Configuration

| Variable | Required | Description |
|----------|----------|-------------|
| `VAULT_PATH` | Yes | Absolute path to Obsidian vault |

## Limitations

- **Single vault** - Configure one vault per MCP server instance
- **Index from Smart Connections** - Note embeddings come from the plugin; text queries are embedded locally
- **No write access** - By design; use Obsidian for edits
- **First run downloads model** - ~50MB model cached in `~/.cache/huggingface/`

## Development

```bash
# Build
npm run build

# Test with MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.js
```

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md). Security-focused PRs welcome.

## Security

To report security vulnerabilities, please email gogogadgetcode@proton.me. Do not open public issues for security concerns.

## License

MIT - see [LICENSE](LICENSE)

## Credits

- [Smart Connections](https://github.com/brianpetro/obsidian-smart-connections) by Brian Petro
- [Model Context Protocol](https://modelcontextprotocol.io/) by Anthropic