Smart Connections MCP Server
Provides semantic search, similarity matching, connection graphs, and note content access for Obsidian vaults using pre-computed embeddings from the Smart Connections plugin.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Smart Connections MCP Serversearch my vault for notes about artificial intelligence"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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-mcpby Daniel Glickman (MIT). It adds true semanticsearch_notes(embeds the query with the vault's model instead of literal keyword matching); see "Query embedding" below. Original copyright and MIT license preserved inLICENSE.
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
π Semantic Search
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
Clone the repository:
git clone https://github.com/bookbran/smart-connections-mcp.git cd smart-connections-mcpInstall dependencies:
npm installBuild the TypeScript project:
npm run buildConfigure Claude Desktop:
Edit your Claude Desktop configuration file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add the following to the
mcpServerssection:{ "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
argspath to point to your builtindex.jsfileUpdate
SMART_VAULT_PATHto your Obsidian vault path
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.5limit(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 pathdepth(number, optional): Graph depth (levels), default 2threshold(number, optional): Similarity threshold 0-1, default 0.6max_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_notescall of a server session (needs network once, ~30s), then cached undernode_modules/@huggingface/transformers/.cacheso every later call is offline and fast (~4ms). See "Query embedding" under Technical Details.
Parameters:
query(string, required): Search query textlimit(number, optional): Maximum results, default 10threshold(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 vectork(number, optional): Number of neighbors, default 10threshold(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 noteinclude_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, thenSC_EMBED_MODEL(env override), thenTaylorAI/bge-micro-v2, thenXenova/bge-micro-v2.ONNX weights download from the Hugging Face hub on first use and are cached under
node_modules/@huggingface/transformers/.cache. Firstsearch_notescall: ~30s; subsequent calls: ~4ms, offline.If no model can be loaded (offline with an empty cache),
search_notestransparently falls back to a multi-term keyword search so it still returns useful results.Override the model with the
SC_EMBED_MODELenv 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 settingsmulti/*.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 buildWatch Mode
npm run watchRun Locally
export SMART_VAULT_PATH="/path/to/your/vault"
npm run devProject 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.mdTroubleshooting
"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_PATHpoints 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.jsonin 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
Original: Daniel Glickman (msdanyg/smart-connections-mcp)
Fork maintained by: A Portland Career (semantic
search_notes+ pilot-kit integration)
Acknowledgments
Built for use with Obsidian
Integrates with Smart Connections plugin
Uses Model Context Protocol by Anthropic
Available Tools
10 toolscheck_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.
| Name | Required | Description | Default |
|---|---|---|---|
| canary_path | No | Optional vault-relative path to a known note to probe for specifically, in addition to the automatic sample. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| min_references | No | How many distinct referencing notes before a missing target counts as load-bearing. Default 3. |
TDQS
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.
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.
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.
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.
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.
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_backlinksA
Which notes explicitly link TO this one. This answers a different question from semantic search: backlinks are edges the author wrote by hand, so they show what the vault has decided this note is load-bearing for, regardless of whether the prose is similar. Use it to judge how important a note is, to find every place a decision is cited before changing it, and to trace how a concept actually gets used. Set include_outbound to also get what this note links to.
| Name | Required | Description | Default |
|---|---|---|---|
| note_path | Yes | Vault-relative path, e.g. context/revenue-engine.md | |
| include_outbound | No | Also return the notes this one links to. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the transparency burden. It does well by explaining that it returns explicit backlink edges (as opposed to semantic similarity), the scope ('vault has decided this note is load-bearing'), and the effect of include_outbound. It doesn't explicitly state it's read-only, but that's implied and not contradicted. Overall, it discloses the core behavior effectively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a bit longer than strictly necessary but every sentence contributes: purpose, differentiation, use cases, and optional parameter. It is well-structured with the core question first, followed by context and usage guidance. No redundant or filler content, though it could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, the description adequately explains what the tool returns (backlinks, with optional outbound links). It covers the key distinctions from siblings and includes essential usage context. However, it doesn't mention potential edge cases (e.g., behavior for nonexistent note paths) but this is minor for a read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes both parameters thoroughly (note_path with an example, include_outbound with default). The description adds marginal value by explaining the purpose of the result but doesn't add new parameter-level detail. Baseline of 3 is appropriate since schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a crystal-clear statement: 'Which notes explicitly link TO this one.' It names the specific resource (notes) and the action (listing backlinks), and explicitly contrasts with semantic search and sibling tools like get_similar_notes and get_connection_graph, making its unique purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool: 'Use it to judge how important a note is, to find every place a decision is cited before changing it, and to trace how a concept actually gets used.' It also distinguishes it from semantic search, providing clear exclusions. The optional include_outbound behavior is mentioned, which helps decide between this and related graph tools.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Depth of the connection graph (levels), default 2 | |
| note_path | Yes | Path to the note to start from | |
| threshold | No | Similarity threshold (0-1), default 0.6 | |
| max_per_level | No | Max connections per level, default 5 |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Number of neighbors to return, default 10 | |
| threshold | No | Similarity threshold (0-1), default 0.5 | |
| embedding_vector | Yes | 384-dimensional embedding vector |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note_path | Yes | Path to the note | |
| include_blocks | No | Specific block headings to include (optional) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results, default 10 | |
| note_path | Yes | Path to the note (e.g., "Note.md" or "Folder/Note.md") | |
| threshold | No | Similarity threshold (0-1), default 0.5 |
TDQS
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.
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.
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.
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.
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.
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.).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
resolve_linkA
Turn a wikilink into a real file path, the way Obsidian would. Accepts bare text ("Throughline"), full link syntax ("[[Throughline|the CRM tracker]]"), or a path, and honors aliases: frontmatter, so a tracker filed as 2026-06-23-throughline-workstream.md resolves from its codename. Use this whenever you read a [[link]] in a note and need the actual file, instead of guessing at the filename or falling back to semantic search, which finds notes that are SIMILAR rather than the one that was actually referenced. Returns null when nothing resolves, which means the note genuinely does not exist in this vault.
| Name | Required | Description | Default |
|---|---|---|---|
| link | Yes | Wikilink text, with or without the surrounding brackets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses key behavioral traits: it returns null when nothing resolves (indicating genuine non-existence), which is critical for error handling. It also reveals that it honors aliases frontmatter, adding meaningful context. However, it doesn't discuss whether the path is absolute or relative, or any potential side effects, but for a read-only lookup, this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured paragraph that packs in examples, behavior, and usage guidance without wasting words. It front-loads the core purpose and then provides necessary details, making it easy to scan. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter, no nested objects, and no output schema, the description is comprehensive. It covers input formats, alias handling, return behavior (null on failure), and how it differs from alternatives. The agent has everything needed to invoke it correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only one parameter with 100% coverage, providing a basic description. The tool description adds examples of accepted formats (bare text, full link syntax, or path) and explains the aliases behavior, which enriches understanding beyond the schema. However, since the schema already describes the parameter, the extra value is incremental, not dramatic.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: turning a wikilink into a real file path, with a specific verb ('resolve') and resource ('wikilink'). It differentiates from siblings by explicitly noting that it resolves the actual referenced note rather than finding similar ones, as get_similar_notes or search_notes would.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides strong guidance on when to use: whenever a [[link]] is encountered and the actual file is needed, and explicitly when not to: instead of guessing filenames or using semantic search. It names the alternative (semantic search) and explains why it's inferior for this purpose, making the use case very clear.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results, default 10 | |
| query | Yes | Search query text | |
| threshold | No | Similarity threshold (0-1), default 0.4 |
TDQS
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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
Search your Obsidian vault to quickly find notes by title or keyword, summarize related content, aβ¦
Connect AI assistants to your GitHub-hosted Obsidian vault to seamlessly access, search, and analyβ¦
Token-efficient MCP memory for Markdown vaults. Tiered search, GraphRAG, AI memories.
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables 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.19554MIT
- FlicenseNot gradedqualityDmaintenanceEnables 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
- AlicenseNot gradedqualityFmaintenanceEnables AI agents to find semantic connections and perform text searches in Obsidian vaults using the Smart Connections plugin data.12414MIT
- AlicenseNot gradedqualityAmaintenanceEnables 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.15MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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