@j0hanz/filesystem-context-mcp 1.2.6 → 1.2.7
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/dist/__tests__/lib/errors-classify.test.d.ts +2 -0
- package/dist/__tests__/lib/errors-classify.test.d.ts.map +1 -0
- package/dist/__tests__/lib/errors-classify.test.js +53 -0
- package/dist/__tests__/lib/errors-classify.test.js.map +1 -0
- package/dist/__tests__/lib/errors-detailed.test.d.ts +2 -0
- package/dist/__tests__/lib/errors-detailed.test.d.ts.map +1 -0
- package/dist/__tests__/lib/errors-detailed.test.js +38 -0
- package/dist/__tests__/lib/errors-detailed.test.js.map +1 -0
- package/dist/__tests__/lib/errors-is-node-error.test.d.ts +2 -0
- package/dist/__tests__/lib/errors-is-node-error.test.d.ts.map +1 -0
- package/dist/__tests__/lib/errors-is-node-error.test.js +21 -0
- package/dist/__tests__/lib/errors-is-node-error.test.js.map +1 -0
- package/dist/__tests__/lib/errors-mcp-error.test.d.ts +2 -0
- package/dist/__tests__/lib/errors-mcp-error.test.d.ts.map +1 -0
- package/dist/__tests__/lib/errors-mcp-error.test.js +29 -0
- package/dist/__tests__/lib/errors-mcp-error.test.js.map +1 -0
- package/dist/__tests__/lib/errors-node-map.test.d.ts +2 -0
- package/dist/__tests__/lib/errors-node-map.test.d.ts.map +1 -0
- package/dist/__tests__/lib/errors-node-map.test.js +16 -0
- package/dist/__tests__/lib/errors-node-map.test.js.map +1 -0
- package/dist/__tests__/lib/errors-suggestion.test.d.ts +2 -0
- package/dist/__tests__/lib/errors-suggestion.test.d.ts.map +1 -0
- package/dist/__tests__/lib/errors-suggestion.test.js +11 -0
- package/dist/__tests__/lib/errors-suggestion.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/analyze-directory-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/analyze-directory-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/analyze-directory-edge-cases.test.js +15 -0
- package/dist/__tests__/lib/file-operations/analyze-directory-edge-cases.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/analyze-directory.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/analyze-directory.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/analyze-directory.test.js +28 -0
- package/dist/__tests__/lib/file-operations/analyze-directory.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/directory-tree-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/directory-tree-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/directory-tree-edge-cases.test.js +29 -0
- package/dist/__tests__/lib/file-operations/directory-tree-edge-cases.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/directory-tree.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/directory-tree.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/directory-tree.test.js +75 -0
- package/dist/__tests__/lib/file-operations/directory-tree.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/get-file-info.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/get-file-info.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/get-file-info.test.js +17 -0
- package/dist/__tests__/lib/file-operations/get-file-info.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/list-directory-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/list-directory-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/list-directory-edge-cases.test.js +21 -0
- package/dist/__tests__/lib/file-operations/list-directory-edge-cases.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/list-directory.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/list-directory.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/list-directory.test.js +31 -0
- package/dist/__tests__/lib/file-operations/list-directory.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/read-media-file.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/read-media-file.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/read-media-file.test.js +21 -0
- package/dist/__tests__/lib/file-operations/read-media-file.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/read-multiple-files-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/read-multiple-files-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/read-multiple-files-edge-cases.test.js +19 -0
- package/dist/__tests__/lib/file-operations/read-multiple-files-edge-cases.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/read-multiple-files.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/read-multiple-files.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/read-multiple-files.test.js +39 -0
- package/dist/__tests__/lib/file-operations/read-multiple-files.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/search-content-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/search-content-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/search-content-edge-cases.test.js +57 -0
- package/dist/__tests__/lib/file-operations/search-content-edge-cases.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/search-content.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/search-content.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/search-content.test.js +73 -0
- package/dist/__tests__/lib/file-operations/search-content.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/search-files-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/search-files-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/search-files-edge-cases.test.js +13 -0
- package/dist/__tests__/lib/file-operations/search-files-edge-cases.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/search-files.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/search-files.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/search-files.test.js +31 -0
- package/dist/__tests__/lib/file-operations/search-files.test.js.map +1 -0
- package/dist/__tests__/lib/fixtures/file-ops-fixture.d.ts +7 -0
- package/dist/__tests__/lib/fixtures/file-ops-fixture.d.ts.map +1 -0
- package/dist/__tests__/lib/fixtures/file-ops-fixture.js +87 -0
- package/dist/__tests__/lib/fixtures/file-ops-fixture.js.map +1 -0
- package/dist/__tests__/lib/fixtures/file-ops-hooks.d.ts +2 -0
- package/dist/__tests__/lib/fixtures/file-ops-hooks.d.ts.map +1 -0
- package/dist/__tests__/lib/fixtures/file-ops-hooks.js +13 -0
- package/dist/__tests__/lib/fixtures/file-ops-hooks.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/file-type.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/file-type.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/file-type.test.js +15 -0
- package/dist/__tests__/lib/fs-helpers/file-type.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/head-file-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/head-file-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/head-file-edge-cases.test.js +19 -0
- package/dist/__tests__/lib/fs-helpers/head-file-edge-cases.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/head-file.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/head-file.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/head-file.test.js +12 -0
- package/dist/__tests__/lib/fs-helpers/head-file.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/is-hidden.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/is-hidden.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/is-hidden.test.js +7 -0
- package/dist/__tests__/lib/fs-helpers/is-hidden.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/is-probably-binary.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/is-probably-binary.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/is-probably-binary.test.js +33 -0
- package/dist/__tests__/lib/fs-helpers/is-probably-binary.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/read-file-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/read-file-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/read-file-edge-cases.test.js +41 -0
- package/dist/__tests__/lib/fs-helpers/read-file-edge-cases.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/read-file.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/read-file.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/read-file.test.js +21 -0
- package/dist/__tests__/lib/fs-helpers/read-file.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/tail-file-edge-cases.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/tail-file-edge-cases.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/tail-file-edge-cases.test.js +26 -0
- package/dist/__tests__/lib/fs-helpers/tail-file-edge-cases.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/tail-file.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/tail-file.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/tail-file.test.js +11 -0
- package/dist/__tests__/lib/fs-helpers/tail-file.test.js.map +1 -0
- package/dist/__tests__/lib/path-validation.test.js +93 -104
- package/dist/__tests__/lib/path-validation.test.js.map +1 -1
- package/dist/__tests__/schemas/validators.test.js +111 -115
- package/dist/__tests__/schemas/validators.test.js.map +1 -1
- package/dist/__tests__/security/filesystem-boundary.test.js +41 -36
- package/dist/__tests__/security/filesystem-boundary.test.js.map +1 -1
- package/dist/lib/errors.d.ts +0 -18
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +33 -34
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/file-operations/analyze-directory.d.ts.map +1 -1
- package/dist/lib/file-operations/analyze-directory.js +74 -43
- package/dist/lib/file-operations/analyze-directory.js.map +1 -1
- package/dist/lib/file-operations/directory-helpers.d.ts +2 -19
- package/dist/lib/file-operations/directory-helpers.d.ts.map +1 -1
- package/dist/lib/file-operations/directory-helpers.js +26 -90
- package/dist/lib/file-operations/directory-helpers.js.map +1 -1
- package/dist/lib/file-operations/directory-tree-helpers.d.ts +38 -0
- package/dist/lib/file-operations/directory-tree-helpers.d.ts.map +1 -0
- package/dist/lib/file-operations/directory-tree-helpers.js +167 -0
- package/dist/lib/file-operations/directory-tree-helpers.js.map +1 -0
- package/dist/lib/file-operations/directory-tree.d.ts.map +1 -1
- package/dist/lib/file-operations/directory-tree.js +44 -154
- package/dist/lib/file-operations/directory-tree.js.map +1 -1
- package/dist/lib/file-operations/list-directory-helpers.d.ts +2 -1
- package/dist/lib/file-operations/list-directory-helpers.d.ts.map +1 -1
- package/dist/lib/file-operations/list-directory-helpers.js +16 -4
- package/dist/lib/file-operations/list-directory-helpers.js.map +1 -1
- package/dist/lib/file-operations/list-directory.d.ts +4 -2
- package/dist/lib/file-operations/list-directory.d.ts.map +1 -1
- package/dist/lib/file-operations/list-directory.js +39 -17
- package/dist/lib/file-operations/list-directory.js.map +1 -1
- package/dist/lib/file-operations/pattern-validator.d.ts +0 -10
- package/dist/lib/file-operations/pattern-validator.d.ts.map +1 -1
- package/dist/lib/file-operations/pattern-validator.js +44 -43
- package/dist/lib/file-operations/pattern-validator.js.map +1 -1
- package/dist/lib/file-operations/read-multiple-files.d.ts +3 -2
- package/dist/lib/file-operations/read-multiple-files.d.ts.map +1 -1
- package/dist/lib/file-operations/read-multiple-files.js +46 -29
- package/dist/lib/file-operations/read-multiple-files.js.map +1 -1
- package/dist/lib/file-operations/search/context-manager.d.ts +2 -0
- package/dist/lib/file-operations/search/context-manager.d.ts.map +1 -1
- package/dist/lib/file-operations/search/context-manager.js +11 -6
- package/dist/lib/file-operations/search/context-manager.js.map +1 -1
- package/dist/lib/file-operations/search/engine-options.d.ts +19 -0
- package/dist/lib/file-operations/search/engine-options.d.ts.map +1 -0
- package/dist/lib/file-operations/search/engine-options.js +32 -0
- package/dist/lib/file-operations/search/engine-options.js.map +1 -0
- package/dist/lib/file-operations/search/engine-stream.d.ts +6 -0
- package/dist/lib/file-operations/search/engine-stream.d.ts.map +1 -0
- package/dist/lib/file-operations/search/engine-stream.js +130 -0
- package/dist/lib/file-operations/search/engine-stream.js.map +1 -0
- package/dist/lib/file-operations/search/engine.d.ts +1 -17
- package/dist/lib/file-operations/search/engine.d.ts.map +1 -1
- package/dist/lib/file-operations/search/engine.js +7 -117
- package/dist/lib/file-operations/search/engine.js.map +1 -1
- package/dist/lib/file-operations/search/file-processor.d.ts.map +1 -1
- package/dist/lib/file-operations/search/file-processor.js +33 -25
- package/dist/lib/file-operations/search/file-processor.js.map +1 -1
- package/dist/lib/file-operations/search/match-strategy.d.ts.map +1 -1
- package/dist/lib/file-operations/search/match-strategy.js +49 -54
- package/dist/lib/file-operations/search/match-strategy.js.map +1 -1
- package/dist/lib/file-operations/search-files-helpers.d.ts +42 -0
- package/dist/lib/file-operations/search-files-helpers.d.ts.map +1 -0
- package/dist/lib/file-operations/search-files-helpers.js +180 -0
- package/dist/lib/file-operations/search-files-helpers.js.map +1 -0
- package/dist/lib/file-operations/search-files.d.ts +2 -9
- package/dist/lib/file-operations/search-files.d.ts.map +1 -1
- package/dist/lib/file-operations/search-files.js +8 -129
- package/dist/lib/file-operations/search-files.js.map +1 -1
- package/dist/lib/file-operations/sorting.d.ts +3 -2
- package/dist/lib/file-operations/sorting.d.ts.map +1 -1
- package/dist/lib/fs-helpers/binary-detect.d.ts.map +1 -1
- package/dist/lib/fs-helpers/binary-detect.js +16 -10
- package/dist/lib/fs-helpers/binary-detect.js.map +1 -1
- package/dist/lib/fs-helpers/fs-utils.d.ts.map +1 -1
- package/dist/lib/fs-helpers/fs-utils.js +16 -10
- package/dist/lib/fs-helpers/fs-utils.js.map +1 -1
- package/dist/lib/fs-helpers/readers/line-range.d.ts +4 -2
- package/dist/lib/fs-helpers/readers/line-range.d.ts.map +1 -1
- package/dist/lib/fs-helpers/readers/line-range.js +21 -15
- package/dist/lib/fs-helpers/readers/line-range.js.map +1 -1
- package/dist/lib/fs-helpers/readers/read-file.d.ts +6 -3
- package/dist/lib/fs-helpers/readers/read-file.d.ts.map +1 -1
- package/dist/lib/fs-helpers/readers/read-file.js +58 -19
- package/dist/lib/fs-helpers/readers/read-file.js.map +1 -1
- package/dist/lib/fs-helpers/readers/tail-file.d.ts.map +1 -1
- package/dist/lib/fs-helpers/readers/tail-file.js +27 -10
- package/dist/lib/fs-helpers/readers/tail-file.js.map +1 -1
- package/dist/lib/fs-helpers/readers/utf8.d.ts.map +1 -1
- package/dist/lib/fs-helpers/readers/utf8.js +20 -10
- package/dist/lib/fs-helpers/readers/utf8.js.map +1 -1
- package/dist/lib/path-validation/allowed-directories.d.ts +1 -2
- package/dist/lib/path-validation/allowed-directories.d.ts.map +1 -1
- package/dist/lib/path-validation/allowed-directories.js +25 -15
- package/dist/lib/path-validation/allowed-directories.js.map +1 -1
- package/dist/lib/path-validation/errors.d.ts +0 -1
- package/dist/lib/path-validation/errors.d.ts.map +1 -1
- package/dist/lib/path-validation/errors.js +26 -12
- package/dist/lib/path-validation/errors.js.map +1 -1
- package/dist/lib/path-validation/validators.d.ts.map +1 -1
- package/dist/lib/path-validation/validators.js +9 -3
- package/dist/lib/path-validation/validators.js.map +1 -1
- package/dist/lib/path-validation.d.ts +1 -1
- package/dist/lib/path-validation.d.ts.map +1 -1
- package/dist/lib/path-validation.js +1 -1
- package/dist/lib/path-validation.js.map +1 -1
- package/dist/schemas/outputs.d.ts +12 -12
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +79 -35
- package/dist/server.js.map +1 -1
- package/dist/tools/analyze-directory.d.ts.map +1 -1
- package/dist/tools/analyze-directory.js +1 -30
- package/dist/tools/analyze-directory.js.map +1 -1
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +11 -32
- package/dist/tools/directory-tree.js.map +1 -1
- package/dist/tools/get-file-info.d.ts.map +1 -1
- package/dist/tools/get-file-info.js +1 -12
- package/dist/tools/get-file-info.js.map +1 -1
- package/dist/tools/list-allowed-dirs.d.ts.map +1 -1
- package/dist/tools/list-allowed-dirs.js +9 -1
- package/dist/tools/list-allowed-dirs.js.map +1 -1
- package/dist/tools/list-directory.d.ts.map +1 -1
- package/dist/tools/list-directory.js +27 -50
- package/dist/tools/list-directory.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +28 -20
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-multiple-files.d.ts.map +1 -1
- package/dist/tools/read-multiple-files.js +15 -14
- package/dist/tools/read-multiple-files.js.map +1 -1
- package/dist/tools/search-content.d.ts.map +1 -1
- package/dist/tools/search-content.js +20 -17
- package/dist/tools/search-content.js.map +1 -1
- package/dist/tools/search-files.d.ts.map +1 -1
- package/dist/tools/search-files.js +1 -27
- package/dist/tools/search-files.js.map +1 -1
- package/dist/tools/shared/formatting.d.ts +13 -0
- package/dist/tools/shared/formatting.d.ts.map +1 -0
- package/dist/tools/shared/formatting.js +31 -0
- package/dist/tools/shared/formatting.js.map +1 -0
- package/dist/tools/shared/search-formatting.d.ts.map +1 -1
- package/dist/tools/shared/search-formatting.js +32 -33
- package/dist/tools/shared/search-formatting.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utf8.d.ts","sourceRoot":"","sources":["../../../../src/lib/fs-helpers/readers/utf8.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"utf8.d.ts","sourceRoot":"","sources":["../../../../src/lib/fs-helpers/readers/utf8.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
|
@@ -3,20 +3,30 @@ export async function findUTF8Boundary(handle, position) {
|
|
|
3
3
|
return 0;
|
|
4
4
|
const backtrackSize = Math.min(4, position);
|
|
5
5
|
const startPos = position - backtrackSize;
|
|
6
|
-
const
|
|
6
|
+
const readResult = await readBacktrackBuffer(handle, backtrackSize, startPos, position);
|
|
7
|
+
if (!readResult)
|
|
8
|
+
return position;
|
|
9
|
+
const boundary = scanForBoundary(readResult.buffer, readResult.bytesRead, startPos);
|
|
10
|
+
return boundary ?? position;
|
|
11
|
+
}
|
|
12
|
+
async function readBacktrackBuffer(handle, backtrackSize, startPos, position) {
|
|
13
|
+
const buffer = Buffer.allocUnsafe(backtrackSize);
|
|
7
14
|
try {
|
|
8
|
-
const { bytesRead } = await handle.read(
|
|
9
|
-
|
|
10
|
-
const byte = buf[i];
|
|
11
|
-
if (byte !== undefined && (byte & 0xc0) !== 0x80) {
|
|
12
|
-
return startPos + i;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
+
const { bytesRead } = await handle.read(buffer, 0, backtrackSize, startPos);
|
|
16
|
+
return { buffer, bytesRead };
|
|
15
17
|
}
|
|
16
18
|
catch (error) {
|
|
17
19
|
console.error(`[findUTF8Boundary] Read error at position ${position}:`, error instanceof Error ? error.message : String(error));
|
|
18
|
-
return
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function scanForBoundary(buffer, bytesRead, startPos) {
|
|
24
|
+
for (let i = bytesRead - 1; i >= 0; i--) {
|
|
25
|
+
const byte = buffer[i];
|
|
26
|
+
if (byte !== undefined && (byte & 0xc0) !== 0x80) {
|
|
27
|
+
return startPos + i;
|
|
28
|
+
}
|
|
19
29
|
}
|
|
20
|
-
return
|
|
30
|
+
return null;
|
|
21
31
|
}
|
|
22
32
|
//# sourceMappingURL=utf8.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utf8.js","sourceRoot":"","sources":["../../../../src/lib/fs-helpers/readers/utf8.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAkB,EAClB,QAAgB;IAEhB,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC1C,MAAM,
|
|
1
|
+
{"version":3,"file":"utf8.js","sourceRoot":"","sources":["../../../../src/lib/fs-helpers/readers/utf8.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAkB,EAClB,QAAgB;IAEhB,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAC1C,MAAM,EACN,aAAa,EACb,QAAQ,EACR,QAAQ,CACT,CAAC;IACF,IAAI,CAAC,UAAU;QAAE,OAAO,QAAQ,CAAC;IAEjC,MAAM,QAAQ,GAAG,eAAe,CAC9B,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,SAAS,EACpB,QAAQ,CACT,CAAC;IACF,OAAO,QAAQ,IAAI,QAAQ,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,MAAkB,EAClB,aAAqB,EACrB,QAAgB,EAChB,QAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC5E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,6CAA6C,QAAQ,GAAG,EACxD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,MAAc,EACd,SAAiB,EACjB,QAAgB;IAEhB,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACjD,OAAO,QAAQ,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
export declare const RESERVED_DEVICE_NAMES: Set<string>;
|
|
2
2
|
export declare function normalizeForComparison(p: string): string;
|
|
3
|
-
export declare function normalizeAllowedDirectory(dir: string): string;
|
|
4
3
|
export declare function setAllowedDirectories(dirs: string[]): void;
|
|
5
4
|
export declare function getAllowedDirectories(): string[];
|
|
5
|
+
export declare function isPathWithinDirectories(normalizedPath: string, allowedDirs: string[]): boolean;
|
|
6
6
|
export declare function isPathWithinAllowedDirectories(normalizedPath: string): boolean;
|
|
7
|
-
export declare function expandAllowedDirectories(dirs: string[]): Promise<string[]>;
|
|
8
7
|
export declare function setAllowedDirectoriesResolved(dirs: string[]): Promise<void>;
|
|
9
8
|
//# sourceMappingURL=allowed-directories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"allowed-directories.d.ts","sourceRoot":"","sources":["../../../src/lib/path-validation/allowed-directories.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,qBAAqB,aAuBhC,CAAC;AAEH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;
|
|
1
|
+
{"version":3,"file":"allowed-directories.d.ts","sourceRoot":"","sources":["../../../src/lib/path-validation/allowed-directories.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,qBAAqB,aAuBhC,CAAC;AAEH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAoBD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAK1D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAYT;AAED,wBAAgB,8BAA8B,CAC5C,cAAc,EAAE,MAAM,GACrB,OAAO,CAET;AAuCD,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -35,7 +35,7 @@ function stripTrailingSeparator(normalized) {
|
|
|
35
35
|
? normalized.slice(0, -1)
|
|
36
36
|
: normalized;
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
function normalizeAllowedDirectory(dir) {
|
|
39
39
|
const normalized = normalizePath(dir);
|
|
40
40
|
if (normalized.length === 0)
|
|
41
41
|
return '';
|
|
@@ -54,9 +54,9 @@ export function setAllowedDirectories(dirs) {
|
|
|
54
54
|
export function getAllowedDirectories() {
|
|
55
55
|
return [...allowedDirectories];
|
|
56
56
|
}
|
|
57
|
-
export function
|
|
57
|
+
export function isPathWithinDirectories(normalizedPath, allowedDirs) {
|
|
58
58
|
const candidate = normalizeForComparison(normalizedPath);
|
|
59
|
-
return
|
|
59
|
+
return allowedDirs.some((allowedDir) => {
|
|
60
60
|
const allowed = normalizeForComparison(allowedDir);
|
|
61
61
|
const root = normalizeForComparison(path.parse(allowedDir).root);
|
|
62
62
|
if (allowed === root) {
|
|
@@ -65,28 +65,38 @@ export function isPathWithinAllowedDirectories(normalizedPath) {
|
|
|
65
65
|
return (candidate === allowed || candidate.startsWith(allowed + PATH_SEPARATOR));
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
-
export
|
|
68
|
+
export function isPathWithinAllowedDirectories(normalizedPath) {
|
|
69
|
+
return isPathWithinDirectories(normalizedPath, allowedDirectories);
|
|
70
|
+
}
|
|
71
|
+
async function expandAllowedDirectories(dirs) {
|
|
69
72
|
const expanded = [];
|
|
70
73
|
for (const dir of dirs) {
|
|
71
74
|
const normalized = normalizeAllowedDirectory(dir);
|
|
72
75
|
if (!normalized)
|
|
73
76
|
continue;
|
|
74
77
|
expanded.push(normalized);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (normalizedReal &&
|
|
79
|
-
normalizeForComparison(normalizedReal) !==
|
|
80
|
-
normalizeForComparison(normalized)) {
|
|
81
|
-
expanded.push(normalizedReal);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
// Keep normalized path if realpath fails
|
|
78
|
+
const normalizedReal = await resolveRealPath(normalized);
|
|
79
|
+
if (normalizedReal && shouldAddRealPath(normalized, normalizedReal)) {
|
|
80
|
+
expanded.push(normalizedReal);
|
|
86
81
|
}
|
|
87
82
|
}
|
|
88
83
|
return [...new Set(expanded)];
|
|
89
84
|
}
|
|
85
|
+
async function resolveRealPath(normalized) {
|
|
86
|
+
try {
|
|
87
|
+
const realPath = await fs.realpath(normalized);
|
|
88
|
+
return normalizeAllowedDirectory(realPath);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function shouldAddRealPath(normalized, normalizedReal) {
|
|
95
|
+
if (!normalizedReal)
|
|
96
|
+
return false;
|
|
97
|
+
return (normalizeForComparison(normalizedReal) !==
|
|
98
|
+
normalizeForComparison(normalized));
|
|
99
|
+
}
|
|
90
100
|
export async function setAllowedDirectoriesResolved(dirs) {
|
|
91
101
|
const expanded = await expandAllowedDirectories(dirs);
|
|
92
102
|
setAllowedDirectories(expanded);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"allowed-directories.js","sourceRoot":"","sources":["../../../src/lib/path-validation/allowed-directories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AAEjE,IAAI,kBAAkB,GAAa,EAAE,CAAC;AAEtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IAC3C,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CAAC,CAAS;IAC9C,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAkB;IAChD,OAAO,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;QACxC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"allowed-directories.js","sourceRoot":"","sources":["../../../src/lib/path-validation/allowed-directories.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { McpError } from '../errors.js';
|
|
2
|
-
export declare function buildAllowedDirectoriesHint(): string;
|
|
3
2
|
export declare function toMcpError(requestedPath: string, error: unknown): McpError;
|
|
4
3
|
export declare function toAccessDeniedWithHint(requestedPath: string, resolvedPath: string, normalizedResolved: string): McpError;
|
|
5
4
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/path-validation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/path-validation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,cAAc,CAAC;AAmDnD,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAsB1E;AAED,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,MAAM,GACzB,QAAQ,CAQV"}
|
|
@@ -3,26 +3,40 @@ import { getAllowedDirectories } from './allowed-directories.js';
|
|
|
3
3
|
function createMcpError(code, message, requestedPath, details, cause) {
|
|
4
4
|
return new McpError(code, message, requestedPath, details, cause);
|
|
5
5
|
}
|
|
6
|
-
|
|
6
|
+
function buildAllowedDirectoriesHint() {
|
|
7
7
|
const allowedDirs = getAllowedDirectories();
|
|
8
8
|
return allowedDirs.length > 0
|
|
9
9
|
? `Allowed directories:\n${allowedDirs.map((d) => ` - ${d}`).join('\n')}`
|
|
10
10
|
: 'No allowed directories configured. Use CLI arguments or MCP roots protocol.';
|
|
11
11
|
}
|
|
12
|
+
const NODE_ERROR_MAP = {
|
|
13
|
+
ENOENT: {
|
|
14
|
+
code: ErrorCode.E_NOT_FOUND,
|
|
15
|
+
message: (requestedPath) => `Path does not exist: ${requestedPath}`,
|
|
16
|
+
},
|
|
17
|
+
EACCES: {
|
|
18
|
+
code: ErrorCode.E_PERMISSION_DENIED,
|
|
19
|
+
message: (requestedPath) => `Permission denied accessing path: ${requestedPath}`,
|
|
20
|
+
},
|
|
21
|
+
EPERM: {
|
|
22
|
+
code: ErrorCode.E_PERMISSION_DENIED,
|
|
23
|
+
message: (requestedPath) => `Permission denied accessing path: ${requestedPath}`,
|
|
24
|
+
},
|
|
25
|
+
ELOOP: {
|
|
26
|
+
code: ErrorCode.E_SYMLINK_NOT_ALLOWED,
|
|
27
|
+
message: (requestedPath) => `Too many symbolic links in path (possible circular reference): ${requestedPath}`,
|
|
28
|
+
},
|
|
29
|
+
ENAMETOOLONG: {
|
|
30
|
+
code: ErrorCode.E_INVALID_INPUT,
|
|
31
|
+
message: (requestedPath) => `Path name too long: ${requestedPath}`,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
12
34
|
export function toMcpError(requestedPath, error) {
|
|
13
35
|
const nodeError = error;
|
|
14
36
|
const { code } = nodeError;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
if (code === 'EACCES' || code === 'EPERM') {
|
|
19
|
-
return createMcpError(ErrorCode.E_PERMISSION_DENIED, `Permission denied accessing path: ${requestedPath}`, requestedPath, { originalCode: code }, error);
|
|
20
|
-
}
|
|
21
|
-
if (code === 'ELOOP') {
|
|
22
|
-
return createMcpError(ErrorCode.E_SYMLINK_NOT_ALLOWED, `Too many symbolic links in path (possible circular reference): ${requestedPath}`, requestedPath, { originalCode: code }, error);
|
|
23
|
-
}
|
|
24
|
-
if (code === 'ENAMETOOLONG') {
|
|
25
|
-
return createMcpError(ErrorCode.E_INVALID_INPUT, `Path name too long: ${requestedPath}`, requestedPath, { originalCode: code }, error);
|
|
37
|
+
const mapping = code ? NODE_ERROR_MAP[code] : undefined;
|
|
38
|
+
if (mapping) {
|
|
39
|
+
return createMcpError(mapping.code, mapping.message(requestedPath), requestedPath, { originalCode: code }, error);
|
|
26
40
|
}
|
|
27
41
|
return createMcpError(ErrorCode.E_NOT_FOUND, `Path is not accessible: ${requestedPath}`, requestedPath, { originalCode: code, originalMessage: nodeError.message }, error);
|
|
28
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/lib/path-validation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,SAAS,cAAc,CACrB,IAAe,EACf,OAAe,EACf,aAAqB,EACrB,OAAgC,EAChC,KAAc;IAEd,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/lib/path-validation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,SAAS,cAAc,CACrB,IAAe,EACf,OAAe,EACf,aAAqB,EACrB,OAAgC,EAChC,KAAc;IAEd,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,2BAA2B;IAClC,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAC5C,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC;QAC3B,CAAC,CAAC,yBAAyB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC1E,CAAC,CAAC,6EAA6E,CAAC;AACpF,CAAC;AAED,MAAM,cAAc,GAKhB;IACF,MAAM,EAAE;QACN,IAAI,EAAE,SAAS,CAAC,WAAW;QAC3B,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,wBAAwB,aAAa,EAAE;KACpE;IACD,MAAM,EAAE;QACN,IAAI,EAAE,SAAS,CAAC,mBAAmB;QACnC,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,CACzB,qCAAqC,aAAa,EAAE;KACvD;IACD,KAAK,EAAE;QACL,IAAI,EAAE,SAAS,CAAC,mBAAmB;QACnC,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,CACzB,qCAAqC,aAAa,EAAE;KACvD;IACD,KAAK,EAAE;QACL,IAAI,EAAE,SAAS,CAAC,qBAAqB;QACrC,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,CACzB,kEAAkE,aAAa,EAAE;KACpF;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,SAAS,CAAC,eAAe;QAC/B,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,uBAAuB,aAAa,EAAE;KACnE;CACO,CAAC;AAEX,MAAM,UAAU,UAAU,CAAC,aAAqB,EAAE,KAAc;IAC9D,MAAM,SAAS,GAAG,KAA8B,CAAC;IACjD,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;IAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,cAAc,CACnB,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAC9B,aAAa,EACb,EAAE,YAAY,EAAE,IAAI,EAAE,EACtB,KAAK,CACN,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CACnB,SAAS,CAAC,WAAW,EACrB,2BAA2B,aAAa,EAAE,EAC1C,aAAa,EACb,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,CAAC,OAAO,EAAE,EAC1D,KAAK,CACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,aAAqB,EACrB,YAAoB,EACpB,kBAA0B;IAE1B,MAAM,UAAU,GAAG,2BAA2B,EAAE,CAAC;IACjD,OAAO,IAAI,QAAQ,CACjB,SAAS,CAAC,eAAe,EACzB,wBAAwB,aAAa,wCAAwC,UAAU,EAAE,EACzF,aAAa,EACb,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,CAC7D,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../src/lib/path-validation/validators.ts"],"names":[],"mappings":"AAYA,UAAU,oBAAoB;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../src/lib/path-validation/validators.ts"],"names":[],"mappings":"AAYA,UAAU,oBAAoB;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AA0HD,wBAAsB,4BAA4B,CAChD,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAIjB"}
|
|
@@ -18,12 +18,18 @@ function ensureNoReservedWindowsNames(requestedPath) {
|
|
|
18
18
|
return;
|
|
19
19
|
const segments = requestedPath.split(/[\\/]/);
|
|
20
20
|
for (const segment of segments) {
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
23
|
-
throw new McpError(ErrorCode.E_INVALID_INPUT, `Windows reserved device name not allowed: ${
|
|
21
|
+
const reserved = getReservedDeviceName(segment);
|
|
22
|
+
if (reserved) {
|
|
23
|
+
throw new McpError(ErrorCode.E_INVALID_INPUT, `Windows reserved device name not allowed: ${reserved}`, requestedPath);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
+
function getReservedDeviceName(segment) {
|
|
28
|
+
const baseName = segment.split('.')[0]?.toUpperCase();
|
|
29
|
+
if (!baseName)
|
|
30
|
+
return undefined;
|
|
31
|
+
return RESERVED_DEVICE_NAMES.has(baseName) ? baseName : undefined;
|
|
32
|
+
}
|
|
27
33
|
function ensureWithinAllowedDirectories(normalizedPath, requestedPath, details) {
|
|
28
34
|
if (isPathWithinAllowedDirectories(normalizedPath))
|
|
29
35
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../src/lib/path-validation/validators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQjE,SAAS,kBAAkB,CAAC,aAAqB;IAC/C,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,oCAAoC,EACpC,aAAa,CACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB;IAC9C,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,0BAA0B,EAC1B,aAAa,CACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,aAAqB;IACzD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IAEzC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../src/lib/path-validation/validators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQjE,SAAS,kBAAkB,CAAC,aAAqB;IAC/C,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,oCAAoC,EACpC,aAAa,CACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB;IAC9C,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,0BAA0B,EAC1B,aAAa,CACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,aAAqB;IACzD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IAEzC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,6CAA6C,QAAQ,EAAE,EACvD,aAAa,CACd,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACtD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,SAAS,8BAA8B,CACrC,cAAsB,EACtB,aAAqB,EACrB,OAAiC;IAEjC,IAAI,8BAA8B,CAAC,cAAc,CAAC;QAAE,OAAO;IAE3D,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,wBAAwB,aAAa,kCAAkC,EACvE,aAAa,EACb,OAAO,CACR,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,aAAqB;IAClD,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAClC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACjC,4BAA4B,CAAC,aAAa,CAAC,CAAC;IAC5C,OAAO,aAAa,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,aAAqB,EACrB,mBAA2B;IAE3B,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,YAAoB,EACpB,aAAqB;IAErB,IAAI,KAAY,CAAC;IACjB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,EAAE;QAAE,OAAO;IAEhC,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,oBAAoB,aAAa,EAAE,EACnC,aAAa,CACd,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mCAAmC,CAChD,aAAqB;IAErB,MAAM,mBAAmB,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAEjE,8BAA8B,CAAC,mBAAmB,EAAE,aAAa,EAAE;QACjE,cAAc,EAAE,mBAAmB;KACpC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;IAC3E,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC,8BAA8B,CAAC,cAAc,CAAC,EAAE,CAAC;QACpD,MAAM,sBAAsB,CAAC,aAAa,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IACxE,CAAC;IAED,OAAO;QACL,aAAa,EAAE,mBAAmB;QAClC,YAAY,EAAE,cAAc;QAC5B,SAAS,EACP,sBAAsB,CAAC,mBAAmB,CAAC;YAC3C,sBAAsB,CAAC,cAAc,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,aAAqB;IAErB,OAAO,mCAAmC,CAAC,aAAa,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,mCAAmC,CAAC,aAAa,CAAC,CAAC;IACzE,OAAO,OAAO,CAAC,YAAY,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,mCAAmC,CAAC,aAAa,CAAC,CAAC;IACzE,MAAM,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC,YAAY,CAAC;AAC9B,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { getAllowedDirectories, setAllowedDirectories, setAllowedDirectoriesResolved,
|
|
1
|
+
export { getAllowedDirectories, isPathWithinDirectories, setAllowedDirectories, setAllowedDirectoriesResolved, RESERVED_DEVICE_NAMES, } from './path-validation/allowed-directories.js';
|
|
2
2
|
export { validateExistingPath, validateExistingDirectory, validateExistingPathDetailed, } from './path-validation/validators.js';
|
|
3
3
|
export { getValidRootDirectories } from './path-validation/roots.js';
|
|
4
4
|
//# sourceMappingURL=path-validation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-validation.d.ts","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,6BAA6B,EAC7B,
|
|
1
|
+
{"version":3,"file":"path-validation.d.ts","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { getAllowedDirectories, setAllowedDirectories, setAllowedDirectoriesResolved,
|
|
1
|
+
export { getAllowedDirectories, isPathWithinDirectories, setAllowedDirectories, setAllowedDirectoriesResolved, RESERVED_DEVICE_NAMES, } from './path-validation/allowed-directories.js';
|
|
2
2
|
export { validateExistingPath, validateExistingDirectory, validateExistingPathDetailed, } from './path-validation/validators.js';
|
|
3
3
|
export { getValidRootDirectories } from './path-validation/roots.js';
|
|
4
4
|
//# sourceMappingURL=path-validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-validation.js","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,6BAA6B,EAC7B,
|
|
1
|
+
{"version":3,"file":"path-validation.js","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -149,7 +149,6 @@ export declare const ListDirectoryOutputSchema: z.ZodObject<{
|
|
|
149
149
|
path?: string | undefined;
|
|
150
150
|
suggestion?: string | undefined;
|
|
151
151
|
} | undefined;
|
|
152
|
-
path?: string | undefined;
|
|
153
152
|
summary?: {
|
|
154
153
|
truncated: boolean;
|
|
155
154
|
totalFiles: number;
|
|
@@ -159,6 +158,7 @@ export declare const ListDirectoryOutputSchema: z.ZodObject<{
|
|
|
159
158
|
symlinksNotFollowed?: number | undefined;
|
|
160
159
|
totalEntries?: number | undefined;
|
|
161
160
|
} | undefined;
|
|
161
|
+
path?: string | undefined;
|
|
162
162
|
}, {
|
|
163
163
|
ok: boolean;
|
|
164
164
|
entries?: {
|
|
@@ -175,7 +175,6 @@ export declare const ListDirectoryOutputSchema: z.ZodObject<{
|
|
|
175
175
|
path?: string | undefined;
|
|
176
176
|
suggestion?: string | undefined;
|
|
177
177
|
} | undefined;
|
|
178
|
-
path?: string | undefined;
|
|
179
178
|
summary?: {
|
|
180
179
|
truncated: boolean;
|
|
181
180
|
totalFiles: number;
|
|
@@ -185,6 +184,7 @@ export declare const ListDirectoryOutputSchema: z.ZodObject<{
|
|
|
185
184
|
symlinksNotFollowed?: number | undefined;
|
|
186
185
|
totalEntries?: number | undefined;
|
|
187
186
|
} | undefined;
|
|
187
|
+
path?: string | undefined;
|
|
188
188
|
}>;
|
|
189
189
|
export declare const SearchFilesOutputSchema: z.ZodObject<{
|
|
190
190
|
ok: z.ZodBoolean;
|
|
@@ -312,25 +312,25 @@ export declare const ReadFileOutputSchema: z.ZodObject<{
|
|
|
312
312
|
}>>;
|
|
313
313
|
}, "strip", z.ZodTypeAny, {
|
|
314
314
|
ok: boolean;
|
|
315
|
-
content?: string | undefined;
|
|
316
315
|
error?: {
|
|
317
316
|
code: string;
|
|
318
317
|
message: string;
|
|
319
318
|
path?: string | undefined;
|
|
320
319
|
suggestion?: string | undefined;
|
|
321
320
|
} | undefined;
|
|
321
|
+
content?: string | undefined;
|
|
322
322
|
truncated?: boolean | undefined;
|
|
323
323
|
totalLines?: number | undefined;
|
|
324
324
|
path?: string | undefined;
|
|
325
325
|
}, {
|
|
326
326
|
ok: boolean;
|
|
327
|
-
content?: string | undefined;
|
|
328
327
|
error?: {
|
|
329
328
|
code: string;
|
|
330
329
|
message: string;
|
|
331
330
|
path?: string | undefined;
|
|
332
331
|
suggestion?: string | undefined;
|
|
333
332
|
} | undefined;
|
|
333
|
+
content?: string | undefined;
|
|
334
334
|
truncated?: boolean | undefined;
|
|
335
335
|
totalLines?: number | undefined;
|
|
336
336
|
path?: string | undefined;
|
|
@@ -345,14 +345,14 @@ export declare const ReadMultipleFilesOutputSchema: z.ZodObject<{
|
|
|
345
345
|
error: z.ZodOptional<z.ZodString>;
|
|
346
346
|
}, "strip", z.ZodTypeAny, {
|
|
347
347
|
path: string;
|
|
348
|
-
content?: string | undefined;
|
|
349
348
|
error?: string | undefined;
|
|
349
|
+
content?: string | undefined;
|
|
350
350
|
truncated?: boolean | undefined;
|
|
351
351
|
totalLines?: number | undefined;
|
|
352
352
|
}, {
|
|
353
353
|
path: string;
|
|
354
|
-
content?: string | undefined;
|
|
355
354
|
error?: string | undefined;
|
|
355
|
+
content?: string | undefined;
|
|
356
356
|
truncated?: boolean | undefined;
|
|
357
357
|
totalLines?: number | undefined;
|
|
358
358
|
}>, "many">>;
|
|
@@ -389,8 +389,8 @@ export declare const ReadMultipleFilesOutputSchema: z.ZodObject<{
|
|
|
389
389
|
ok: boolean;
|
|
390
390
|
results?: {
|
|
391
391
|
path: string;
|
|
392
|
-
content?: string | undefined;
|
|
393
392
|
error?: string | undefined;
|
|
393
|
+
content?: string | undefined;
|
|
394
394
|
truncated?: boolean | undefined;
|
|
395
395
|
totalLines?: number | undefined;
|
|
396
396
|
}[] | undefined;
|
|
@@ -409,8 +409,8 @@ export declare const ReadMultipleFilesOutputSchema: z.ZodObject<{
|
|
|
409
409
|
ok: boolean;
|
|
410
410
|
results?: {
|
|
411
411
|
path: string;
|
|
412
|
-
content?: string | undefined;
|
|
413
412
|
error?: string | undefined;
|
|
413
|
+
content?: string | undefined;
|
|
414
414
|
truncated?: boolean | undefined;
|
|
415
415
|
totalLines?: number | undefined;
|
|
416
416
|
}[] | undefined;
|
|
@@ -618,6 +618,7 @@ export declare const SearchContentOutputSchema: z.ZodObject<{
|
|
|
618
618
|
skippedBinary?: number | undefined;
|
|
619
619
|
filesScanned?: number | undefined;
|
|
620
620
|
} | undefined;
|
|
621
|
+
filePattern?: string | undefined;
|
|
621
622
|
basePath?: string | undefined;
|
|
622
623
|
matches?: {
|
|
623
624
|
file: string;
|
|
@@ -627,7 +628,6 @@ export declare const SearchContentOutputSchema: z.ZodObject<{
|
|
|
627
628
|
contextAfter?: string[] | undefined;
|
|
628
629
|
matchCount?: number | undefined;
|
|
629
630
|
}[] | undefined;
|
|
630
|
-
filePattern?: string | undefined;
|
|
631
631
|
}, {
|
|
632
632
|
ok: boolean;
|
|
633
633
|
pattern?: string | undefined;
|
|
@@ -648,6 +648,7 @@ export declare const SearchContentOutputSchema: z.ZodObject<{
|
|
|
648
648
|
skippedBinary?: number | undefined;
|
|
649
649
|
filesScanned?: number | undefined;
|
|
650
650
|
} | undefined;
|
|
651
|
+
filePattern?: string | undefined;
|
|
651
652
|
basePath?: string | undefined;
|
|
652
653
|
matches?: {
|
|
653
654
|
file: string;
|
|
@@ -657,7 +658,6 @@ export declare const SearchContentOutputSchema: z.ZodObject<{
|
|
|
657
658
|
contextAfter?: string[] | undefined;
|
|
658
659
|
matchCount?: number | undefined;
|
|
659
660
|
}[] | undefined;
|
|
660
|
-
filePattern?: string | undefined;
|
|
661
661
|
}>;
|
|
662
662
|
export declare const AnalyzeDirectoryOutputSchema: z.ZodObject<{
|
|
663
663
|
ok: z.ZodBoolean;
|
|
@@ -723,12 +723,12 @@ export declare const AnalyzeDirectoryOutputSchema: z.ZodObject<{
|
|
|
723
723
|
path?: string | undefined;
|
|
724
724
|
suggestion?: string | undefined;
|
|
725
725
|
} | undefined;
|
|
726
|
-
path?: string | undefined;
|
|
727
726
|
summary?: {
|
|
728
727
|
truncated?: boolean | undefined;
|
|
729
728
|
skippedInaccessible?: number | undefined;
|
|
730
729
|
symlinksNotFollowed?: number | undefined;
|
|
731
730
|
} | undefined;
|
|
731
|
+
path?: string | undefined;
|
|
732
732
|
totalFiles?: number | undefined;
|
|
733
733
|
totalDirectories?: number | undefined;
|
|
734
734
|
totalSize?: number | undefined;
|
|
@@ -749,12 +749,12 @@ export declare const AnalyzeDirectoryOutputSchema: z.ZodObject<{
|
|
|
749
749
|
path?: string | undefined;
|
|
750
750
|
suggestion?: string | undefined;
|
|
751
751
|
} | undefined;
|
|
752
|
-
path?: string | undefined;
|
|
753
752
|
summary?: {
|
|
754
753
|
truncated?: boolean | undefined;
|
|
755
754
|
skippedInaccessible?: number | undefined;
|
|
756
755
|
symlinksNotFollowed?: number | undefined;
|
|
757
756
|
} | undefined;
|
|
757
|
+
path?: string | undefined;
|
|
758
758
|
totalFiles?: number | undefined;
|
|
759
759
|
totalDirectories?: number | undefined;
|
|
760
760
|
totalSize?: number | undefined;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+FpE,wBAAsB,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAO1D;AAKD,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAsFD,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,SAAS,CAmBnE;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBlE"}
|
package/dist/server.js
CHANGED
|
@@ -6,7 +6,7 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
|
6
6
|
import { RootsListChangedNotificationSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
7
7
|
import packageJson from '../package.json' with { type: 'json' };
|
|
8
8
|
import { normalizePath } from './lib/path-utils.js';
|
|
9
|
-
import { getAllowedDirectories, getValidRootDirectories, RESERVED_DEVICE_NAMES, setAllowedDirectoriesResolved, } from './lib/path-validation.js';
|
|
9
|
+
import { getAllowedDirectories, getValidRootDirectories, isPathWithinDirectories, RESERVED_DEVICE_NAMES, setAllowedDirectoriesResolved, } from './lib/path-validation.js';
|
|
10
10
|
import { registerAllTools } from './tools/index.js';
|
|
11
11
|
const SERVER_VERSION = packageJson.version;
|
|
12
12
|
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -24,42 +24,57 @@ function validateCliPath(inputPath) {
|
|
|
24
24
|
if (inputPath.includes('\0')) {
|
|
25
25
|
throw new Error('Path contains null bytes');
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
throw new Error(`Reserved device name not allowed: ${basename}`);
|
|
31
|
-
}
|
|
27
|
+
const reserved = getReservedCliDeviceName(inputPath);
|
|
28
|
+
if (reserved) {
|
|
29
|
+
throw new Error(`Reserved device name not allowed: ${reserved}`);
|
|
32
30
|
}
|
|
33
31
|
}
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
function getReservedCliDeviceName(inputPath) {
|
|
33
|
+
if (process.platform !== 'win32')
|
|
34
|
+
return undefined;
|
|
35
|
+
const basename = path.basename(inputPath).split('.')[0]?.toUpperCase();
|
|
36
|
+
if (!basename)
|
|
37
|
+
return undefined;
|
|
38
|
+
return RESERVED_DEVICE_NAMES.has(basename) ? basename : undefined;
|
|
39
|
+
}
|
|
40
|
+
function extractAllowCwd(args) {
|
|
36
41
|
const allowCwdIndex = args.indexOf('--allow-cwd');
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
args.splice(allowCwdIndex, 1);
|
|
42
|
+
if (allowCwdIndex === -1) {
|
|
43
|
+
return { allowCwd: false, rest: args };
|
|
40
44
|
}
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
const rest = [...args];
|
|
46
|
+
rest.splice(allowCwdIndex, 1);
|
|
47
|
+
return { allowCwd: true, rest };
|
|
48
|
+
}
|
|
49
|
+
async function validateDirectoryPath(inputPath) {
|
|
50
|
+
validateCliPath(inputPath);
|
|
51
|
+
const normalized = normalizePath(inputPath);
|
|
52
|
+
try {
|
|
53
|
+
const stats = await fs.stat(normalized);
|
|
54
|
+
if (!stats.isDirectory()) {
|
|
55
|
+
throw new Error(`Error: '${inputPath}' is not a directory`);
|
|
56
|
+
}
|
|
57
|
+
return normalized;
|
|
43
58
|
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (error instanceof Error && error.message.startsWith('Error:')) {
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
throw new Error(`Error: Cannot access directory '${inputPath}'`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function normalizeCliDirectories(args) {
|
|
44
67
|
const validatedDirs = [];
|
|
45
68
|
for (const dir of args) {
|
|
46
|
-
|
|
47
|
-
const normalized = normalizePath(dir);
|
|
48
|
-
try {
|
|
49
|
-
const stats = await fs.stat(normalized);
|
|
50
|
-
if (!stats.isDirectory()) {
|
|
51
|
-
throw new Error(`Error: '${dir}' is not a directory`);
|
|
52
|
-
}
|
|
53
|
-
validatedDirs.push(normalized);
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
if (error instanceof Error && error.message.startsWith('Error:')) {
|
|
57
|
-
throw error;
|
|
58
|
-
}
|
|
59
|
-
throw new Error(`Error: Cannot access directory '${dir}'`);
|
|
60
|
-
}
|
|
69
|
+
validatedDirs.push(await validateDirectoryPath(dir));
|
|
61
70
|
}
|
|
62
|
-
return
|
|
71
|
+
return validatedDirs;
|
|
72
|
+
}
|
|
73
|
+
export async function parseArgs() {
|
|
74
|
+
const argv = process.argv.slice(2);
|
|
75
|
+
const { allowCwd, rest } = extractAllowCwd(argv);
|
|
76
|
+
const allowedDirs = rest.length > 0 ? await normalizeCliDirectories(rest) : [];
|
|
77
|
+
return { allowedDirs, allowCwd };
|
|
63
78
|
}
|
|
64
79
|
let serverOptions = {};
|
|
65
80
|
let rootDirectories = [];
|
|
@@ -72,14 +87,14 @@ function logMissingDirectories(options) {
|
|
|
72
87
|
console.error('The server will not be able to access any files until directories are configured.');
|
|
73
88
|
}
|
|
74
89
|
async function recomputeAllowedDirectories() {
|
|
75
|
-
const cliAllowedDirs = serverOptions.cliAllowedDirs ?? [];
|
|
90
|
+
const cliAllowedDirs = normalizeAllowedDirectories(serverOptions.cliAllowedDirs ?? []);
|
|
76
91
|
const allowCwd = serverOptions.allowCwd === true;
|
|
77
92
|
const allowCwdDirs = allowCwd ? [normalizePath(process.cwd())] : [];
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
]);
|
|
93
|
+
const baseline = [...cliAllowedDirs, ...allowCwdDirs];
|
|
94
|
+
const rootsToInclude = baseline.length > 0
|
|
95
|
+
? await filterRootsWithinBaseline(rootDirectories, baseline)
|
|
96
|
+
: rootDirectories;
|
|
97
|
+
await setAllowedDirectoriesResolved([...baseline, ...rootsToInclude]);
|
|
83
98
|
}
|
|
84
99
|
async function updateRootsFromClient(server) {
|
|
85
100
|
try {
|
|
@@ -90,12 +105,41 @@ async function updateRootsFromClient(server) {
|
|
|
90
105
|
roots.length > 0 ? await getValidRootDirectories(roots) : [];
|
|
91
106
|
}
|
|
92
107
|
catch (error) {
|
|
108
|
+
rootDirectories = [];
|
|
93
109
|
console.error('[DEBUG] MCP Roots protocol unavailable or failed:', error instanceof Error ? error.message : String(error));
|
|
94
110
|
}
|
|
95
111
|
finally {
|
|
96
112
|
await recomputeAllowedDirectories();
|
|
97
113
|
}
|
|
98
114
|
}
|
|
115
|
+
function normalizeAllowedDirectories(dirs) {
|
|
116
|
+
return dirs
|
|
117
|
+
.map((dir) => dir.trim())
|
|
118
|
+
.filter((dir) => dir.length > 0)
|
|
119
|
+
.map(normalizePath);
|
|
120
|
+
}
|
|
121
|
+
async function filterRootsWithinBaseline(roots, baseline) {
|
|
122
|
+
const normalizedBaseline = normalizeAllowedDirectories(baseline);
|
|
123
|
+
const filtered = [];
|
|
124
|
+
for (const root of roots) {
|
|
125
|
+
const normalizedRoot = normalizePath(root);
|
|
126
|
+
if (!isPathWithinDirectories(normalizedRoot, normalizedBaseline)) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const realPath = await fs.realpath(normalizedRoot);
|
|
131
|
+
const normalizedReal = normalizePath(realPath);
|
|
132
|
+
if (!isPathWithinDirectories(normalizedReal, normalizedBaseline)) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
filtered.push(normalizedRoot);
|
|
140
|
+
}
|
|
141
|
+
return filtered;
|
|
142
|
+
}
|
|
99
143
|
export function createServer(options = {}) {
|
|
100
144
|
serverOptions = options;
|
|
101
145
|
const server = new McpServer({
|