obsidian-mcp-server 3.6.1 → 3.7.1
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/AGENTS.md +40 -22
- package/CLAUDE.md +40 -22
- package/Dockerfile +3 -3
- package/README.md +29 -17
- package/changelog/3.7.x/3.7.0.md +34 -0
- package/changelog/3.7.x/3.7.1.md +40 -0
- package/dist/config/server-config.d.ts +1 -0
- package/dist/config/server-config.d.ts.map +1 -1
- package/dist/config/server-config.js +5 -1
- package/dist/config/server-config.js.map +1 -1
- package/dist/index.js +35 -35
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +20 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +40 -0
- package/dist/instructions.js.map +1 -0
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts +7 -5
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js +12 -8
- package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js.map +1 -1
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts +69 -9
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js +88 -7
- package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +256 -309
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/index.js +9 -3
- package/dist/mcp-server/tools/definitions/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts +6 -0
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js +12 -4
- package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts +107 -10
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js +237 -162
- package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts +1 -0
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js +70 -24
- package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts +6 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js +8 -10
- package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts +7 -5
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js +13 -7
- package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js +6 -4
- package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js +4 -2
- package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts +4 -1
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js +15 -4
- package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js +2 -2
- package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js +4 -2
- package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts +26 -2
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js +47 -15
- package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts +5 -0
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js +21 -4
- package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js.map +1 -1
- package/dist/services/obsidian/frontmatter-ops.d.ts +15 -1
- package/dist/services/obsidian/frontmatter-ops.d.ts.map +1 -1
- package/dist/services/obsidian/frontmatter-ops.js +55 -10
- package/dist/services/obsidian/frontmatter-ops.js.map +1 -1
- package/dist/services/obsidian/jsonlogic-evaluator.d.ts +83 -0
- package/dist/services/obsidian/jsonlogic-evaluator.d.ts.map +1 -0
- package/dist/services/obsidian/jsonlogic-evaluator.js +192 -0
- package/dist/services/obsidian/jsonlogic-evaluator.js.map +1 -0
- package/dist/services/obsidian/jsonlogic-worker.d.ts +53 -0
- package/dist/services/obsidian/jsonlogic-worker.d.ts.map +1 -0
- package/dist/services/obsidian/jsonlogic-worker.js +237 -0
- package/dist/services/obsidian/jsonlogic-worker.js.map +1 -0
- package/dist/services/obsidian/obsidian-service.d.ts +61 -6
- package/dist/services/obsidian/obsidian-service.d.ts.map +1 -1
- package/dist/services/obsidian/obsidian-service.js +301 -53
- package/dist/services/obsidian/obsidian-service.js.map +1 -1
- package/dist/services/obsidian/patch-instruction.d.ts +20 -1
- package/dist/services/obsidian/patch-instruction.d.ts.map +1 -1
- package/dist/services/obsidian/patch-instruction.js +30 -0
- package/dist/services/obsidian/patch-instruction.js.map +1 -1
- package/dist/services/obsidian/path-policy.d.ts +55 -5
- package/dist/services/obsidian/path-policy.d.ts.map +1 -1
- package/dist/services/obsidian/path-policy.js +143 -19
- package/dist/services/obsidian/path-policy.js.map +1 -1
- package/dist/services/obsidian/section-extractor.d.ts +24 -0
- package/dist/services/obsidian/section-extractor.d.ts.map +1 -1
- package/dist/services/obsidian/section-extractor.js +37 -0
- package/dist/services/obsidian/section-extractor.js.map +1 -1
- package/dist/services/obsidian/types.d.ts +12 -3
- package/dist/services/obsidian/types.d.ts.map +1 -1
- package/manifest.json +10 -2
- package/package.json +18 -14
- package/server.json +19 -5
|
@@ -4,14 +4,23 @@
|
|
|
4
4
|
* 1. **Case-insensitive fallback.** If a path lookup 404s, list the parent
|
|
5
5
|
* directory and look for a single case-insensitive filename match. If
|
|
6
6
|
* found, retry against the canonical filesystem path (matches v2.x
|
|
7
|
-
* behavior)
|
|
8
|
-
*
|
|
7
|
+
* behavior) and report the path that was asked for as `requestedPath`, so
|
|
8
|
+
* the caller can disclose the substitution. The fallback is reachable on
|
|
9
|
+
* every host: the plugin's `note+json` and document-map reads resolve
|
|
10
|
+
* through Obsidian's case-sensitive vault index even on a case-insensitive
|
|
11
|
+
* filesystem (macOS, Windows). Only the raw-markdown read case-folds there,
|
|
12
|
+
* answering 200 for a wrong-case path before any fallback runs.
|
|
9
13
|
*
|
|
10
14
|
* 2. **"Did you mean" suggestions.** When no case match exists but the parent
|
|
11
15
|
* directory has near-matches (e.g., extension-stripped variants), re-throw
|
|
12
16
|
* NotFound enriched with the candidates in the message and
|
|
13
17
|
* `error.data.suggestions[]`.
|
|
14
18
|
*
|
|
19
|
+
* 3. **Case-variant naming on writes.** A whole-file write never substitutes
|
|
20
|
+
* a path, but on a case-insensitive filesystem a write to a case variant of
|
|
21
|
+
* an existing note is refused (`case_variant_exists`); the same listing
|
|
22
|
+
* names the note it collided with as `existingPath`.
|
|
23
|
+
*
|
|
15
24
|
* `obsidian_get_note` and `obsidian_open_in_ui` wrap their service calls with
|
|
16
25
|
* `withCaseFallback`; writes and deletes match the exact path.
|
|
17
26
|
* @module mcp-server/tools/definitions/_shared/suggest-paths
|
|
@@ -26,7 +35,7 @@ const MAX_SUGGESTIONS = 5;
|
|
|
26
35
|
* For path targets:
|
|
27
36
|
* - **Exact match** → returns `{ result, resolvedPath: target.path }`.
|
|
28
37
|
* - **Single case match** → retries with the canonical path and returns
|
|
29
|
-
* `{ result, resolvedPath: <canonical
|
|
38
|
+
* `{ result, resolvedPath: <canonical>, requestedPath: target.path }`.
|
|
30
39
|
* - **Multiple case matches** → throws `Conflict` with the candidates so the
|
|
31
40
|
* agent can disambiguate.
|
|
32
41
|
* - **No case match, extension-stripped near-matches** → throws `NotFound`
|
|
@@ -35,6 +44,7 @@ const MAX_SUGGESTIONS = 5;
|
|
|
35
44
|
*
|
|
36
45
|
* `resolvedPath` is `undefined` for non-path targets — callers derive the
|
|
37
46
|
* canonical path from the result itself (typically `NoteJson.path`).
|
|
47
|
+
* `requestedPath` is present only on the single-case-match branch.
|
|
38
48
|
*/
|
|
39
49
|
export async function withCaseFallback(ctx, svc, target, fn) {
|
|
40
50
|
if (target.type !== 'path') {
|
|
@@ -51,7 +61,7 @@ export async function withCaseFallback(ctx, svc, target, fn) {
|
|
|
51
61
|
const sole = probe.caseMatches.length === 1 ? probe.caseMatches[0] : undefined;
|
|
52
62
|
if (sole !== undefined) {
|
|
53
63
|
const result = await fn({ type: 'path', path: sole });
|
|
54
|
-
return { result, resolvedPath: sole };
|
|
64
|
+
return { result, resolvedPath: sole, requestedPath: target.path };
|
|
55
65
|
}
|
|
56
66
|
if (probe.caseMatches.length > 1) {
|
|
57
67
|
const list = probe.caseMatches.map((m) => `"${m}"`).join(', ');
|
|
@@ -69,17 +79,85 @@ export async function withCaseFallback(ctx, svc, target, fn) {
|
|
|
69
79
|
throw notFound(`${prefix}. Did you mean: ${list}?`, { ...(err.data ?? {}), suggestions }, { cause: err });
|
|
70
80
|
}
|
|
71
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Disclose a `withCaseFallback` substitution on the caller's enrichment: the
|
|
84
|
+
* `requestedPath` field plus a one-line notice naming both paths. `action` is
|
|
85
|
+
* what the tool did with the canonical file. Returns the notice — `notice` is
|
|
86
|
+
* last-wins, so a caller that sets another one must fold this text into it —
|
|
87
|
+
* or `undefined` when nothing was substituted.
|
|
88
|
+
*/
|
|
89
|
+
export function discloseCaseSubstitution(ctx, fallback, action) {
|
|
90
|
+
if (fallback.requestedPath === undefined)
|
|
91
|
+
return;
|
|
92
|
+
const { requestedPath, resolvedPath } = fallback;
|
|
93
|
+
const notice = `\`${requestedPath}\` has no exact match; ${action} \`${resolvedPath}\`, the one file in that folder whose name matches it ignoring case. Write and delete tools match paths exactly — pass them \`${resolvedPath}\`.`;
|
|
94
|
+
ctx.enrich({ requestedPath });
|
|
95
|
+
ctx.enrich.notice(notice);
|
|
96
|
+
return notice;
|
|
97
|
+
}
|
|
72
98
|
/**
|
|
73
99
|
* List the parent directory of `path` and return up to {@link MAX_SUGGESTIONS}
|
|
74
100
|
* close-match candidates. Match order: case-insensitive equality first, then
|
|
75
101
|
* extension-stripped equality. Returns `[]` on listing failure or empty
|
|
76
|
-
* basename. Used by callers that need suggestions without
|
|
77
|
-
*
|
|
102
|
+
* basename. Used by callers that need suggestions without substituting a
|
|
103
|
+
* match (e.g., `obsidian_delete_note`'s exact-case miss, which names the
|
|
104
|
+
* candidates but never deletes one in place of the requested path).
|
|
78
105
|
*/
|
|
79
106
|
export async function findSimilarPaths(ctx, svc, path) {
|
|
80
107
|
const probe = await probeParentDir(ctx, svc, path);
|
|
81
108
|
return [...probe.caseMatches, ...probe.extInsensitive].slice(0, MAX_SUGGESTIONS);
|
|
82
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Read the parent folder listing for files that differ from `path` only in
|
|
112
|
+
* letter case. A listing that fails, or that the read scope withholds, reads
|
|
113
|
+
* as empty, so no path outside the read scope is ever named; the caller's
|
|
114
|
+
* cancellation propagates as itself.
|
|
115
|
+
*/
|
|
116
|
+
export async function findCaseVariants(ctx, svc, path) {
|
|
117
|
+
const { caseMatches } = await probeParentDir(ctx, svc, path);
|
|
118
|
+
const normalized = path.replace(/^\/+|\/+$/g, '');
|
|
119
|
+
return {
|
|
120
|
+
exact: caseMatches.includes(normalized),
|
|
121
|
+
variants: caseMatches.filter((match) => match !== normalized),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Message and error data for a `case_variant_exists` refusal. `existingPath`
|
|
126
|
+
* is set only when exactly one variant is listed — never picked from several,
|
|
127
|
+
* and never inferred when none is: a file Obsidian does not index (a dot-file)
|
|
128
|
+
* refuses a write the same way and never appears in a listing.
|
|
129
|
+
*/
|
|
130
|
+
export function caseVariantError(path, variants) {
|
|
131
|
+
const existingPath = variants.length === 1 ? variants[0] : undefined;
|
|
132
|
+
if (existingPath === undefined) {
|
|
133
|
+
return {
|
|
134
|
+
message: `'${path}' collides with a file already on disk: one whose name differs only in letter case, or one Obsidian does not index.`,
|
|
135
|
+
data: { path },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
message: `Note '${existingPath}' already exists, and this vault's filesystem treats '${path}' as the same file.`,
|
|
140
|
+
data: { path, existingPath },
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Run a whole-file write to `path`, and when the service refuses it as
|
|
145
|
+
* `case_variant_exists`, rethrow it naming the existing note from the parent
|
|
146
|
+
* listing. The listing is read only on that failure, so a write that succeeds
|
|
147
|
+
* costs no extra request.
|
|
148
|
+
*/
|
|
149
|
+
export async function withCaseVariantNamed(ctx, svc, path, write) {
|
|
150
|
+
try {
|
|
151
|
+
return await write();
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
if (!(err instanceof McpError) || err.data?.reason !== 'case_variant_exists')
|
|
155
|
+
throw err;
|
|
156
|
+
const { variants } = await findCaseVariants(ctx, svc, path);
|
|
157
|
+
const { message, data } = caseVariantError(path, variants);
|
|
158
|
+
throw conflict(message, { ...data, reason: 'case_variant_exists' }, { cause: err });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
83
161
|
async function probeParentDir(ctx, svc, path) {
|
|
84
162
|
const empty = { caseMatches: [], extInsensitive: [] };
|
|
85
163
|
const normalized = path.replace(/^\/+|\/+$/g, '');
|
|
@@ -95,7 +173,10 @@ async function probeParentDir(ctx, svc, path) {
|
|
|
95
173
|
const listing = await svc.listFiles(ctx, dir);
|
|
96
174
|
entries = listing.files;
|
|
97
175
|
}
|
|
98
|
-
catch {
|
|
176
|
+
catch (err) {
|
|
177
|
+
// The caller's cancellation is not a listing that came back empty.
|
|
178
|
+
if (ctx.signal?.aborted)
|
|
179
|
+
throw err;
|
|
99
180
|
return empty;
|
|
100
181
|
}
|
|
101
182
|
const baseLower = base.toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest-paths.js","sourceRoot":"","sources":["../../../../../src/mcp-server/tools/definitions/_shared/suggest-paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"suggest-paths.js","sourceRoot":"","sources":["../../../../../src/mcp-server/tools/definitions/_shared/suggest-paths.ts"],"names":[],"mappings":"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"}
|