obsidian-native-mcp 1.3.0 → 1.4.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/CHANGELOG.md +3 -3
- package/DEVELOPER.md +2 -2
- package/README.md +82 -9
- package/dist/audit/log.js +2 -2
- 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 +335 -74
- package/dist/plugin/main.js.map +1 -1
- package/dist/plugin/manifest.json +3 -3
- 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 +3 -3
- package/package.json +1 -1
- package/scripts/benchmark-search.mjs +179 -0
- package/src/audit/log.ts +8 -2
- 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/integration/audit.test.ts +1 -1
- package/tests/scenarios/S16-budget-exceeded.test.ts +177 -0
- package/tests/scenarios/S17-per-call-budget.test.ts +161 -0
- package/DESIGN_V1.md +0 -583
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
## [1.4.1](https://github.com/usrivastava92/obsidian-native-mcp/compare/v1.4.0...v1.4.1) (2026-05-24)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
###
|
|
4
|
+
### Bug Fixes
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
* **plugin:** rename manifest identity for community submission ([e78fc27](https://github.com/usrivastava92/obsidian-native-mcp/commit/e78fc27cc68e7b4ca8d32d481ab014cb7875d9cb))
|
package/DEVELOPER.md
CHANGED
|
@@ -102,7 +102,7 @@ Then pipe in Content-Length framed JSON-RPC requests on stdin. The `tests/helper
|
|
|
102
102
|
### Testing the Plugin
|
|
103
103
|
|
|
104
104
|
1. `npm run build:plugin`
|
|
105
|
-
2. Copy `dist/plugin/` to `<your-vault>/.obsidian/plugins/
|
|
105
|
+
2. Copy `dist/plugin/` to `<your-vault>/.obsidian/plugins/native-mcp/`
|
|
106
106
|
3. Reload Obsidian, enable in Community Plugins, open settings tab.
|
|
107
107
|
|
|
108
108
|
## Adding a new tool
|
|
@@ -203,7 +203,7 @@ Server → Client: Heartbeat events keep the connection alive; idle sessions ar
|
|
|
203
203
|
## Logs and auditing
|
|
204
204
|
|
|
205
205
|
- **Stderr logs** are key=value structured (`component=http session=abc msg="…"`), safe to ship to journald, OpsAgent, etc.
|
|
206
|
-
- **Audit log** is JSONL at `<vault>/.obsidian/plugins/
|
|
206
|
+
- **Audit log** is JSONL at `<vault>/.obsidian/plugins/native-mcp/audit.log`, one line per mutating call. Use it for forensic analysis and regression replays.
|
|
207
207
|
|
|
208
208
|
## See also
|
|
209
209
|
|
package/README.md
CHANGED
|
@@ -39,7 +39,7 @@ The defining design goal is **minimize how many bytes the LLM has to push around
|
|
|
39
39
|
### Obsidian plugin (recommended)
|
|
40
40
|
|
|
41
41
|
1. Open Obsidian → Settings → Community Plugins → Browse
|
|
42
|
-
2. Search for "
|
|
42
|
+
2. Search for "Native MCP" and install
|
|
43
43
|
3. Enable in Community Plugins
|
|
44
44
|
4. Open plugin settings: select which vaults to expose, optionally toggle per-tool permissions, copy the MCP URL
|
|
45
45
|
|
|
@@ -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
|
|
|
@@ -217,7 +267,7 @@ The model refreshes from the new hash and retries. No silent clobbering.
|
|
|
217
267
|
|
|
218
268
|
## Audit log
|
|
219
269
|
|
|
220
|
-
Every mutating call appends one JSONL line to `<vault>/.obsidian/plugins/
|
|
270
|
+
Every mutating call appends one JSONL line to `<vault>/.obsidian/plugins/native-mcp/audit.log`:
|
|
221
271
|
|
|
222
272
|
```json
|
|
223
273
|
{
|
|
@@ -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
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* JSONL audit log for mutating tool calls.
|
|
3
3
|
*
|
|
4
|
-
* <vault>/.obsidian/plugins/
|
|
4
|
+
* <vault>/.obsidian/plugins/native-mcp/audit.log
|
|
5
5
|
*
|
|
6
6
|
* Each entry contains: ts, tool, vault, file, args_hash, before_hash,
|
|
7
7
|
* after_hash, dry_run, client_id. We don't log raw args (could leak note
|
|
@@ -14,7 +14,7 @@ import * as fs from "node:fs/promises";
|
|
|
14
14
|
import * as path from "node:path";
|
|
15
15
|
import { createHash } from "node:crypto";
|
|
16
16
|
import { ensureDir } from "../fs/io.js";
|
|
17
|
-
const REL = ".obsidian/plugins/
|
|
17
|
+
const REL = ".obsidian/plugins/native-mcp/audit.log";
|
|
18
18
|
const MAX_BYTES = 10 * 1024 * 1024;
|
|
19
19
|
const MAX_ROTATIONS = 5;
|
|
20
20
|
export class AuditLog {
|
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,
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/audit/log.ts"],"names":[],"mappings":"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"}
|
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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"}
|