@aniketbiswas/obsidian-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +232 -0
- package/build/index.d.ts +26 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +148 -0
- package/build/index.js.map +1 -0
- package/build/prompts/index.d.ts +33 -0
- package/build/prompts/index.d.ts.map +1 -0
- package/build/prompts/index.js +152 -0
- package/build/prompts/index.js.map +1 -0
- package/build/prompts/obsidian.d.ts +17 -0
- package/build/prompts/obsidian.d.ts.map +1 -0
- package/build/prompts/obsidian.js +305 -0
- package/build/prompts/obsidian.js.map +1 -0
- package/build/resources/index.d.ts +31 -0
- package/build/resources/index.d.ts.map +1 -0
- package/build/resources/index.js +111 -0
- package/build/resources/index.js.map +1 -0
- package/build/resources/obsidian.d.ts +19 -0
- package/build/resources/obsidian.d.ts.map +1 -0
- package/build/resources/obsidian.js +246 -0
- package/build/resources/obsidian.js.map +1 -0
- package/build/tools/_template.d.ts +23 -0
- package/build/tools/_template.d.ts.map +1 -0
- package/build/tools/_template.js +124 -0
- package/build/tools/_template.js.map +1 -0
- package/build/tools/calculator.d.ts +32 -0
- package/build/tools/calculator.d.ts.map +1 -0
- package/build/tools/calculator.js +130 -0
- package/build/tools/calculator.js.map +1 -0
- package/build/tools/daily-notes.d.ts +19 -0
- package/build/tools/daily-notes.d.ts.map +1 -0
- package/build/tools/daily-notes.js +469 -0
- package/build/tools/daily-notes.js.map +1 -0
- package/build/tools/greeting.d.ts +23 -0
- package/build/tools/greeting.d.ts.map +1 -0
- package/build/tools/greeting.js +111 -0
- package/build/tools/greeting.js.map +1 -0
- package/build/tools/index.d.ts +28 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +46 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/links.d.ts +19 -0
- package/build/tools/links.d.ts.map +1 -0
- package/build/tools/links.js +467 -0
- package/build/tools/links.js.map +1 -0
- package/build/tools/metadata.d.ts +18 -0
- package/build/tools/metadata.d.ts.map +1 -0
- package/build/tools/metadata.js +447 -0
- package/build/tools/metadata.js.map +1 -0
- package/build/tools/navigation.d.ts +19 -0
- package/build/tools/navigation.d.ts.map +1 -0
- package/build/tools/navigation.js +378 -0
- package/build/tools/navigation.js.map +1 -0
- package/build/tools/notes.d.ts +19 -0
- package/build/tools/notes.d.ts.map +1 -0
- package/build/tools/notes.js +622 -0
- package/build/tools/notes.js.map +1 -0
- package/build/tools/search.d.ts +19 -0
- package/build/tools/search.d.ts.map +1 -0
- package/build/tools/search.js +418 -0
- package/build/tools/search.js.map +1 -0
- package/build/tools/templates.d.ts +18 -0
- package/build/tools/templates.d.ts.map +1 -0
- package/build/tools/templates.js +581 -0
- package/build/tools/templates.js.map +1 -0
- package/build/tools/vault.d.ts +19 -0
- package/build/tools/vault.d.ts.map +1 -0
- package/build/tools/vault.js +403 -0
- package/build/tools/vault.js.map +1 -0
- package/build/types/index.d.ts +11 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +11 -0
- package/build/types/index.js.map +1 -0
- package/build/types/obsidian.d.ts +329 -0
- package/build/types/obsidian.d.ts.map +1 -0
- package/build/types/obsidian.js +38 -0
- package/build/types/obsidian.js.map +1 -0
- package/build/utils/client.d.ts +201 -0
- package/build/utils/client.d.ts.map +1 -0
- package/build/utils/client.js +656 -0
- package/build/utils/client.js.map +1 -0
- package/build/utils/config.d.ts +43 -0
- package/build/utils/config.d.ts.map +1 -0
- package/build/utils/config.js +117 -0
- package/build/utils/config.js.map +1 -0
- package/build/utils/frontmatter.d.ts +90 -0
- package/build/utils/frontmatter.d.ts.map +1 -0
- package/build/utils/frontmatter.js +306 -0
- package/build/utils/frontmatter.js.map +1 -0
- package/build/utils/index.d.ts +13 -0
- package/build/utils/index.d.ts.map +1 -0
- package/build/utils/index.js +13 -0
- package/build/utils/index.js.map +1 -0
- package/build/utils/markdown.d.ts +134 -0
- package/build/utils/markdown.d.ts.map +1 -0
- package/build/utils/markdown.js +330 -0
- package/build/utils/markdown.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================================
|
|
3
|
+
* OBSIDIAN MCP - Tools Index
|
|
4
|
+
* ============================================================================
|
|
5
|
+
*
|
|
6
|
+
* Central registration point for all Obsidian MCP tools.
|
|
7
|
+
* Each tool module is imported and registered with the server.
|
|
8
|
+
* ============================================================================
|
|
9
|
+
*/
|
|
10
|
+
// Import tool registration functions
|
|
11
|
+
import { registerVaultTools } from "./vault.js";
|
|
12
|
+
import { registerNoteTools } from "./notes.js";
|
|
13
|
+
import { registerSearchTools } from "./search.js";
|
|
14
|
+
import { registerMetadataTools } from "./metadata.js";
|
|
15
|
+
import { registerNavigationTools } from "./navigation.js";
|
|
16
|
+
import { registerDailyNotesTools } from "./daily-notes.js";
|
|
17
|
+
import { registerLinkTools } from "./links.js";
|
|
18
|
+
import { registerTemplateTools } from "./templates.js";
|
|
19
|
+
/**
|
|
20
|
+
* Register all Obsidian tools with the MCP server.
|
|
21
|
+
*
|
|
22
|
+
* @param server - The MCP server instance
|
|
23
|
+
* @param client - The Obsidian API client
|
|
24
|
+
*/
|
|
25
|
+
export function registerAllTools(server, client) {
|
|
26
|
+
// Vault management tools
|
|
27
|
+
registerVaultTools(server, client);
|
|
28
|
+
// Note CRUD operations
|
|
29
|
+
registerNoteTools(server, client);
|
|
30
|
+
// Search functionality
|
|
31
|
+
registerSearchTools(server, client);
|
|
32
|
+
// Metadata and frontmatter management
|
|
33
|
+
registerMetadataTools(server, client);
|
|
34
|
+
// Navigation and commands
|
|
35
|
+
registerNavigationTools(server, client);
|
|
36
|
+
// Daily and periodic notes
|
|
37
|
+
registerDailyNotesTools(server, client);
|
|
38
|
+
// Link analysis tools
|
|
39
|
+
registerLinkTools(server, client);
|
|
40
|
+
// Template tools
|
|
41
|
+
registerTemplateTools(server, client);
|
|
42
|
+
console.error("✅ All Obsidian tools registered");
|
|
43
|
+
}
|
|
44
|
+
// Re-export individual tool registration functions for selective use
|
|
45
|
+
export { registerVaultTools, registerNoteTools, registerSearchTools, registerMetadataTools, registerNavigationTools, registerDailyNotesTools, registerLinkTools, registerTemplateTools, };
|
|
46
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,qCAAqC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAsB;IACxE,yBAAyB;IACzB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,uBAAuB;IACvB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,uBAAuB;IACvB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,sCAAsC;IACtC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,0BAA0B;IAC1B,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,2BAA2B;IAC3B,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,sBAAsB;IACtB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,iBAAiB;IACjB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACnD,CAAC;AAED,qEAAqE;AACrE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,GACtB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================================
|
|
3
|
+
* OBSIDIAN MCP - Link Analysis Tools
|
|
4
|
+
* ============================================================================
|
|
5
|
+
*
|
|
6
|
+
* Tools for analyzing links between notes: backlinks, outgoing links,
|
|
7
|
+
* graph analysis, and finding orphan notes.
|
|
8
|
+
* ============================================================================
|
|
9
|
+
*/
|
|
10
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
|
+
import { ObsidianClient } from "../utils/client.js";
|
|
12
|
+
/**
|
|
13
|
+
* Register link analysis tools with the MCP server.
|
|
14
|
+
*
|
|
15
|
+
* @param server - The MCP server instance
|
|
16
|
+
* @param client - The Obsidian API client
|
|
17
|
+
*/
|
|
18
|
+
export declare function registerLinkTools(server: McpServer, client: ObsidianClient): void;
|
|
19
|
+
//# sourceMappingURL=links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/tools/links.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AASpD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAgjBjF"}
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================================
|
|
3
|
+
* OBSIDIAN MCP - Link Analysis Tools
|
|
4
|
+
* ============================================================================
|
|
5
|
+
*
|
|
6
|
+
* Tools for analyzing links between notes: backlinks, outgoing links,
|
|
7
|
+
* graph analysis, and finding orphan notes.
|
|
8
|
+
* ============================================================================
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { ObsidianApiError } from "../types/obsidian.js";
|
|
12
|
+
import { extractInternalLinks, extractAllLinks, createWikilink, } from "../utils/markdown.js";
|
|
13
|
+
/**
|
|
14
|
+
* Register link analysis tools with the MCP server.
|
|
15
|
+
*
|
|
16
|
+
* @param server - The MCP server instance
|
|
17
|
+
* @param client - The Obsidian API client
|
|
18
|
+
*/
|
|
19
|
+
export function registerLinkTools(server, client) {
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// TOOL: get_outgoing_links
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Get all links from a note.
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
server.tool("get_outgoing_links", "Get all outgoing links from a note. " +
|
|
26
|
+
"Returns internal links ([[note]]), external links, and tags.", {
|
|
27
|
+
path: z.string().describe("Path to the note."),
|
|
28
|
+
}, async ({ path }) => {
|
|
29
|
+
try {
|
|
30
|
+
const filePath = path.endsWith(".md") ? path : `${path}.md`;
|
|
31
|
+
const content = await client.getFile(filePath);
|
|
32
|
+
const links = extractAllLinks(content, filePath);
|
|
33
|
+
// Separate by type
|
|
34
|
+
const internal = links.filter((l) => l.type === "internal");
|
|
35
|
+
const external = links.filter((l) => l.type === "external");
|
|
36
|
+
const tags = links.filter((l) => l.type === "tag");
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: JSON.stringify({
|
|
42
|
+
success: true,
|
|
43
|
+
path: filePath,
|
|
44
|
+
totalLinks: links.length,
|
|
45
|
+
internalLinks: internal.map((l) => ({
|
|
46
|
+
target: l.target,
|
|
47
|
+
displayText: l.displayText,
|
|
48
|
+
isEmbed: l.isEmbed,
|
|
49
|
+
})),
|
|
50
|
+
externalLinks: external.map((l) => ({
|
|
51
|
+
url: l.target,
|
|
52
|
+
displayText: l.displayText,
|
|
53
|
+
})),
|
|
54
|
+
tags: tags.map((l) => l.target),
|
|
55
|
+
}, null, 2),
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const message = error instanceof ObsidianApiError ? error.message : String(error);
|
|
62
|
+
return {
|
|
63
|
+
content: [
|
|
64
|
+
{
|
|
65
|
+
type: "text",
|
|
66
|
+
text: `Error getting outgoing links: ${message}`,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
isError: true,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// TOOL: get_backlinks
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Find all notes that link to a specific note.
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
server.tool("get_backlinks", "Find all notes that link to a specific note (backlinks). " +
|
|
79
|
+
"Searches the entire vault for [[note]] references.", {
|
|
80
|
+
path: z.string().describe("Path to the note to find backlinks for."),
|
|
81
|
+
includeContext: z
|
|
82
|
+
.boolean()
|
|
83
|
+
.optional()
|
|
84
|
+
.default(false)
|
|
85
|
+
.describe("Whether to include the context around each backlink."),
|
|
86
|
+
}, async ({ path, includeContext }) => {
|
|
87
|
+
try {
|
|
88
|
+
const filePath = path.endsWith(".md") ? path : `${path}.md`;
|
|
89
|
+
// Extract the note name (without path and extension) for searching
|
|
90
|
+
const noteName = filePath
|
|
91
|
+
.split("/")
|
|
92
|
+
.pop()
|
|
93
|
+
.replace(/\.md$/, "");
|
|
94
|
+
// Search for [[noteName]] in all files
|
|
95
|
+
const searchResults = await client.search(`[[${noteName}]]`);
|
|
96
|
+
// Filter out self-references
|
|
97
|
+
const backlinks = searchResults.filter((r) => r.filename.toLowerCase() !== filePath.toLowerCase());
|
|
98
|
+
const results = await Promise.all(backlinks.map(async (result) => {
|
|
99
|
+
const item = {
|
|
100
|
+
source: result.filename,
|
|
101
|
+
};
|
|
102
|
+
if (includeContext && result.matches) {
|
|
103
|
+
item.contexts = result.matches.slice(0, 3).map((m) => m.match);
|
|
104
|
+
}
|
|
105
|
+
return item;
|
|
106
|
+
}));
|
|
107
|
+
return {
|
|
108
|
+
content: [
|
|
109
|
+
{
|
|
110
|
+
type: "text",
|
|
111
|
+
text: JSON.stringify({
|
|
112
|
+
success: true,
|
|
113
|
+
target: filePath,
|
|
114
|
+
backlinksCount: results.length,
|
|
115
|
+
backlinks: results,
|
|
116
|
+
}, null, 2),
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const message = error instanceof ObsidianApiError ? error.message : String(error);
|
|
123
|
+
return {
|
|
124
|
+
content: [
|
|
125
|
+
{
|
|
126
|
+
type: "text",
|
|
127
|
+
text: `Error getting backlinks: ${message}`,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
isError: true,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// TOOL: find_broken_links
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// Find links that point to non-existent notes.
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
server.tool("find_broken_links", "Find broken internal links in the vault. " +
|
|
140
|
+
"Identifies [[links]] that point to notes that don't exist.", {
|
|
141
|
+
folder: z
|
|
142
|
+
.string()
|
|
143
|
+
.optional()
|
|
144
|
+
.describe("Folder to check. Defaults to entire vault."),
|
|
145
|
+
}, async ({ folder }) => {
|
|
146
|
+
try {
|
|
147
|
+
// Get all markdown files
|
|
148
|
+
const allFiles = await client.listAllFiles(folder || "", 10);
|
|
149
|
+
const mdFiles = allFiles.filter((f) => f.type === "file" && f.extension === "md");
|
|
150
|
+
// Build a set of existing note paths (without extension)
|
|
151
|
+
const existingNotes = new Set();
|
|
152
|
+
for (const file of mdFiles) {
|
|
153
|
+
// Add with path
|
|
154
|
+
existingNotes.add(file.path.toLowerCase());
|
|
155
|
+
// Add without .md extension
|
|
156
|
+
existingNotes.add(file.path.replace(/\.md$/, "").toLowerCase());
|
|
157
|
+
// Add just the filename
|
|
158
|
+
const filename = file.path.split("/").pop().replace(/\.md$/, "");
|
|
159
|
+
existingNotes.add(filename.toLowerCase());
|
|
160
|
+
}
|
|
161
|
+
const brokenLinks = [];
|
|
162
|
+
// Check each file for broken links
|
|
163
|
+
for (const file of mdFiles.slice(0, 200)) {
|
|
164
|
+
// Limit to avoid timeout
|
|
165
|
+
try {
|
|
166
|
+
const content = await client.getFile(file.path);
|
|
167
|
+
const internalLinks = extractInternalLinks(content);
|
|
168
|
+
for (const link of internalLinks) {
|
|
169
|
+
// Check if target exists
|
|
170
|
+
const target = link.target.split("#")[0]; // Remove heading reference
|
|
171
|
+
const targetLower = target.toLowerCase();
|
|
172
|
+
// Check various forms of the target
|
|
173
|
+
const exists = existingNotes.has(targetLower) ||
|
|
174
|
+
existingNotes.has(`${targetLower}.md`) ||
|
|
175
|
+
mdFiles.some((f) => f.path.toLowerCase().endsWith(`/${targetLower}.md`) ||
|
|
176
|
+
f.path.toLowerCase().endsWith(`/${targetLower}`));
|
|
177
|
+
if (!exists) {
|
|
178
|
+
brokenLinks.push({
|
|
179
|
+
source: file.path,
|
|
180
|
+
target: link.target,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Skip files that can't be read
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
content: [
|
|
191
|
+
{
|
|
192
|
+
type: "text",
|
|
193
|
+
text: JSON.stringify({
|
|
194
|
+
success: true,
|
|
195
|
+
folder: folder || "/",
|
|
196
|
+
filesChecked: Math.min(mdFiles.length, 200),
|
|
197
|
+
brokenLinksCount: brokenLinks.length,
|
|
198
|
+
brokenLinks,
|
|
199
|
+
}, null, 2),
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
const message = error instanceof ObsidianApiError ? error.message : String(error);
|
|
206
|
+
return {
|
|
207
|
+
content: [
|
|
208
|
+
{
|
|
209
|
+
type: "text",
|
|
210
|
+
text: `Error finding broken links: ${message}`,
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
isError: true,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// TOOL: find_orphan_notes
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// Find notes that have no incoming or outgoing links.
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
server.tool("find_orphan_notes", "Find orphan notes - notes with no incoming links from other notes. " +
|
|
223
|
+
"These are notes that aren't connected to the rest of your knowledge graph.", {
|
|
224
|
+
folder: z
|
|
225
|
+
.string()
|
|
226
|
+
.optional()
|
|
227
|
+
.describe("Folder to check. Defaults to entire vault."),
|
|
228
|
+
includeUnlinked: z
|
|
229
|
+
.boolean()
|
|
230
|
+
.optional()
|
|
231
|
+
.default(false)
|
|
232
|
+
.describe("Also include notes that don't link to anything."),
|
|
233
|
+
}, async ({ folder, includeUnlinked }) => {
|
|
234
|
+
try {
|
|
235
|
+
// Get all markdown files
|
|
236
|
+
const allFiles = await client.listAllFiles(folder || "", 10);
|
|
237
|
+
const mdFiles = allFiles.filter((f) => f.type === "file" && f.extension === "md");
|
|
238
|
+
// Track which notes are linked to
|
|
239
|
+
const linkedTo = new Set();
|
|
240
|
+
const hasOutgoingLinks = new Set();
|
|
241
|
+
// Build link map
|
|
242
|
+
for (const file of mdFiles.slice(0, 300)) {
|
|
243
|
+
try {
|
|
244
|
+
const content = await client.getFile(file.path);
|
|
245
|
+
const links = extractInternalLinks(content);
|
|
246
|
+
if (links.length > 0) {
|
|
247
|
+
hasOutgoingLinks.add(file.path);
|
|
248
|
+
}
|
|
249
|
+
for (const link of links) {
|
|
250
|
+
const target = link.target.split("#")[0];
|
|
251
|
+
// Add various forms of the target
|
|
252
|
+
linkedTo.add(target.toLowerCase());
|
|
253
|
+
linkedTo.add(`${target.toLowerCase()}.md`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// Skip files that can't be read
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Find orphans (notes not linked to)
|
|
261
|
+
const orphans = [];
|
|
262
|
+
for (const file of mdFiles) {
|
|
263
|
+
const noteName = file.path
|
|
264
|
+
.split("/")
|
|
265
|
+
.pop()
|
|
266
|
+
.replace(/\.md$/, "")
|
|
267
|
+
.toLowerCase();
|
|
268
|
+
const isLinkedTo = linkedTo.has(noteName) ||
|
|
269
|
+
linkedTo.has(`${noteName}.md`) ||
|
|
270
|
+
linkedTo.has(file.path.toLowerCase());
|
|
271
|
+
if (!isLinkedTo) {
|
|
272
|
+
const hasLinks = hasOutgoingLinks.has(file.path);
|
|
273
|
+
if (!includeUnlinked || !hasLinks) {
|
|
274
|
+
orphans.push({
|
|
275
|
+
path: file.path,
|
|
276
|
+
hasOutgoingLinks: hasLinks,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
content: [
|
|
283
|
+
{
|
|
284
|
+
type: "text",
|
|
285
|
+
text: JSON.stringify({
|
|
286
|
+
success: true,
|
|
287
|
+
folder: folder || "/",
|
|
288
|
+
totalNotes: mdFiles.length,
|
|
289
|
+
orphanCount: orphans.length,
|
|
290
|
+
orphans: orphans.slice(0, 100),
|
|
291
|
+
truncated: orphans.length > 100,
|
|
292
|
+
}, null, 2),
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
const message = error instanceof ObsidianApiError ? error.message : String(error);
|
|
299
|
+
return {
|
|
300
|
+
content: [
|
|
301
|
+
{
|
|
302
|
+
type: "text",
|
|
303
|
+
text: `Error finding orphan notes: ${message}`,
|
|
304
|
+
},
|
|
305
|
+
],
|
|
306
|
+
isError: true,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
// ---------------------------------------------------------------------------
|
|
311
|
+
// TOOL: add_link_to_note
|
|
312
|
+
// ---------------------------------------------------------------------------
|
|
313
|
+
// Add an internal link to another note.
|
|
314
|
+
// ---------------------------------------------------------------------------
|
|
315
|
+
server.tool("add_link_to_note", "Add an internal link ([[note]]) to a note. " +
|
|
316
|
+
"Can append to the end or insert at a specific location.", {
|
|
317
|
+
sourcePath: z.string().describe("Path to the note to add the link to."),
|
|
318
|
+
targetPath: z.string().describe("Path of the note to link to."),
|
|
319
|
+
displayText: z
|
|
320
|
+
.string()
|
|
321
|
+
.optional()
|
|
322
|
+
.describe("Optional display text for the link."),
|
|
323
|
+
position: z
|
|
324
|
+
.enum(["append", "prepend"])
|
|
325
|
+
.optional()
|
|
326
|
+
.default("append")
|
|
327
|
+
.describe("Where to add the link (append or prepend)."),
|
|
328
|
+
asListItem: z
|
|
329
|
+
.boolean()
|
|
330
|
+
.optional()
|
|
331
|
+
.default(false)
|
|
332
|
+
.describe("Whether to format as a list item (- [[link]])."),
|
|
333
|
+
}, async ({ sourcePath, targetPath, displayText, position, asListItem }) => {
|
|
334
|
+
try {
|
|
335
|
+
const sourceFile = sourcePath.endsWith(".md")
|
|
336
|
+
? sourcePath
|
|
337
|
+
: `${sourcePath}.md`;
|
|
338
|
+
const targetNote = targetPath.replace(/\.md$/, "");
|
|
339
|
+
const wikilink = createWikilink(targetNote, displayText);
|
|
340
|
+
const content = asListItem ? `- ${wikilink}` : wikilink;
|
|
341
|
+
if (position === "prepend") {
|
|
342
|
+
await client.patchFile(sourceFile, `${content}\n`, {
|
|
343
|
+
operation: "prepend",
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
await client.appendToFile(sourceFile, `\n${content}`);
|
|
348
|
+
}
|
|
349
|
+
return {
|
|
350
|
+
content: [
|
|
351
|
+
{
|
|
352
|
+
type: "text",
|
|
353
|
+
text: JSON.stringify({
|
|
354
|
+
success: true,
|
|
355
|
+
message: `Link added to ${sourceFile}`,
|
|
356
|
+
source: sourceFile,
|
|
357
|
+
target: targetNote,
|
|
358
|
+
link: wikilink,
|
|
359
|
+
position,
|
|
360
|
+
}, null, 2),
|
|
361
|
+
},
|
|
362
|
+
],
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
const message = error instanceof ObsidianApiError ? error.message : String(error);
|
|
367
|
+
return {
|
|
368
|
+
content: [
|
|
369
|
+
{
|
|
370
|
+
type: "text",
|
|
371
|
+
text: `Error adding link: ${message}`,
|
|
372
|
+
},
|
|
373
|
+
],
|
|
374
|
+
isError: true,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
// ---------------------------------------------------------------------------
|
|
379
|
+
// TOOL: get_link_graph_data
|
|
380
|
+
// ---------------------------------------------------------------------------
|
|
381
|
+
// Get data for building a link graph visualization.
|
|
382
|
+
// ---------------------------------------------------------------------------
|
|
383
|
+
server.tool("get_link_graph_data", "Get link graph data for a folder or the entire vault. " +
|
|
384
|
+
"Returns nodes (notes) and edges (links) for visualization.", {
|
|
385
|
+
folder: z
|
|
386
|
+
.string()
|
|
387
|
+
.optional()
|
|
388
|
+
.describe("Folder to analyze. Defaults to entire vault."),
|
|
389
|
+
maxNotes: z
|
|
390
|
+
.number()
|
|
391
|
+
.int()
|
|
392
|
+
.min(1)
|
|
393
|
+
.max(500)
|
|
394
|
+
.optional()
|
|
395
|
+
.default(100)
|
|
396
|
+
.describe("Maximum number of notes to include (default: 100)."),
|
|
397
|
+
}, async ({ folder, maxNotes }) => {
|
|
398
|
+
try {
|
|
399
|
+
// Get all markdown files
|
|
400
|
+
const allFiles = await client.listAllFiles(folder || "", 10);
|
|
401
|
+
const mdFiles = allFiles
|
|
402
|
+
.filter((f) => f.type === "file" && f.extension === "md")
|
|
403
|
+
.slice(0, maxNotes);
|
|
404
|
+
const nodes = [];
|
|
405
|
+
const edges = [];
|
|
406
|
+
const noteNames = new Set();
|
|
407
|
+
// Create node for each file
|
|
408
|
+
for (const file of mdFiles) {
|
|
409
|
+
const noteName = file.path.replace(/\.md$/, "");
|
|
410
|
+
const label = file.path.split("/").pop().replace(/\.md$/, "");
|
|
411
|
+
nodes.push({ id: noteName, label });
|
|
412
|
+
noteNames.add(noteName.toLowerCase());
|
|
413
|
+
}
|
|
414
|
+
// Extract links and create edges
|
|
415
|
+
for (const file of mdFiles) {
|
|
416
|
+
try {
|
|
417
|
+
const content = await client.getFile(file.path);
|
|
418
|
+
const links = extractInternalLinks(content);
|
|
419
|
+
const sourceName = file.path.replace(/\.md$/, "");
|
|
420
|
+
for (const link of links) {
|
|
421
|
+
if (!link.isEmbed) {
|
|
422
|
+
const target = link.target.split("#")[0];
|
|
423
|
+
// Only add edge if target exists in our nodes
|
|
424
|
+
if (noteNames.has(target.toLowerCase())) {
|
|
425
|
+
edges.push({
|
|
426
|
+
source: sourceName,
|
|
427
|
+
target,
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
catch {
|
|
434
|
+
// Skip files that can't be read
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return {
|
|
438
|
+
content: [
|
|
439
|
+
{
|
|
440
|
+
type: "text",
|
|
441
|
+
text: JSON.stringify({
|
|
442
|
+
success: true,
|
|
443
|
+
folder: folder || "/",
|
|
444
|
+
nodeCount: nodes.length,
|
|
445
|
+
edgeCount: edges.length,
|
|
446
|
+
nodes,
|
|
447
|
+
edges,
|
|
448
|
+
}, null, 2),
|
|
449
|
+
},
|
|
450
|
+
],
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
catch (error) {
|
|
454
|
+
const message = error instanceof ObsidianApiError ? error.message : String(error);
|
|
455
|
+
return {
|
|
456
|
+
content: [
|
|
457
|
+
{
|
|
458
|
+
type: "text",
|
|
459
|
+
text: `Error getting graph data: ${message}`,
|
|
460
|
+
},
|
|
461
|
+
],
|
|
462
|
+
isError: true,
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/tools/links.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================================
|
|
3
|
+
* OBSIDIAN MCP - Metadata Tools
|
|
4
|
+
* ============================================================================
|
|
5
|
+
*
|
|
6
|
+
* Tools for managing note metadata: frontmatter, tags, aliases, and properties.
|
|
7
|
+
* ============================================================================
|
|
8
|
+
*/
|
|
9
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
10
|
+
import { ObsidianClient } from "../utils/client.js";
|
|
11
|
+
/**
|
|
12
|
+
* Register metadata tools with the MCP server.
|
|
13
|
+
*
|
|
14
|
+
* @param server - The MCP server instance
|
|
15
|
+
* @param client - The Obsidian API client
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerMetadataTools(server: McpServer, client: ObsidianClient): void;
|
|
18
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAYpD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAojBrF"}
|