Skip to main content
Glama
bookbran

Smart Connections MCP Server

by bookbran

Smart Connections MCP Server

A Model Context Protocol (MCP) server that provides semantic search and knowledge graph capabilities for Obsidian vaults using Smart Connections embeddings.

Fork note: this is a fork maintained by A Portland Career for its second-brain pilot kit, based on the original smart-connections-mcp by Daniel Glickman (MIT). It adds true semantic search_notes (embeds the query with the vault's model instead of literal keyword matching); see "Query embedding" below. Original copyright and MIT license preserved in LICENSE.

Overview

This MCP server allows Claude (and other MCP clients) to:

  • Search semantically through your Obsidian notes using pre-computed embeddings

  • Find similar notes based on content similarity

  • Build connection graphs showing how notes are related

  • Query by embedding vectors for advanced use cases

  • Access note content with block-level granularity

Related MCP server: Smart Connections MCP Server

Features

Uses the embeddings generated by Obsidian's Smart Connections plugin to perform fast, accurate semantic searches across your entire vault.

πŸ•ΈοΈ Connection Graphs

Builds multi-level connection graphs showing how notes are related through semantic similarity, helping discover hidden relationships in your knowledge base.

πŸ“Š Vector Similarity

Direct access to embedding-based similarity calculations using cosine similarity on 384-dimensional vectors (TaylorAI/bge-micro-v2 model).

πŸ“ Content Access

Retrieve full note content or specific sections/blocks with intelligent extraction based on Smart Connections block mappings.

Installation

Prerequisites

  • Node.js 18 or higher

  • An Obsidian vault with Smart Connections plugin installed and embeddings generated

  • Claude Desktop (or another MCP client)

Setup

  1. Clone the repository:

    git clone https://github.com/bookbran/smart-connections-mcp.git
    cd smart-connections-mcp
  2. Install dependencies:

    npm install
  3. Build the TypeScript project:

    npm run build
  4. Configure Claude Desktop:

    Edit your Claude Desktop configuration file:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

    Add the following to the mcpServers section:

    {
      "mcpServers": {
        "smart-connections": {
          "command": "node",
          "args": [
            "/ABSOLUTE/PATH/TO/smart-connections-mcp/dist/index.js"
          ],
          "env": {
            "SMART_VAULT_PATH": "/ABSOLUTE/PATH/TO/YOUR/OBSIDIAN/VAULT"
          }
        }
      }
    }

    Important: Replace the paths with your actual paths:

    • Update the args path to point to your built index.js file

    • Update SMART_VAULT_PATH to your Obsidian vault path

  5. Restart Claude Desktop

    The MCP server will automatically start when Claude Desktop launches.

Available Tools

1. get_similar_notes

Find notes semantically similar to a given note.

Parameters:

  • note_path (string, required): Path to the note (e.g., "Note.md" or "Folder/Note.md")

  • threshold (number, optional): Similarity threshold 0-1, default 0.5

  • limit (number, optional): Maximum results, default 10

Example:

{
  "note_path": "MyNote.md",
  "threshold": 0.7,
  "limit": 5
}

Returns:

[
  {
    "path": "RelatedNote.md",
    "similarity": 0.85,
    "blocks": ["#Overview", "#Key Points", "#Details"]
  }
]

2. get_connection_graph

Build a multi-level connection graph showing how notes are semantically connected.

Parameters:

  • note_path (string, required): Starting note path

  • depth (number, optional): Graph depth (levels), default 2

  • threshold (number, optional): Similarity threshold 0-1, default 0.6

  • max_per_level (number, optional): Max connections per level, default 5

Example:

{
  "note_path": "MyNote.md",
  "depth": 2,
  "threshold": 0.7
}

Returns:

{
  "path": "MyNote.md",
  "depth": 0,
  "similarity": 1.0,
  "connections": [
    {
      "path": "RelatedNote.md",
      "depth": 1,
      "similarity": 0.82,
      "connections": [...]
    }
  ]
}

3. search_notes

Semantic search by text query. Embeds the query with the same model used for the vault's note embeddings (bge-micro-v2) and ranks notes by cosine similarity, so it matches by meaning rather than exact words. Falls back to a multi-term keyword search if the embedding model can't be loaded (e.g. fully offline before the model has ever been cached).

First-query note: the query-embedding model is downloaded from the Hugging Face hub on the first search_notes call of a server session (needs network once, ~30s), then cached under node_modules/@huggingface/transformers/.cache so every later call is offline and fast (~4ms). See "Query embedding" under Technical Details.

Parameters:

  • query (string, required): Search query text

  • limit (number, optional): Maximum results, default 10

  • threshold (number, optional): Similarity threshold 0-1, default 0.4 (typical relevant matches score ~0.4-0.75; lower to widen recall)

Example:

{
  "query": "project management",
  "limit": 5
}

4. get_embedding_neighbors

Find nearest neighbors for a given embedding vector (advanced use).

Parameters:

  • embedding_vector (number[], required): 384-dimensional vector

  • k (number, optional): Number of neighbors, default 10

  • threshold (number, optional): Similarity threshold 0-1, default 0.5

5. get_note_content

Retrieve full note content with optional block extraction.

Parameters:

  • note_path (string, required): Path to the note

  • include_blocks (string[], optional): Specific block headings to extract

Example:

{
  "note_path": "MyNote.md",
  "include_blocks": ["#Introduction", "#Main Points"]
}

Returns:

{
  "content": "# Full note content...",
  "blocks": {
    "#Introduction": "Content of this section...",
    "#Main Points": "Content of this section..."
  }
}

6. get_stats

Get statistics about the knowledge base.

Parameters: None

Returns:

{
  "totalNotes": 137,
  "totalBlocks": 1842,
  "embeddingDimension": 384,
  "modelKey": "TaylorAI/bge-micro-v2"
}

Usage Examples

Once configured, you can ask Claude to use these tools naturally:

  • "Find notes similar to my project planning document"

  • "Show me a connection graph starting from my main research note"

  • "Search my notes for information about [your topic]"

  • "What's in my note about [topic]?"

  • "Give me stats about my knowledge base"

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      Claude Desktop                         β”‚
β”‚                    (MCP Client)                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ MCP Protocol (stdio)
                          β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Smart Connections MCP Server                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  index.ts (MCP Server + Tool Handlers)             β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                   β”‚                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  search-engine.ts (Semantic Search Logic)          β”‚   β”‚
β”‚  β”‚  - getSimilarNotes()                               β”‚   β”‚
β”‚  β”‚  - getConnectionGraph()                            β”‚   β”‚
β”‚  β”‚  - searchByQuery()                                 β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                   β”‚                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  smart-connections-loader.ts (Data Access)         β”‚   β”‚
β”‚  β”‚  - Load .smart-env/smart_env.json                  β”‚   β”‚
β”‚  β”‚  - Load .smart-env/multi/*.ajson embeddings        β”‚   β”‚
β”‚  β”‚  - Read note content from vault                    β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                   β”‚                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  embedding-utils.ts (Vector Math)                  β”‚   β”‚
β”‚  β”‚  - cosineSimilarity()                              β”‚   β”‚
β”‚  β”‚  - findNearestNeighbors()                          β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ File System Access
                          β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚            Obsidian Vault + .smart-env/                     β”‚
β”‚  - smart_env.json (config)                                  β”‚
β”‚  - multi/*.ajson (embeddings for 137 notes)                 β”‚
β”‚  - *.md (markdown note files)                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Technical Details

Embedding Model

  • Model: TaylorAI/bge-micro-v2

  • Dimensions: 384

  • Similarity Metric: Cosine similarity

Query embedding (search_notes)

get_similar_notes / get_connection_graph compare notes against each other using the vectors Smart Connections already stored, so they need no model at runtime. search_notes is different: it must turn an arbitrary text query into a vector to compare against those stored vectors. It does this with @huggingface/transformers (transformers.js), loading the same model the vault is configured for (read from smart_env.json, e.g. TaylorAI/bge-micro-v2) so the query and note vectors live in the same space.

  • The model repo is tried in order: the vault's configured model_key, then SC_EMBED_MODEL (env override), then TaylorAI/bge-micro-v2, then Xenova/bge-micro-v2.

  • ONNX weights download from the Hugging Face hub on first use and are cached under node_modules/@huggingface/transformers/.cache. First search_notes call: ~30s; subsequent calls: ~4ms, offline.

  • If no model can be loaded (offline with an empty cache), search_notes transparently falls back to a multi-term keyword search so it still returns useful results.

  • Override the model with the SC_EMBED_MODEL env var if your vault uses a different embedding model. It must be a bge-micro-v2-family model, or the query vectors won't match the stored note vectors.

Data Format

The server reads from Obsidian's Smart Connections .smart-env/ directory:

  • smart_env.json: Configuration and model settings

  • multi/*.ajson: Per-note embeddings and block mappings

Performance

  • Load time: ~2-5 seconds for 137 notes

  • Search: Near-instant (<50ms) using pre-computed embeddings

  • Memory: ~20-30MB for embeddings + note index

Development

Build

npm run build

Watch Mode

npm run watch

Run Locally

export SMART_VAULT_PATH="/path/to/your/vault"
npm run dev

Project Structure

smart-connections-mcp/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ index.ts                    # MCP server & tool handlers
β”‚   β”œβ”€β”€ search-engine.ts            # Semantic search logic
β”‚   β”œβ”€β”€ smart-connections-loader.ts # Data loading
β”‚   β”œβ”€β”€ embedding-utils.ts          # Vector math utilities
β”‚   └── types.ts                    # TypeScript type definitions
β”œβ”€β”€ dist/                           # Compiled JavaScript (generated)
β”œβ”€β”€ package.json
β”œβ”€β”€ tsconfig.json
└── README.md

Troubleshooting

"Smart Connections directory not found"

  • Ensure your vault has the Smart Connections plugin installed

  • Verify embeddings have been generated (check .smart-env/multi/ directory)

  • Check that SMART_VAULT_PATH points to the correct vault

"Configuration file not found"

  • Run Smart Connections in Obsidian at least once to generate configuration

  • Check for .smart-env/smart_env.json in your vault

"No embeddings found for note"

  • Some notes may not have embeddings if they're too short (< 200 chars)

  • Re-run Smart Connections embedding generation in Obsidian

Server not appearing in Claude Desktop

  • Verify the configuration file syntax (JSON must be valid)

  • Check the file paths are absolute paths, not relative

  • Restart Claude Desktop completely

  • Check Claude Desktop logs for error messages

License

MIT

Author

Acknowledgments

Available Tools

10 tools
check_search_healthA

Positive control for retrieval. Asks the index for notes that are known to be there, by their own titles, and reports whether they come back. Use this at session start, before trusting any empty search result, and any time a vault has been quiet or moved between machines. Returns alive (false means every empty result from this server is untrustworthy), verdict (a plain-language line written to be read aloud), mode, coverage, and the individual probes. A retrieval tool that can return nothing must be able to prove it can still see.

ParametersJSON Schema
NameRequiredDescriptionDefault
canary_pathNoOptional vault-relative path to a known note to probe for specifically, in addition to the automatic sample.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it explains the return values and the meaning of 'alive' (false means every empty result is untrustworthy). It also adds context about the tool's role as a proof-of-retrieval, but doesn't cover potential failure modes or edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and each sentence adds value (what it does, when to use, what it returns, and a closing rationale). Slightly longer than necessary but efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional param, no output schema), the description is complete: it explains the return structure, the meaning of key fields, and usage timing. It fully supports an agent in understanding when and why to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single optional parameter, which already has a clear description. The tool description adds no extra parameter semantics, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool is a 'positive control for retrieval' and explains that it asks the index for known notes by title to verify they return. This uniquely distinguishes it from siblings like search_notes or check_vault_integrity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is provided: 'Use this at session start, before trusting any empty search result, and any time a vault has been quiet or moved between machines.' However, it does not mention when not to use it or name alternative tools, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_vault_integrityA

Find wikilinks that point at notes which do not exist. Git proves two machines agree on what is COMMITTED; it is silent about a note written outside the vault folder or written on another machine and never committed, and both fail the same silent way, as a link that resolves to nothing. Results are ranked by how many DISTINCT notes reference each missing target, because one note pointing at an unwritten note is an ordinary forward reference while six pointing at the same target means the vault treats it as real and it is either a concept that never got a home note or a note this machine cannot see. Run at session start alongside check_search_health.

ParametersJSON Schema
NameRequiredDescriptionDefault
min_referencesNoHow many distinct referencing notes before a missing target counts as load-bearing. Default 3.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains that the tool returns missing targets ranked by 'how many DISTINCT notes reference each missing target,' which is a behavioral trait beyond what the parameter schema provides. It also gives interpretive guidance (e.g., 'one note pointing at an unwritten note is an ordinary forward reference'), which helps set expectations. However, it doesn't disclose the return format or pagination, so I deduct a point for missing that behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense paragraph but is packed with information: purpose, context, ranking logic, and usage timing. It's not overly verbose, but it could be broken into shorter sentences for readability. Still, every sentence earns its place; no fluff. Content-wise it's efficient, but structure could improve.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (a vault integrity check with ranking), the description is fairly complete. It explains the why (git's limitation), the how (ranking by references), and when (session start). With no output schema, it doesn't describe return structure, but the ranking logic is enough for an agent to understand the tool's purpose. A slightly missing piece is the exact output format, but the description provides adequate context for confident use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the parameter min_references is described in the schema ('How many distinct referencing notes before a missing target counts as load-bearing. Default 3.'). The description adds context about the significance of the parameter by explaining the ranking concept, which goes beyond the schema. The baseline is 3, and the description's added context on the parameter's meaning justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Find wikilinks that point at notes which do not exist.' It specifies the resource (wikilinks) and the action (find broken links), and the verb 'Find' is specific. It distinguishes from siblings like resolve_link and get_backlinks by focusing on integration with the vault, not just structure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool: 'Run at session start alongside check_search_health.' It also provides context on why it matters (git's limitations) and what the ranking means, helping distinguish from other tools like search_notes. It clearly suggests a usage pattern, though it doesn't explicitly say when not to use it, but the session-start guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_connection_graphA

Build a multi-level connection graph starting from a note, showing how notes are semantically connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoDepth of the connection graph (levels), default 2
note_pathYesPath to the note to start from
thresholdNoSimilarity threshold (0-1), default 0.6
max_per_levelNoMax connections per level, default 5

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavior. It mentions multi-level and semantic connections, but does not disclose potential performance implications for deep graphs, how thresholds affect results, or whether it triggers expensive embedding computations. It provides some behavioral context but leaves room for more detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that clearly states the tool's function without extraneous information. It front-loads the primary action (build a connection graph) and includes key qualifiers (multi-level, starting from a note, semantic connections). It is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description, combined with a fully covered schema, provides enough information for an agent to understand and invoke the tool. It lacks details on the output format (no output schema), but for a graph-building tool, the purpose and parameters are clear. It could mention how the graph is returned (e.g., as nodes/edges) but the absence is not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers all parameters with clear descriptions. The description adds context by explaining the purpose (multi-level, semantic connections), which complements the schema. For example, 'threshold' and 'max_per_level' are self-explanatory, but the description reinforces their role in building the graph. It does not add new parameter details but integrates them into the tool's purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool builds a multi-level connection graph starting from a note, showing semantic connections. It is distinct from sibling tools like get_similar_notes (which likely returns a flat list) and search_notes (text-based search). However, it could be more explicit about the visual/graph output nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for exploring semantic connections, but provides no explicit guidance on when to use this tool vs. alternatives like get_similar_notes or get_embedding_neighbors. It does not mention any prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_embedding_neighborsB

Find nearest neighbors for a given embedding vector. Useful for custom similarity searches.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoNumber of neighbors to return, default 10
thresholdNoSimilarity threshold (0-1), default 0.5
embedding_vectorYes384-dimensional embedding vector

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, but it only restates the core operation. It does not explain what the returned neighbors are, whether distances are included, how threshold interacts with k, or any assumptions about embedding normalization.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with the core action front-loaded. It is appropriately sized for a simple tool and contains no filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description should explain what the tool returns and how the parameters affect results. It does not describe the output shape, whether neighbors are notes or raw vectors, or how k and threshold interact, leaving significant gaps for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds no additional parameter semantics beyond what the schema already provides; 'embedding_vector' is already described as a 384-dimensional array, and k/threshold have defaults and bounds in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Find nearest neighbors for a given embedding vector.' This is a specific verb-resource pairing. It does not explicitly contrast with sibling tools like get_similar_notes, though 'custom similarity searches' hints at its distinct vector-based use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Useful for custom similarity searches' provides implied usage context but no explicit when-to-use or when-not-to-use guidance. It does not mention alternatives such as get_similar_notes for note-level similarity or explain when this lower-level vector search would be preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_note_contentA

Retrieve the full content of a note, optionally with specific blocks/sections extracted.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_pathYesPath to the note
include_blocksNoSpecific block headings to include (optional)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It communicates a read-only retrieval operation and optional filtering, but does not disclose limitations, error behavior, or whether full content includes formatting or metadata.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-structured sentence with no filler. The core action and optional capability are front-loaded, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with two well-documented parameters, the description adequately conveys what it returns and the optional include_blocks behavior. It could mention return format or error cases, but the absence of an output schema is partially mitigated by the clear retrieval language.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline applies without the description needing to explain parameter syntax. The description does add context around 'full content' vs 'specific blocks/sections,' but adds little beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Retrieve') and resource ('full content of a note'), clearly distinguishing it from sibling tools like search_notes or get_backlinks. The optional block/section extraction adds precise scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies this tool is for retrieving note content, but it does not explicitly state when to use it instead of siblings or mention exclusions. Usage context is implied rather than directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_similar_notesB

Find notes semantically similar to a given note using embeddings. Returns paths, similarity scores, and available blocks.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results, default 10
note_pathYesPath to the note (e.g., "Note.md" or "Folder/Note.md")
thresholdNoSimilarity threshold (0-1), default 0.5

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It does disclose the retrieval method (embeddings) and the output categories, which implies a read-only operation. However, it does not mention behavior for missing notes, embedding availability, or the exact meaning of 'available blocks.'

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise, front-loaded sentence that communicates purpose and return value without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema or annotations, so the description must compensate. It lists return types but leaves 'available blocks' ambiguous and provides no failure semantics, output structure, or usage guidance relative to sibling tools. This is adequate but incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds no parameter-specific detail beyond the schema's existing documentation of note_path, limit, and threshold, and it does not clarify how limit and threshold interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool finds semantically similar notes using embeddings and names the returned data (paths, similarity scores, available blocks). It distinguishes from keyword-based search_notes, but does not differentiate from sibling get_embedding_neighbors, which may also use embeddings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is provided. The phrase 'using embeddings' implies semantic similarity use cases, but there is no comparison to alternative tools like search_notes or get_embedding_neighbors, leaving selection ambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_statsA

Get statistics about the Smart Connections knowledge base (total notes, blocks, embedding model, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must reveal behavioral traits. It clearly indicates a read-only operation ('Get statistics') and implies no side effects. The examples of returned data (notes, blocks, model) provide transparency about the output, though it does not explicitly state that it is non-destructive or safe, but the phrasing is sufficient for a simple stats tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that directly states the purpose and provides concrete examples of what is included. There is no redundant or extraneous information; every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and no output schema, the description adequately explains what the tool returns (total notes, blocks, embedding model, etc.). It is complete enough for a basic stats tool, though the 'etc.' could be more explicit. No additional context about limitations or setup is required for such a straightforward operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so no parameter explanations are needed. The schema coverage is 100% (empty properties). Per the baseline for 0 params, a score of 4 is appropriate; the description adds no parameter info because there are none to describe.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'statistics about the Smart Connections knowledge base', providing specific examples (total notes, blocks, embedding model). It distinguishes itself from sibling tools like get_similar_notes and get_connection_graph, which focus on specific queries or graphs rather than general stats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives. The context implies it is for retrieving overall knowledge base statistics, but no exclusions or alternative recommendations are given. It relies on the user inferring usage from the purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_notesA

Semantic search over the vault. Returns an envelope, not a bare array: mode names the engine that answered ("semantic" is real, "keyword" means the embedding model failed to load and results will miss anything phrased differently), coverage says how many notes were actually searched out of the vault total, results holds the matches, and warning appears whenever the answer should not be read at face value. An empty results with mode "semantic" and full coverage means the vault really has nothing closer; an empty results with mode "keyword" or nonzero coverage.unsearchable means the tool was partly blind and you must not report it as an absence. Typical relevant matches score ~0.4-0.75; lower the threshold to widen recall.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results, default 10
queryYesSearch query text
thresholdNoSimilarity threshold (0-1), default 0.4

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral burden. It details the envelope structure, distinguishes between 'semantic' and 'keyword' modes, explains coverage implications, warns about partial blindness, and specifies that empty results can mean absence or failureβ€”critical for correct invocation and interpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph that front-loads the primary purpose and then explains the return envelope and failure modes. Every sentence adds essential value, clarifying edge cases that would otherwise be ambiguous. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema and the tool's complexity (mode-dependent behavior, coverage calculation, warnings), the description is remarkably complete. It covers return structure, interpretation of edge cases, and actionable guidance, leaving no critical gaps for an agent to misuse the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% coverage for all three parameters, so baseline is 3. The description adds operational guidance beyond the schema, such as 'lower the threshold to widen recall' and typical relevance score ranges, which directly helps agents calibrate threshold and limit parameters effectively.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Semantic search over the vault' which names the verb (search), resource (vault), and method (semantic). It clearly distinguishes from sibling tools like get_similar_notes and get_embedding_neighbors by focusing on vault-wide text search and explaining the envelope structure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on how to interpret results (modes, coverage, warnings) and when to trust empty results, but does not explicitly name alternative tools for different use cases. It implies usage as the primary search tool but lacks explicit when/ when-not guidance against siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A3.9/5.0
Disambiguation4/5

Most tools have clearly distinct purposes: search_notes, get_similar_notes, and get_embedding_neighbors are all similarity/retrieval-related but differ meaningfully (search_notes is the primary vault search with envelope details, get_similar_notes uses a seed note, get_embedding_neighbors uses raw vectors). However, get_similar_notes and get_embedding_neighbors could be confused when both accept vector-like inputs, though descriptions clarify the distinction. Minor overlap exists but is manageable.

Naming Consistency4/5

Tool names follow a consistent verb_noun pattern with descriptive prefixes: get_similar_notes, search_notes, resolve_link, get_backlinks, check_vault_integrity, check_search_health, get_embedding_neighbors, get_note_content, get_stats. All use snake_case and clear verbs. The only slight deviation is 'resolve_link' which uses a bare verb rather than a get_/search_ prefix, but it fits the action-oriented pattern.

Tool Count5/5

10 tools is well within the ideal 3-15 range for a note-relationship server. Each tool covers a distinct operation: semantic search, similarity from a note, embedding neighbors, link resolution, backlinks, integrity checks, health checks, content retrieval, stats, and connection graph. No tool feels redundant or unnecessary.

Completeness4/5

The server covers core retrieval workflows: search, similarity, link resolution, backlinks, integrity, health, and content access. Missing operations like creating/updating notes are intentionally out of scope for a read-focused knowledge-base server. A minor gap is lack of a tool to get all notes in a folder or list, but the provided surface is sufficient for typical vault exploration tasks.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables semantic search and knowledge graph exploration of Obsidian vaults using Smart Connections embeddings. Provides intelligent note discovery, similarity search, and connection mapping through natural language queries.
    195
    54
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude to perform semantic search across your Obsidian vault using Smart Connections vector database. Provides meaning-based search, related note discovery, and context retrieval for RAG queries instead of basic keyword matching.
    10
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables semantic search and retrieval over an Obsidian vault using local or API-based embeddings, allowing AI assistants to find notes by meaning, get related content, and pull context during conversations.
    15
    MIT

Latest Blog Posts

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/bookbran/smart-connections-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server