obsidian-native-mcp 1.3.0 → 1.4.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/CHANGELOG.md +2 -2
- package/README.md +80 -7
- package/dist/audit/log.js.map +1 -1
- package/dist/cli/index.js +40 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/config.js +36 -0
- package/dist/config.js.map +1 -0
- package/dist/fs/walk.js +7 -3
- package/dist/fs/walk.js.map +1 -1
- package/dist/handlers/registry.js.map +1 -1
- package/dist/mcp/server.js +39 -7
- package/dist/mcp/server.js.map +1 -1
- package/dist/plugin/main.js +334 -73
- package/dist/plugin/main.js.map +1 -1
- package/dist/plugin/manifest.json +1 -1
- package/dist/plugin/settings.js +50 -0
- package/dist/plugin/settings.js.map +1 -1
- package/dist/tools/read.js +139 -6
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/write-bulk.js +15 -0
- package/dist/tools/write-bulk.js.map +1 -1
- package/dist/utils/types.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/scripts/benchmark-search.mjs +179 -0
- package/src/audit/log.ts +6 -0
- package/src/cli/index.ts +38 -9
- package/src/config.ts +63 -0
- package/src/fs/walk.ts +7 -2
- package/src/handlers/registry.ts +5 -0
- package/src/mcp/server.ts +44 -7
- package/src/plugin/main.ts +21 -0
- package/src/plugin/settings.ts +67 -0
- package/src/tools/read.ts +160 -6
- package/src/tools/write-bulk.ts +22 -0
- package/src/utils/types.ts +2 -0
- package/tests/helpers/sandbox.ts +12 -1
- package/tests/scenarios/S16-budget-exceeded.test.ts +177 -0
- package/tests/scenarios/S17-per-call-budget.test.ts +161 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# [1.
|
|
1
|
+
# [1.4.0](https://github.com/usrivastava92/obsidian-native-mcp/compare/v1.3.0...v1.4.0) (2026-05-23)
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
### Features
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
* cooperative budgets + deadlines for long-walk tools ([d99e871](https://github.com/usrivastava92/obsidian-native-mcp/commit/d99e8717c3dcec0199cb9084fd264f509c8f679c))
|
package/README.md
CHANGED
|
@@ -64,6 +64,15 @@ npm run build
|
|
|
64
64
|
|
|
65
65
|
Auto-discovers all your Obsidian vaults from Obsidian's own config. Pick which to expose in plugin settings. Plugin also surfaces a bearer token and the MCP URL.
|
|
66
66
|
|
|
67
|
+
A **Performance budgets** section in plugin settings lets you cap long-running operations. All limits default to `0 = unlimited` — raise or lower them freely without restriction.
|
|
68
|
+
|
|
69
|
+
| Setting | Description |
|
|
70
|
+
| ----------------- | ------------------------------------------------------------------------------ |
|
|
71
|
+
| Max files scanned | Max `.md` files scanned per `search.content` / `vault.info` call |
|
|
72
|
+
| Max bytes read | Max raw bytes of file content read per call |
|
|
73
|
+
| Max bulk ops | Max ops accepted by a single `bulk.apply` call |
|
|
74
|
+
| Deadline (ms) | Wall-clock time limit for long-walk tools (best-effort; checked once per file) |
|
|
75
|
+
|
|
67
76
|
### CLI
|
|
68
77
|
|
|
69
78
|
Either an env var or a config file.
|
|
@@ -95,6 +104,19 @@ obsidian-native-mcp --vault notes=/path # ad-hoc named vault
|
|
|
95
104
|
obsidian-native-mcp --config ./my.json # explicit config file
|
|
96
105
|
```
|
|
97
106
|
|
|
107
|
+
#### Performance budget env vars
|
|
108
|
+
|
|
109
|
+
All default to `0` (unlimited). Set any to a positive integer to cap that resource:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
MCP_MAX_FILES_SCANNED=500 # files per search.content / vault.info call
|
|
113
|
+
MCP_MAX_BYTES_READ=10000000 # raw bytes per call (~10 MB)
|
|
114
|
+
MCP_MAX_BULK_OPS=50 # ops per bulk.apply call
|
|
115
|
+
MCP_DEADLINE_MS=30000 # wall-clock ms ceiling for long-walk tools
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
These are _defaults_ — they are never enforced as hard system limits. Set them to whatever makes sense for your vault and workflow.
|
|
119
|
+
|
|
98
120
|
## Usage
|
|
99
121
|
|
|
100
122
|
### Obsidian plugin
|
|
@@ -135,7 +157,7 @@ All tools accept an optional `vault` parameter; with a single vault configured,
|
|
|
135
157
|
| Tool | What it returns | Notes |
|
|
136
158
|
| ----------------- | ------------------------------------------------ | ------------------------------------------------ |
|
|
137
159
|
| `vault.list` | All configured vaults | — |
|
|
138
|
-
| `vault.info` | Stats per vault |
|
|
160
|
+
| `vault.info` | Stats per vault | `_budget` supported |
|
|
139
161
|
| `file.list` | Paged file listing | `recursive`, `pattern` (glob), `limit`, `offset` |
|
|
140
162
|
| `file.find` | Find files by name | exact / substring / glob / regex |
|
|
141
163
|
| `file.read` | Full file content + `contentHash` + `totalLines` | Use freely — guidelines/AGENTS.md/etc. |
|
|
@@ -147,7 +169,7 @@ All tools accept an optional `vault` parameter; with a single vault configured,
|
|
|
147
169
|
| `tags.list` | Tags from frontmatter + body | Code-fence aware |
|
|
148
170
|
| `links.get` | Outlinks, backlinks, or both | Typed: wiki/embed/header/block/markdown |
|
|
149
171
|
| `metadata.read` | Frontmatter + headings + tags + links + hashes | One-shot context dump |
|
|
150
|
-
| `search.content` | Paged full-text matches with per-line hashes |
|
|
172
|
+
| `search.content` | Paged full-text matches with per-line hashes | `_budget` supported; pre-filters before parse |
|
|
151
173
|
|
|
152
174
|
### Write tools — surgical primaries
|
|
153
175
|
|
|
@@ -182,11 +204,39 @@ All tools accept an optional `vault` parameter; with a single vault configured,
|
|
|
182
204
|
|
|
183
205
|
### Power & batch
|
|
184
206
|
|
|
185
|
-
| Tool | Notes
|
|
186
|
-
| --------------- |
|
|
187
|
-
| `bulk.apply` | Multi-file, multi-op batch. `atomic: true` → snapshot + rollback
|
|
188
|
-
| `regex.replace` | Two-step: server returns proposal token + diff → caller confirms
|
|
189
|
-
| `file.diff` | Diff between two `contentHash` versions (when cache has them)
|
|
207
|
+
| Tool | Notes |
|
|
208
|
+
| --------------- | ------------------------------------------------------------------------------------- |
|
|
209
|
+
| `bulk.apply` | Multi-file, multi-op batch. `atomic: true` → snapshot + rollback. `_budget` supported |
|
|
210
|
+
| `regex.replace` | Two-step: server returns proposal token + diff → caller confirms |
|
|
211
|
+
| `file.diff` | Diff between two `contentHash` versions (when cache has them) |
|
|
212
|
+
|
|
213
|
+
### Per-call budget overrides (`_budget`)
|
|
214
|
+
|
|
215
|
+
`vault.info`, `search.content`, and `bulk.apply` all accept an optional `_budget` object that overrides the server-level config **for that single call only**. This lets an AI agent tighten or relax limits based on what it knows about the task:
|
|
216
|
+
|
|
217
|
+
```json
|
|
218
|
+
{
|
|
219
|
+
"tool": "search.content",
|
|
220
|
+
"arguments": {
|
|
221
|
+
"query": "important term",
|
|
222
|
+
"directory": "Projects/",
|
|
223
|
+
"_budget": {
|
|
224
|
+
"maxFilesScanned": 200,
|
|
225
|
+
"maxBytesRead": 5000000,
|
|
226
|
+
"deadlineMs": 10000
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
| Field | Applies to | Description |
|
|
233
|
+
| ----------------- | ------------------------------ | --------------------------------------------------- |
|
|
234
|
+
| `maxFilesScanned` | `vault.info`, `search.content` | Max `.md` files to scan this call (0 = unlimited) |
|
|
235
|
+
| `maxBytesRead` | `vault.info`, `search.content` | Max raw bytes to read this call (0 = unlimited) |
|
|
236
|
+
| `deadlineMs` | `vault.info`, `search.content` | Wall-clock limit in ms for this call (0 = no limit) |
|
|
237
|
+
| `maxBulkOps` | `bulk.apply` | Max ops for this batch (0 = unlimited) |
|
|
238
|
+
|
|
239
|
+
When a budget is hit, the tool returns `truncated: true` with a `hint` and (for `search.content`) a `nextOffset` the agent can use to resume pagination. No error is thrown — the agent gets partial results and can decide what to do next.
|
|
190
240
|
|
|
191
241
|
### Prompts
|
|
192
242
|
|
|
@@ -233,6 +283,29 @@ Every mutating call appends one JSONL line to `<vault>/.obsidian/plugins/obsidia
|
|
|
233
283
|
}
|
|
234
284
|
```
|
|
235
285
|
|
|
286
|
+
Long-walk tools (`search.content`, `vault.info`) also emit telemetry fields:
|
|
287
|
+
|
|
288
|
+
```json
|
|
289
|
+
{
|
|
290
|
+
"ts": "2026-05-21T13:00:01Z",
|
|
291
|
+
"tool": "search.content",
|
|
292
|
+
"vault": "notes",
|
|
293
|
+
"duration_ms": 412,
|
|
294
|
+
"files_scanned": 347,
|
|
295
|
+
"bytes_read": 2891024,
|
|
296
|
+
"truncated": true,
|
|
297
|
+
"abort_reason": "budget"
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
| Field | Description |
|
|
302
|
+
| --------------- | ---------------------------------------------------------------------------- |
|
|
303
|
+
| `duration_ms` | Wall-clock time for the operation in milliseconds |
|
|
304
|
+
| `files_scanned` | Number of `.md` files read (after pre-filter; excludes cache hits on misses) |
|
|
305
|
+
| `bytes_read` | Raw bytes of file content read before mdast parsing |
|
|
306
|
+
| `truncated` | `true` if the operation was cut short by a budget or deadline |
|
|
307
|
+
| `abort_reason` | `"budget"` · `"deadline"` · `"cancelled"` — why it stopped early |
|
|
308
|
+
|
|
236
309
|
Rotates at 5 MB by default.
|
|
237
310
|
|
|
238
311
|
## Security
|
package/dist/audit/log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/audit/log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,GAAG,GAAG,iDAAiD,CAAC;AAC9D,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACnC,MAAM,aAAa,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/audit/log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,GAAG,GAAG,iDAAiD,CAAC;AAC9D,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACnC,MAAM,aAAa,GAAG,CAAC,CAAC;AAqBxB,MAAM,OAAO,QAAQ;IACC;IAApB,YAAoB,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAEzC,KAAK,CAAC,MAAM,CAAC,KAA6B;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;QAC/E,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,GAAG;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAiB,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAa;QAC3B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1B,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,QAAgB;QAC3C,IAAI,IAA6B,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS;YAAE,OAAO;QAClC,oBAAoB;QACpB,KAAK,IAAI,CAAC,GAAG,aAAa,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,GAAG,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;CACF;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACpE,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAClG,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -22,6 +22,7 @@ import { AuditLog } from "../audit/log.js";
|
|
|
22
22
|
import { ToolRegistry } from "../handlers/registry.js";
|
|
23
23
|
import { registerAll } from "../tools/index.js";
|
|
24
24
|
import { FsPromptsProvider } from "../prompts/provider.js";
|
|
25
|
+
import { configFromEnv } from "../config.js";
|
|
25
26
|
function parseFlags(argv) {
|
|
26
27
|
const flags = { readOnly: false, initialVaults: [] };
|
|
27
28
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -82,6 +83,7 @@ async function main() {
|
|
|
82
83
|
const toolReg = new ToolRegistry();
|
|
83
84
|
registerAll(toolReg);
|
|
84
85
|
const promptsProvider = new FsPromptsProvider(registry);
|
|
86
|
+
const serverConfig = configFromEnv();
|
|
85
87
|
// ------------------------------------------------------------------
|
|
86
88
|
// Wire everything into the official MCP SDK Server
|
|
87
89
|
// ------------------------------------------------------------------
|
|
@@ -98,7 +100,7 @@ async function main() {
|
|
|
98
100
|
return { tools };
|
|
99
101
|
});
|
|
100
102
|
// tools/call
|
|
101
|
-
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
103
|
+
server.setRequestHandler(CallToolRequestSchema, async (req, extra) => {
|
|
102
104
|
const name = req.params.name;
|
|
103
105
|
const args = (req.params.arguments ?? {});
|
|
104
106
|
const vaultName = typeof args.vault === "string" ? args.vault : undefined;
|
|
@@ -112,17 +114,46 @@ async function main() {
|
|
|
112
114
|
content: [{ type: "text", text: e.message }],
|
|
113
115
|
};
|
|
114
116
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
// The SDK passes an AbortSignal via extra.signal when the client sends
|
|
118
|
+
// notifications/cancelled. Wire a deadline on top if configured.
|
|
119
|
+
const ac = new AbortController();
|
|
120
|
+
const sdkSignal = extra.signal;
|
|
121
|
+
if (sdkSignal) {
|
|
122
|
+
if (sdkSignal.aborted)
|
|
123
|
+
ac.abort(sdkSignal.reason);
|
|
124
|
+
else
|
|
125
|
+
sdkSignal.addEventListener("abort", () => ac.abort(sdkSignal.reason), { once: true });
|
|
126
|
+
}
|
|
127
|
+
let deadlineTimer;
|
|
128
|
+
if (serverConfig.deadlineMs > 0) {
|
|
129
|
+
deadlineTimer = setTimeout(() => ac.abort("deadline"), serverConfig.deadlineMs);
|
|
130
|
+
}
|
|
131
|
+
const ctx = {
|
|
132
|
+
vault,
|
|
133
|
+
perms,
|
|
134
|
+
cache,
|
|
135
|
+
audit,
|
|
136
|
+
registry,
|
|
137
|
+
clientId: "stdio",
|
|
138
|
+
config: serverConfig,
|
|
139
|
+
signal: ac.signal,
|
|
140
|
+
};
|
|
141
|
+
try {
|
|
142
|
+
const result = await toolReg.invoke(name, args, ctx);
|
|
143
|
+
if (!result.ok) {
|
|
144
|
+
return {
|
|
145
|
+
isError: true,
|
|
146
|
+
content: [{ type: "text", text: JSON.stringify(result.error) }],
|
|
147
|
+
};
|
|
148
|
+
}
|
|
118
149
|
return {
|
|
119
|
-
|
|
120
|
-
content: [{ type: "text", text: JSON.stringify(result.error) }],
|
|
150
|
+
content: [{ type: "text", text: JSON.stringify(result.result) }],
|
|
121
151
|
};
|
|
122
152
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
153
|
+
finally {
|
|
154
|
+
if (deadlineTimer !== undefined)
|
|
155
|
+
clearTimeout(deadlineTimer);
|
|
156
|
+
}
|
|
126
157
|
});
|
|
127
158
|
// prompts/list
|
|
128
159
|
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-wide resource budget configuration.
|
|
3
|
+
*
|
|
4
|
+
* All limits default to 0 which means "unlimited". Operators set them via:
|
|
5
|
+
* - CLI: environment variables (MCP_MAX_FILES_SCANNED, etc.)
|
|
6
|
+
* - Plugin: PluginSettings.budgets (stored in Obsidian data.json)
|
|
7
|
+
*
|
|
8
|
+
* These are *defaults* — users are free to raise or lower them. We never
|
|
9
|
+
* enforce an upper bound on a user-supplied value.
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_CONFIG = {
|
|
12
|
+
maxFilesScanned: 0,
|
|
13
|
+
maxBytesRead: 0,
|
|
14
|
+
maxBulkOps: 0,
|
|
15
|
+
deadlineMs: 0,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Read config from environment variables. Missing / non-numeric values fall
|
|
19
|
+
* back to the supplied defaults (typically DEFAULT_CONFIG).
|
|
20
|
+
*/
|
|
21
|
+
export function configFromEnv(base = DEFAULT_CONFIG) {
|
|
22
|
+
function readInt(key, fallback) {
|
|
23
|
+
const raw = process.env[key];
|
|
24
|
+
if (raw === undefined || raw === "")
|
|
25
|
+
return fallback;
|
|
26
|
+
const n = parseInt(raw, 10);
|
|
27
|
+
return Number.isFinite(n) && n >= 0 ? n : fallback;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
maxFilesScanned: readInt("MCP_MAX_FILES_SCANNED", base.maxFilesScanned),
|
|
31
|
+
maxBytesRead: readInt("MCP_MAX_BYTES_READ", base.maxBytesRead),
|
|
32
|
+
maxBulkOps: readInt("MCP_MAX_BULK_OPS", base.maxBulkOps),
|
|
33
|
+
deadlineMs: readInt("MCP_DEADLINE_MS", base.deadlineMs),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA6BH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,eAAe,EAAE,CAAC;IAClB,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAqB,cAAc;IAC/D,SAAS,OAAO,CAAC,GAAW,EAAE,QAAgB;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,QAAQ,CAAC;QACrD,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrD,CAAC;IACD,OAAO;QACL,eAAe,EAAE,OAAO,CAAC,uBAAuB,EAAE,IAAI,CAAC,eAAe,CAAC;QACvE,YAAY,EAAE,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,YAAY,CAAC;QAC9D,UAAU,EAAE,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC;QACxD,UAAU,EAAE,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC;KACxD,CAAC;AACJ,CAAC"}
|
package/dist/fs/walk.js
CHANGED
|
@@ -15,9 +15,11 @@ export async function* walk(rootAbs, options = {}) {
|
|
|
15
15
|
const extSet = options.extensions
|
|
16
16
|
? new Set(options.extensions.map((e) => e.toLowerCase().replace(/^\./, "")))
|
|
17
17
|
: null;
|
|
18
|
-
yield* walkInner(rootAbs, rootAbs, 0, ignore, maxDepth, extSet, options.filter);
|
|
18
|
+
yield* walkInner(rootAbs, rootAbs, 0, ignore, maxDepth, extSet, options.filter, options.signal);
|
|
19
19
|
}
|
|
20
|
-
async function* walkInner(rootAbs, curAbs, depth, ignore, maxDepth, extSet, filter) {
|
|
20
|
+
async function* walkInner(rootAbs, curAbs, depth, ignore, maxDepth, extSet, filter, signal) {
|
|
21
|
+
if (signal?.aborted)
|
|
22
|
+
return;
|
|
21
23
|
let entries;
|
|
22
24
|
try {
|
|
23
25
|
entries = await fs.readdir(curAbs, { withFileTypes: true });
|
|
@@ -26,6 +28,8 @@ async function* walkInner(rootAbs, curAbs, depth, ignore, maxDepth, extSet, filt
|
|
|
26
28
|
return;
|
|
27
29
|
}
|
|
28
30
|
for (const ent of entries) {
|
|
31
|
+
if (signal?.aborted)
|
|
32
|
+
return;
|
|
29
33
|
if (ignore.has(ent.name))
|
|
30
34
|
continue;
|
|
31
35
|
const childAbs = path.join(curAbs, ent.name);
|
|
@@ -46,7 +50,7 @@ async function* walkInner(rootAbs, curAbs, depth, ignore, maxDepth, extSet, filt
|
|
|
46
50
|
if (!filter || filter(e))
|
|
47
51
|
yield e;
|
|
48
52
|
if (depth < maxDepth) {
|
|
49
|
-
yield* walkInner(rootAbs, childAbs, depth + 1, ignore, maxDepth, extSet, filter);
|
|
53
|
+
yield* walkInner(rootAbs, childAbs, depth + 1, ignore, maxDepth, extSet, filter, signal);
|
|
50
54
|
}
|
|
51
55
|
}
|
|
52
56
|
else if (ent.isFile()) {
|
package/dist/fs/walk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/fs/walk.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/fs/walk.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/handlers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/handlers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA8ChD,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAElD,QAAQ,CAAO,GAAyB;QACtC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAgC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,aAAyC;QAC5C,MAAM,GAAG,GAAqB,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAS;YACtD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,MAAM,CACV,IAAY,EACZ,IAA6B,EAC7B,GAAgB;QAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,IAAI,EAAE,EAAE;aAClE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAa,EAAE,GAAG,CAAC,CAAC;YACrD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;gBAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE;aAC7D,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -13,7 +13,11 @@
|
|
|
13
13
|
* - prompts/get
|
|
14
14
|
*/
|
|
15
15
|
import { failure, success, ErrorCode, } from "./protocol.js";
|
|
16
|
+
import { DEFAULT_CONFIG } from "../config.js";
|
|
16
17
|
export function createServer(opts) {
|
|
18
|
+
const serverConfig = opts.config ?? DEFAULT_CONFIG;
|
|
19
|
+
// Track in-flight requests so notifications/cancelled can abort them.
|
|
20
|
+
const inFlight = new Map();
|
|
17
21
|
return {
|
|
18
22
|
async handleRequest(req, clientId) {
|
|
19
23
|
// Notifications: respond with null (transport will ack but not send).
|
|
@@ -33,6 +37,14 @@ export function createServer(opts) {
|
|
|
33
37
|
});
|
|
34
38
|
case "notifications/initialized":
|
|
35
39
|
return null;
|
|
40
|
+
case "notifications/cancelled": {
|
|
41
|
+
// MCP cancellation: abort the matching in-flight request if present.
|
|
42
|
+
const p = (req.params ?? {});
|
|
43
|
+
if (p.requestId != null) {
|
|
44
|
+
inFlight.get(p.requestId)?.abort("cancelled");
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
36
48
|
case "tools/list": {
|
|
37
49
|
const tools = opts.tools
|
|
38
50
|
.list((name) => opts.perms.isToolEnabled(name))
|
|
@@ -56,6 +68,16 @@ export function createServer(opts) {
|
|
|
56
68
|
catch (e) {
|
|
57
69
|
return failure(req.id ?? null, ErrorCode.InvalidParams, e.message);
|
|
58
70
|
}
|
|
71
|
+
// Build AbortController: fired by notifications/cancelled or deadline.
|
|
72
|
+
const ac = new AbortController();
|
|
73
|
+
const reqId = req.id;
|
|
74
|
+
if (reqId != null)
|
|
75
|
+
inFlight.set(reqId, ac);
|
|
76
|
+
// Optional wall-clock deadline — wired to same AbortController.
|
|
77
|
+
let deadlineTimer;
|
|
78
|
+
if (serverConfig.deadlineMs > 0) {
|
|
79
|
+
deadlineTimer = setTimeout(() => ac.abort("deadline"), serverConfig.deadlineMs);
|
|
80
|
+
}
|
|
59
81
|
const ctx = {
|
|
60
82
|
vault,
|
|
61
83
|
perms: opts.perms,
|
|
@@ -63,17 +85,27 @@ export function createServer(opts) {
|
|
|
63
85
|
audit: opts.audit,
|
|
64
86
|
registry: opts.registry,
|
|
65
87
|
clientId,
|
|
88
|
+
config: serverConfig,
|
|
89
|
+
signal: ac.signal,
|
|
66
90
|
};
|
|
67
|
-
|
|
68
|
-
|
|
91
|
+
try {
|
|
92
|
+
const result = await opts.tools.invoke(name, args, ctx);
|
|
93
|
+
if (!result.ok) {
|
|
94
|
+
return success(req.id ?? null, {
|
|
95
|
+
isError: true,
|
|
96
|
+
content: [{ type: "text", text: JSON.stringify(result.error) }],
|
|
97
|
+
});
|
|
98
|
+
}
|
|
69
99
|
return success(req.id ?? null, {
|
|
70
|
-
|
|
71
|
-
content: [{ type: "text", text: JSON.stringify(result.error) }],
|
|
100
|
+
content: [{ type: "text", text: JSON.stringify(result.result) }],
|
|
72
101
|
});
|
|
73
102
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
103
|
+
finally {
|
|
104
|
+
if (deadlineTimer !== undefined)
|
|
105
|
+
clearTimeout(deadlineTimer);
|
|
106
|
+
if (reqId != null)
|
|
107
|
+
inFlight.delete(reqId);
|
|
108
|
+
}
|
|
77
109
|
}
|
|
78
110
|
case "prompts/list": {
|
|
79
111
|
if (!opts.promptsProvider) {
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,OAAO,EACP,OAAO,EACP,SAAS,GAGV,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|